Светодиод, кнопка и потенциометр

Ева
Offline
Зарегистрирован: 27.06.2015
Помогите разобраться, в чём ошибка. Нужно что бы светодиод загорался при нажатии кнопки, горел определенное время установленное потенциометром, после чего сам выключался и ждал нового нажатия кнопки.  В дальнейшем предполагается выводить время горения на светодиодную панель.

Сейчас светодиод загорается при нажатии кнопки и гаснет только при нажатии кнопки снова.

  

int switchPin = 2;

int ledPin = 8;

boolean lastButton = LOW;
boolean currentButton = LOW;
boolean ledOn = false;
#define pot A0
void setup() 
{
  pinMode(switchPin, INPUT);
  pinMode(ledPin, OUTPUT);
}
   boolean debounce (boolean last) 
{
  boolean current = digitalRead(switchPin);
  if (last != current)
  { delay(5);
  current = digitalRead(switchPin);
  }
  return current;
 
}
void loop() 
{
    currentButton = debounce(lastButton);
  int x;
  x = analogRead(pot) * 5; 
  if (lastButton == LOW &&  currentButton == HIGH && x > 0.01)
  {
    ledOn = !ledOn;
    digitalWrite(ledPin, HIGH);
    delay(x);
    digitalWrite(ledPin, LOW);
   }
 
    lastButton = currentButton ;
  digitalWrite(ledPin, ledOn);
 }
kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ошибка в 3895 строке.

Использование разных типов при сравнении. Сравнение переменной целого типа со значением 0.01 (отгадайте с трех раз, будет оно выполняться или нет).

Хотя бы для прикола, вывели бы значения, получаемые с потенциометра в монитор и посмотрели значения. Примеры есть в среде ArduinoIDE.

 

Ева
Offline
Зарегистрирован: 27.06.2015

  Спасибо за ответ. 0.01 сменила на 1. Проблема в том, что светодиод выключается только при нажатии кнопки, а должен выключатся сам по истечении времени х.  

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вопрос на засыпку, если x умножается на 5, то какие значения может принимать x? Очевидно 0,5,10,15 и т.д.
Но это все мелочи, условие x > 1 можно смело выкинуть. Все остальное, про что я писал намного важнее.

Ева
Offline
Зарегистрирован: 27.06.2015

Не совсем вас поняла, с ардуино занимаюсь второй вечер…

Этот код работает в принципе нормально, только одна проблема при зажатой кнопке цикл повторяется, как сделать так, что бы цикл запускался после нажатия – отпускания кнопки. 

[code]
int button = 2;
 
int led = 8;
 
#define pot A0
 
void setup() {
 
pinMode(led, OUTPUT);
 
pinMode(button, INPUT);
 
}
 
void loop(){
  int x;
  x = analogRead(pot) * 3;
 
if (digitalRead(button) == HIGH && x > 000.1 ) {
 
digitalWrite(led, HIGH); 
delay(x); 
digitalWrite(led, LOW);
delay(1000);
if (digitalRead(button) == LOW)
{digitalWrite(led, LOW);}
 
}
 
else {
 
digitalWrite(led, LOW);
 
}
 
}
 
[/code]
Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

наверное нужно добавить еще одну переменную которая будет проверять была ли отпущена кнопка или осталась зажата

Ева
Offline
Зарегистрирован: 27.06.2015

Вот в этом и проблема, что и куда добавить???:)

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Вам лень почитать, попробовать запускать примеры, а кто должен за Вас это сделать?

nikolaki
nikolaki аватар
Offline
Зарегистрирован: 14.02.2013

Посмотрите тут . И после нескольких проб ваш вопрос будет снят.Примеров из первого поста для решения вашей проблемы вполне достаточно.

Ева
Offline
Зарегистрирован: 27.06.2015

Спасибо! Всё работает! 

int button = 2;
 
int led = 8;
int flag=0;
#define pot A0
#include <Wire.h>        
#include <LiquidCrystal_I2C.h>
 
 
LiquidCrystal_I2C lcd(0x27,16,2);
 
void setup() {
  
 
pinMode(led, OUTPUT);
 
pinMode(button, INPUT);
 
  lcd.init();                                
  lcd.backlight();                  
 
 
 
}
 
void loop(){
  int x;
  x = analogRead(pot) * 2;
  int y;
  y=x;
  lcd.setCursor(0, 0);              
  lcd.print("Time impulse");     
  lcd.setCursor(5, 1);  
  lcd.print("mSec.");
  lcd.setCursor(0, 1);             
  lcd.print(y);  
 
if (digitalRead(button) == HIGH && x > 0.01 && flag == 0 )
 
 
 
 
{
  digitalWrite(8,!digitalRead(8));
 
delay(x); 
digitalWrite(led, LOW);
flag=1;
}
if (digitalRead(button) == HIGH && flag == 1)
{digitalWrite(led, LOW);
 
 }
 
if (digitalRead(button) == LOW && flag == 1)
flag=0;
}
}
 
Kolchugin
Offline
Зарегистрирован: 15.12.2013

Может быть моё сообщение совсем не в тему, но я вам завидую Ева!
За 2 дня вы очень хорошо продвинулись в изучении ардуино, вон уже и дисплей по i2c подключили...