так и не удалось у меня сделать что хотел . Счетчик идет только при нажатие и , то если нажать 2 раза . А хотелось бы при включение ардуино счетчик шел и при 1 нажатие на кнопку останавливался ну соответсвено при нажатие еще раз он продолжался . мне уже помогали и даже написали сам код http://forum.amperka.ru/threads/ЭТО-ПРОСТО.11382/#post-110293 . но чет не очень у меня получилось его доделать . PS может кто поможет Код (C++): const int BUTTON=5; // Контакт 5 для подключения кнопки int code = 0; boolean enableCounter; int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния void setup() { Serial.begin(9600); pinMode(BUTTON, INPUT_PULLUP); enableCounter = true; } void loop () { tekButton=digitalRead(BUTTON); if (tekButton == HIGH && prevButton == LOW) { enableCounter = !enableCounter; // меняем состояние переменной на противоположное if (true == enableCounter) // если отсчет разрешен { code++; // увеличиваем счетчик if (code >= 60) code = 0; // пограничные условия Serial.println(code); delay(10); } } prevButton=tekButton; }
Получается так: загрузил код, открываю сериал - счётчик не идёт , нажимаю и держу кнопку - счётчик идёт , опять отпускаю не идёт . Хотелось чтобы при нажатие он оставливался и при повторном нажатие он продолжался
Код (C++): const int BUTTON=5; // Контакт 5 для подключения кнопки int code = 0; boolean enableCounter; int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния void setup() { Serial.begin(9600); pinMode(BUTTON, INPUT_PULLUP); enableCounter = true; } void loop () { tekButton=digitalRead(BUTTON); if (tekButton == HIGH && prevButton == LOW) { while{ enableCounter = !enableCounter; // меняем состояние переменной на противоположное if (true == enableCounter) // если отсчет разрешен { code++; // увеличиваем счетчик if (code >= 60) code = 0; // пограничные условия Serial.println(code); delay(10); }else{ if(tekButton == LOW && prevButton == HIGH){ while{ !enableCounter = enableCounter if(tekButton == HIGH && prevButton == LOW){ code++; // увеличиваем счетчик if (code >= 60) code = 0; // пограничные условия Serial.println(code); delay(10); } } } prevButton=tekButton; }
Код (C++): #define BUTTON_PIN 5 boolean buttonWasUp = true; int code = 0; boolean enableCounter; void setup(){ pinMode(BUTTON_PIN, INPUT_PULLUP); Serial.begin(9600); enableCounter = true; } void loop(){ boolean buttonIsp = digitalRead(BUTTON_PIN); if(buttonWasUp && buttonIsUp){ delay(10); buttonIsUp = digitalRead(BUTTON_PIN); if(!buttonIsUp){ enableCounter = !enableCounter; // меняем состояние переменной на противоположное if (true == enableCounter) // если отсчет разрешен { code++; // увеличиваем счетчик if (code >= 60) code = 0; // пограничные условия Serial.println(code); delay(10); } } } buttonWasUp = buttonIsUp ; }
Так не проще (при условии, что нажатие кнопки = HIGH)? Код (C++): void loop () { if (digitalRead(BUTTON) == HIGH) { enableCounter = !enableCounter; } if (enableCounter) { Serial.println(code); (code < 59) ? code++ : code = 0; delay(10); } }
Мне кажется сие работать не будет. Потому как счетчик находится внутри IF который срабатывает только в момент нажатия. Надо бы поправить. А что считаем - то?
Ваша правда, не заметил. Тогда может быть так? Код (C++): void loop () { tekButton = digitalRead(BUTTON); if (tekButton == HIGH) && (prevButton == LOW)) { enableCounter = !enableCounter; } prevButton = tekButton; if (enableCounter) { Serial.println(code); (code < 59) ? code++ : code = 0; delay(10); } }
Код (C++): const int BUTTON=5; // Контакт 5 для подключения кнопки int code = 0; boolean enableCounter; int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния void setup() { Serial.begin(9600); pinMode(BUTTON, INPUT); enableCounter = true; } void loop () { tekButton = digitalRead(BUTTON); if (tekButton == HIGH) && (prevButton == LOW)) { enableCounter = !enableCounter; } prevButton = tekButton; if (enableCounter) { Serial.println(code); (code < 59) ? code++ : code = 0; delay(10); } }
он теперь ругается на Arduino: 1.8.1 (Windows 10), Плата:"Arduino Nano, ATmega328" C:\Users\PC\AppData\Local\Temp\arduino_modified_sketch_95477\sketch_mar30a.ino: In function 'void loop()': sketch_mar30a:16: error: expected identifier before '(' token if (tekButton == HIGH) && (prevButton == LOW)) { ^ exit status 1 expected identifier before '(' token Этот отчёт будет иметь больше информации с включенной опцией Файл -> Настройки -> "Показать подробный вывод во время компиляции" не могу понять почему
не выходит(((( хочу сделать что бы при определенном значение мигал светодиод не могу понять как повторно крутить ( if ) Код (C++): const int BUTTON=5; // Контакт 5 для подключения кнопки int code = 0; boolean enableCounter; int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния #define ledcashPin_1 10 //индикатор что идет отчет void setup() { Serial.begin(9600); pinMode(BUTTON, INPUT); enableCounter = true; pinMode(ledcashPin_1, OUTPUT); //индикатор что идет отчет } void loop () { tekButton = digitalRead(BUTTON); if ((tekButton == HIGH) && (prevButton == LOW)) { enableCounter = !enableCounter; } prevButton = tekButton; if (enableCounter) { Serial.println(code); (code < 43200) ? code++ : code = 0; if (code==100 && 300 && 600 && 900 && 1200) // индикация { digitalWrite(ledcashPin_2, LOW); } else if (code==500 && 400 && 700 && 900 && 1200) digitalWrite(ledcashPin_2, HIGH); } }
Неправильно: Код (C++): code==100 && 300 && 600 && 900 && 1200 Правильно: Код (C++): (code==100) || (code==300) || (code==600) || (code==900) || (code==1200)