значит я все таки не понял если было 11 и стало 01 - светодиод должен тут же погаснуть? а если было 10 и стало 00 - светодиод погаснет через 10 секунд? или как?
00 -> 10 светодиод загорелся прошло 3 секунды 10 -> 00 прошло 7 секунд светодиод погас. так? а если 11 -> 01 то гаснет мгновенно?
код у меня такой но не работает. Код (C++): int BUTTON1_PIN = 9; int BUTTON2_PIN = 10; int LED_PIN = 11; int timer; bool button1 = digitalRead(BUTTON1_PIN); //считываются состояния кнопок и лампочки bool button2 = digitalRead(BUTTON2_PIN); bool led = digitalRead(LED_PIN); bool button1_on; //флаг нажатия кнопки 1 void setup(){ pinMode(BUTTON1_PIN, INPUT); pinMode(BUTTON2_PIN, INPUT); pinMode(LED_PIN, OUTPUT); } void loop() { if(button1 && !button1_on) { //если кнопка1 нажата, но флаг что она была нажата не стоит button1_on = 1; //ставим флаг что кнопка нажата delay(20); //ждем 20мс чтоб дребезг ушел button1 = digitalRead(BUTTON1_PIN); //проверяем нажата ли кнопка все еще if(button1){ //если таки нажата timer = millis(); //засекаем текущее время, т.к. в изначальном условии есть флаг - //оно засечется только в момент нажатия на кнопку if(!led){digitalWrite(LED_PIN,HIGH);} //если лампочка не горит, то зажигаем ее }} if(!button1 && button1_on) {button1_on=0; digitalWrite(LED_PIN,LOW);} // если кнопка отжата - снимаем флаг нажатия кнопки //и отключаем лампочку if(button2 && led){ //а тут тупо каждый цикл пока зажата кнопка 2 при горящем леде timer = millis(); //будет обновляться время в таймере } if(led && millis()-timer>10000){ // если лампочка горит и время не обновлялось более 10с digitalWrite(LED_PIN,LOW); //выключаем лампочку } }
не работает в каком смысле? не компилируется? что пишет при этом? или компилируется, но на кнопки реагирует неправильно?
так ты считывание состояний кнопок из цикла убрал конечно Код (C++): int BUTTON1_PIN = 9; int BUTTON2_PIN = 10; int LED_PIN = 11; unsigned long timer; bool button1; //переменные состояний кнопок и леда bool button2; bool led; bool button1_on; //флаг нажатия кнопки 1 void setup(){ pinMode(BUTTON1_PIN, INPUT); pinMode(BUTTON2_PIN, INPUT); pinMode(LED_PIN, OUTPUT); } void loop() { button1 = digitalRead(BUTTON1_PIN); //считываются состояния кнопок и лампочки button2 = digitalRead(BUTTON2_PIN); led = digitalRead(LED_PIN); if(button1 && !button1_on) { //если кнопка1 нажата, но флаг что она была нажата не стоит button1_on = 1; //ставим флаг что кнопка нажата delay(20); //ждем 20мс чтоб дребезг ушел button1 = digitalRead(BUTTON1_PIN); //проверяем нажата ли кнопка все еще if(button1){ //если таки нажата timer = millis(); //засекаем текущее время, т.к. в изначальном условии есть флаг - //оно засечется только в момент нажатия на кнопку if(!led){digitalWrite(LED_PIN,HIGH);} //если лампочка не горит, то зажигаем ее }} if(!button1 && button1_on) {button1_on=0; digitalWrite(LED_PIN,LOW);} // если кнопка отжата - снимаем флаг нажатия кнопки //и отключаем лампочку if(button2 && led){ //а тут тупо каждый цикл пока зажата кнопка 2 при горящем леде timer = millis(); //будет обновляться время в таймере } if(led && millis()-timer>10000){ // если лампочка горит и время не обновлялось более 10с digitalWrite(LED_PIN,LOW); //выключаем лампочку } } кстати, а номера пинов в переменных принципиально? обычно это дефайнами делается
нет не принципиально,можем и define - ом. первая часть отлично работает - если кнопка1 нажата более 10сек светодиод выключается. но надо что когда кноопка1 нажата более 10сек и светодиод выключен,при паралелном нажатии конпка2 включился светодиод.и после этого если отжали кнопка2 (но кнопка1 все же нажата) светодиод пусть выключится после 10сек
вот так вроде должно работать Код (C++): int BUTTON1_PIN = 9; int BUTTON2_PIN = 10; int LED_PIN = 11; unsigned long timer; bool button1; //переменный состояний кнопок и леда bool button2; bool led; bool button1_on; //флаг нажатия кнопки 1 void setup(){ pinMode(BUTTON1_PIN, INPUT); pinMode(BUTTON2_PIN, INPUT); pinMode(LED_PIN, OUTPUT); } void loop() { button1 = digitalRead(BUTTON1_PIN); //считываются состояния кнопок и лампочки button2 = digitalRead(BUTTON2_PIN); led = digitalRead(LED_PIN); if(button1 && !button1_on) { //если кнопка1 нажата, но флаг что она была нажата не стоит button1_on = 1; //ставим флаг что кнопка нажата delay(20); //ждем 20мс чтоб дребезг ушел button1 = digitalRead(BUTTON1_PIN); //проверяем нажата ли кнопка все еще if(button1){ //если таки нажата timer = millis(); //засекаем текущее время, т.к. в изначальном условии есть флаг - //оно засечется только в момент нажатия на кнопку if(!led){digitalWrite(LED_PIN,HIGH);} //если лампочка не горит, то зажигаем ее }} if(!button1 && button1_on) {button1_on=0; digitalWrite(LED_PIN,LOW);} // если кнопка отжата - снимаем флаг нажатия кнопки //и отключаем лампочку if(button2 && led){ //а тут тупо каждый цикл пока зажата кнопка 2 при горящем леде timer = millis(); //будет обновляться время в таймере } if(button2 && button1 && !led){ //если кнупку2 нажали при удерживаемой 1 и потухшем леде delay(20); //типа дребезг button2 = digitalRead(BUTTON2_PIN); //проверяем кнопку2 if(button2){ //если нажата digitalWrite(LED_PIN,HIGH); timer = millis(); //подрубаем светодиод и засекаем время }} if(led && millis()-timer>10000){ // если лампочка горит и время не обновлялось более 10с digitalWrite(LED_PIN,LOW); //выключаем лампочку } } тупо добавлено что при удерживаемой кнопке 1 но потухшем диоде при нажатии кнопки 2 происходит зажигание светодиода и далее все то же с таймером по циклу и все таки, что за секретный проект, в котором нужны такие странные кнопки? о опечатка была в строчке button2 = digitalRead(BUTTON2_PIN); //проверяем кнопку2 короче лучше не копипастить, а делать самому, принцип то понятен и прост - следим за состоянием кнопок и лампочки, и в зависимости от совпадения комбинаций этих состояний делаем разное.
если для консультирования, то не стоит, т.к. я не шарю в программировании - лучше нанять кого-то опытного. а если проект настолько секретный, что про него на форуме писать нельзя, то лучше и меня не посвящать, а то еще придут люди в черном и скажут что это не светодиод мигал, а взрыв газа