Переключение режимов светодиодов
- Войдите на сайт для отправки комментариев
Сб, 30/05/2015 - 15:31
int knopka = 2;
int diod1 = 13;
int diod2 = 12;
int diod3 = 11;
int diod4 = 10;
boolean svet = LOW;
boolean posl = false;
void setup()
{
pinMode(knopka, INPUT);
pinMode(diod1, OUTPUT);
pinMode(diod2, OUTPUT);
pinMode(diod3, OUTPUT);
pinMode(diod4, OUTPUT);
}
void loop()
{
delay(5);
if (digitalRead(knopka)==HIGH&&posl==LOW)
{
svet=!svet;
posl=HIGH;
if(svet>3)
{
svet=1;
}
}
if(digitalRead(knopka)==LOW&&posl==HIGH)
{
posl=LOW;
}
if(svet==1)
{
digitalWrite(diod1,LOW);
digitalWrite(diod2,LOW);
digitalWrite(diod3,LOW);
digitalWrite(diod4,LOW);
}
if(svet==2)
{
digitalWrite(diod1,HIGH);
digitalWrite(diod2,HIGH);
}
if(svet==3)
{
digitalWrite(diod3,HIGH);
digitalWrite(diod4,HIGH);
}
}
Добрый день! Подскажите, пожалуйста, где ошибка в коде. Программирование на ардуино только начал осваивать, еще совсем новичек!
Алгоритм, примерно, такой: При нажатии на кнопку должна включаться первая программа(все светодиоды погашены). При последующем нажатии должна включиться вторая программа (загореться диоды на 13 и 12 порту), затем, при третьем нажатии, третья (загореться диоды на 11 и 10 портах), но при нажатии на кнопку ничего не происходит! Помогите, пожалуйста, разобраться в чем проблема!
Принципиальную схему прилагаю
Код в самом верху
#define pin_knopka 2 #define pin_diod1 13 #define pin_diod2 12 #define pin_diod3 11 #define pin_diod4 10 byte state = 0; // текущее состояние: 0 - все выкл, 1 - вкл 12 и 13, 2 - вкл 10 и 11 void setup() { pinMode(pin_knopka, INPUT); pinMode(pin_diod1, OUTPUT); pinMode(pin_diod2, OUTPUT); pinMode(pin_diod3, OUTPUT); pinMode(pin_diod4, OUTPUT); } void loop() { boolean keyPress = digitalRead(pin_knopka); // читаем кнопку if (keyPress) // если кнопка нажата { state++; // увеличиваем state на 1 delay(20); // защита от дребезга } switch (state) // смотрим что в state { case 0: { digitalWrite(pin_diod1,LOW); digitalWrite(pin_diod2,LOW); digitalWrite(pin_diod3,LOW); digitalWrite(pin_diod4,LOW); break; } case 1: { digitalWrite(pin_diod1,HIGH); digitalWrite(pin_diod2,HIGH); digitalWrite(pin_diod3,LOW); digitalWrite(pin_diod4,LOW); break; } case 2: { digitalWrite(pin_diod1,LOW); digitalWrite(pin_diod2,LOW); digitalWrite(pin_diod3,HIGH); digitalWrite(pin_diod4,HIGH); break; } default: // если ни одно из перечисленных { state = 0; } } // конец switch } // конец loopОгромное, Вам, спасибо!
А можно как-то сделать, чтоб при зажатии кнопки, светодиоды не мигали?
вместо
нужно
дык по коду они у вас и не мигают)))
дык по коду они у вас и не мигают)))
Как по мне то при нажатой кнопке они будут мигать с частотой delay(20)
Чтобы не мигали нужно вносить дополнительную проверку
ну если вы такую частоту мигания видите, то сделайте антидребезг без делеев и всё)))
Не антидребезг нужен, а фронт нажатия ловить.
За основу можно взять это. http://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-...
Без дополнителних библиотек.
Но я бы сделал по другому, проще и нагляднее. Но понадобится библиотека
Можно сделать както так чтобы переключалось только при очередном нажатии
#define pin_knopka 2 #define pin_diod1 13 #define pin_diod2 12 #define pin_diod3 11 #define pin_diod4 10 byte state = 0; // текущее состояние: 0 - все выкл, 1 - вкл 12 и 13, 2 - вкл 10 и 11 void setup() { pinMode(pin_knopka, INPUT); pinMode(pin_diod1, OUTPUT); pinMode(pin_diod2, OUTPUT); pinMode(pin_diod3, OUTPUT); pinMode(pin_diod4, OUTPUT); } void loop() { boolean keyPress = digitalRead(pin_knopka); // читаем кнопку boolean Flag_keyPress = 0; //Добавляем флаг нажатия кнопки if(keyPressed==0) Flag_keyPress=0; //Кнопка 0 - исходная if (keyPress==1 && Flag_keyPress==0) // если кнопка нажата { state++; // увеличиваем state на 1 delay(20); // защита от дребезга Flag_keyPress = 1;//Фиксируем нажатие 1 раз } switch (state) // смотрим что в state { case 0: { digitalWrite(pin_diod1,LOW); digitalWrite(pin_diod2,LOW); digitalWrite(pin_diod3,LOW); digitalWrite(pin_diod4,LOW); break; } case 1: { digitalWrite(pin_diod1,HIGH); digitalWrite(pin_diod2,HIGH); digitalWrite(pin_diod3,LOW); digitalWrite(pin_diod4,LOW); break; } case 2: { digitalWrite(pin_diod1,LOW); digitalWrite(pin_diod2,LOW); digitalWrite(pin_diod3,HIGH); digitalWrite(pin_diod4,HIGH); break; } default: // если ни одно из перечисленных { state = 0; } } // конец switch } // конец loopкакой смысл в строке 26? Дальше нигде не используется, а в следующем цикле переменная обнуляется.
Когда мы устанавливаем "Flag_keyPress = 1;" больше 22 строчка "if (keyPress==1 && Flag_keyPress==0) // если кнопка нажата"
не срабатывает и state++; остается неизменным пока не отпустим кнопку, строчка 21
ВСЕ большое спасибо!!!
Вот какой у меня, в итоге, получился код
Уважаемые, подскажите, пожалуйста, пользовался кто-то микросхемой 74HC595? Стоит ее покупать для увеличения портов, что бы подключить большее кол-во светодиодов?
#define pin_knopka 2 #define pin_diod1 13 #define pin_diod2 12 #define pin_diod3 11 #define pin_diod4 10 byte regim = 0; void setup() { pinMode(pin_knopka, INPUT); pinMode(pin_diod1, OUTPUT); pinMode(pin_diod2, OUTPUT); pinMode(pin_diod3, OUTPUT); pinMode(pin_diod4, OUTPUT); } void loop() { boolean key = digitalRead(pin_knopka); boolean Flag_key = 0; if(key==0) Flag_key=0; if (key==1 && Flag_key==0) { regim++; delay(175); Flag_key = 1; } switch(regim) { case 0: { digitalWrite(pin_diod1,LOW); digitalWrite(pin_diod2,LOW); digitalWrite(pin_diod3,LOW); digitalWrite(pin_diod4,LOW); break; } case 1: { digitalWrite(pin_diod1,HIGH); delay(100); digitalWrite(pin_diod2,HIGH); delay(100); digitalWrite(pin_diod3,HIGH); delay(100); digitalWrite(pin_diod4,HIGH); delay(100); digitalWrite(pin_diod1,LOW); delay(100); digitalWrite(pin_diod2,LOW); delay(100); digitalWrite(pin_diod3,LOW); delay(100); digitalWrite(pin_diod4,LOW); delay(100); break; } case 2: { digitalWrite(pin_diod4,HIGH); delay(100); digitalWrite(pin_diod3,HIGH); delay(100); digitalWrite(pin_diod2,HIGH); delay(100); digitalWrite(pin_diod1,HIGH); delay(100); digitalWrite(pin_diod1,LOW); delay(100); digitalWrite(pin_diod2,LOW); delay(100); digitalWrite(pin_diod3,LOW); delay(100); digitalWrite(pin_diod4,LOW); delay(100); break; } default: // если ни одно из перечисленных { regim = 0; } } // конец switch } // конец loopvosara, в строке 26 мы устанавливаем Flag_keyPress = 1
Дальше по завершении цикла заново переходим к строке 17. Так вот в этот момент Flag_keyPress ВСЕГДА становится равным нулю, потому как это была локальная переменная.
Кстати, в строке 21 есть несуществующая переменная Flag_keyPressed.
Да верно надо выносить с loop или ставить static
недосмотрел!!
Если не сложно, не могди бы Вы, написать как теперь будет выглядеть код? Очень хочеться довести до совершенства и разобраться
Не проверял но должно быть так:
#define pin_knopka 2 #define pin_diod1 13 #define pin_diod2 12 #define pin_diod3 11 #define pin_diod4 10 byte regim = 0; bool Flag_key = 0; void setup() { pinMode(pin_knopka, INPUT); pinMode(pin_diod1, OUTPUT); pinMode(pin_diod2, OUTPUT); pinMode(pin_diod3, OUTPUT); pinMode(pin_diod4, OUTPUT); } void loop() { boolean key = digitalRead(pin_knopka); if(key==0) Flag_key=0; if (key==1 && Flag_key==0) { regim++; delay(175); Flag_key = 1; } switch(regim) { case 0: { digitalWrite(pin_diod1,LOW); digitalWrite(pin_diod2,LOW); digitalWrite(pin_diod3,LOW); digitalWrite(pin_diod4,LOW); break; } case 1: { digitalWrite(pin_diod1,HIGH); delay(100); digitalWrite(pin_diod2,HIGH); delay(100); digitalWrite(pin_diod3,HIGH); delay(100); digitalWrite(pin_diod4,HIGH); delay(100); digitalWrite(pin_diod1,LOW); delay(100); digitalWrite(pin_diod2,LOW); delay(100); digitalWrite(pin_diod3,LOW); delay(100); digitalWrite(pin_diod4,LOW); delay(100); break; } case 2: { digitalWrite(pin_diod4,HIGH); delay(100); digitalWrite(pin_diod3,HIGH); delay(100); digitalWrite(pin_diod2,HIGH); delay(100); digitalWrite(pin_diod1,HIGH); delay(100); digitalWrite(pin_diod1,LOW); delay(100); digitalWrite(pin_diod2,LOW); delay(100); digitalWrite(pin_diod3,LOW); delay(100); digitalWrite(pin_diod4,LOW); delay(100); break; } default: // если ни одно из перечисленных { regim = 0; } } // конец switch } // конец loopНе проверял но должно быть так:
#define pin_knopka 2 #define pin_diod1 13 #define pin_diod2 12 #define pin_diod3 11 #define pin_diod4 10 byte regim = 0; bool Flag_key = 0; void setup() { pinMode(pin_knopka, INPUT); pinMode(pin_diod1, OUTPUT); pinMode(pin_diod2, OUTPUT); pinMode(pin_diod3, OUTPUT); pinMode(pin_diod4, OUTPUT); } void loop() { boolean key = digitalRead(pin_knopka); if(key==0) Flag_key=0; if (key==1 && Flag_key==0) { regim++; delay(175); Flag_key = 1; } switch(regim) { case 0: { digitalWrite(pin_diod1,LOW); digitalWrite(pin_diod2,LOW); digitalWrite(pin_diod3,LOW); digitalWrite(pin_diod4,LOW); break; } case 1: { digitalWrite(pin_diod1,HIGH); delay(100); digitalWrite(pin_diod2,HIGH); delay(100); digitalWrite(pin_diod3,HIGH); delay(100); digitalWrite(pin_diod4,HIGH); delay(100); digitalWrite(pin_diod1,LOW); delay(100); digitalWrite(pin_diod2,LOW); delay(100); digitalWrite(pin_diod3,LOW); delay(100); digitalWrite(pin_diod4,LOW); delay(100); break; } case 2: { digitalWrite(pin_diod4,HIGH); delay(100); digitalWrite(pin_diod3,HIGH); delay(100); digitalWrite(pin_diod2,HIGH); delay(100); digitalWrite(pin_diod1,HIGH); delay(100); digitalWrite(pin_diod1,LOW); delay(100); digitalWrite(pin_diod2,LOW); delay(100); digitalWrite(pin_diod3,LOW); delay(100); digitalWrite(pin_diod4,LOW); delay(100); break; } default: // если ни одно из перечисленных { regim = 0; } } // конец switch } // конец loopБольшое спасибо! Все работает прекрасно! Вы не пробовали, когда-то, использовать микросхему 74hc595? Стоит ее покупать для увеличения портов?