если проще разве что так Код (C++): #define upPin 2 int m = 1; int p1 = 0; void setup() { Serial.begin(115200); pinMode(upPin, INPUT_PULLUP); // подключаем кнопку через внутренний резистор } void loop() { const int longTimeClick = 500; static unsigned long previous_millis; static unsigned long lastSwitchTime; static bool Click_One = false; bool buttonUpWas = true; bool buttonUpIs = digitalRead(upPin); // Обработка нажатия для параметра p1 + if (buttonUpWas && !buttonUpIs) { delay(10); buttonUpIs = digitalRead(upPin); if (!buttonUpIs && m == 1) { if (Click_One == buttonUpIs) { lastSwitchTime = millis(); Click_One = !buttonUpIs; p1++; } // lcd.backlight(); // TimeLCDOff = currentTime; if ((millis() - lastSwitchTime) >= longTimeClick) { p1++; delay (100); } if (p1 > 100) { p1 = 0; } // delay (100); // lcd.setCursor(5, 1);//очистка предыдущего параметра // lcd.print(" "); // menu(); } else Click_One = !buttonUpIs; } Serial.println(p1) ; }
внесите изменения во весь код где требуется сея таймер ,меня смущает переменная Click_One как она себя будет вести возможен конфликт ...
Опять переменная как самостоятельная растет сама пока кнопку не нажмешь вроде по логике инвертирование стоит как надо?
в распределении памяти, обычная переменяя объявленная внутри функции каждый раз при вызове последней будет занимать новую ячейку памяти и при выходе будет уничтожена ,статическая переменная будет помечена как глобальная но видна будет только там где её объявили! я вроде постарался под ваш проект подстроиться !у вас при нажатии 0 возвращаеться?
Странно мой код в Serial.println(p1) ; выдает то же самое но переменная меняется при отпускании кнопки а в вашем варианте переменная наоборот пока держишь кнопку зажатой все нормально как только отпускаешь начинает прибавляться
Уже решил вставить ту часть кода которая работает с меню Код (C++): #include <Wire.h> #include <LiquidCrystal_I2C.h> #define autoOFF 10 // кол-во секунд через которое выключается подсветка дисплея при бездействии LiquidCrystal_I2C lcd(0x20, 16, 2); // установка I2C адреса LCD в 0x27, а также указываем что 16 символов, 2 строки //int pos = 0; // текущая позиция (0 - установка, 1 - работа) int interval = 0; unsigned long currentTime; unsigned long TimeLCDOff; unsigned long flagTime; int m = 0; // переменная для экранов меню int p1 = 0; int p2 = 0; int p3 = 0; #define BL 3 #define plusPin 6 #define minusPin 10 #define upPin 8 #define downPin 7 #define EterPin 12 #define ledPin 13 boolean buttonPlusWas = true; boolean buttonMinusWas = true; //boolean buttonUpWas = true; boolean buttonDownWas = true; boolean buttonEterWas = true; boolean working = false; //boolean ledEnabled = false; void setup() { pinMode(plusPin, INPUT); pinMode(minusPin, INPUT); pinMode(upPin, INPUT); pinMode(downPin, INPUT); pinMode(EterPin, INPUT); pinMode(BL, OUTPUT); pinMode(ledPin, OUTPUT); lcd.init(); // инициализация LCD lcd.backlight(); // включаем подсветку for (int i = 0; i <= 255; i++) { analogWrite(BL, i); delay(5); } delay (500); } void loop() { const int longTimeClick = 500; static unsigned long previous_millis; static unsigned long lastSwitchTime; static bool Click_One = true; bool buttonUpWas = true; // bool buttonUpIs = digitalRead(upPin); boolean buttonPlusIs = digitalRead(plusPin); boolean buttonMinusIs = digitalRead(minusPin); boolean buttonUpIs = digitalRead(upPin); boolean buttonDownIs = digitalRead(downPin); boolean buttonEterIs = digitalRead(EterPin); //================================================ if (working == false) { if (buttonEterWas && !buttonEterIs) { delay(10); buttonEterIs = digitalRead(EterPin); if (!buttonEterIs && m == 0) { lcd.backlight(); TimeLCDOff = currentTime; working = true; } } //Обработка нажатия кнопки меню if (buttonPlusWas && !buttonPlusIs) { delay(10); buttonPlusIs = digitalRead(plusPin); if (!buttonPlusIs) { lcd.backlight(); TimeLCDOff = currentTime; m++; if (m > 3) { m = 0; } delay(100); lcd.clear(); menu(); } } //Обработка нажатия кнопки назад if (buttonMinusWas && !buttonMinusIs) { delay(10); buttonMinusIs = digitalRead(minusPin); if (!buttonMinusIs) { lcd.backlight(); TimeLCDOff = currentTime; m--; if (m < 0) { m = 3; } delay(100); lcd.clear(); menu(); } } // Обработка нажатия для параметра p1 + if (buttonUpWas && !buttonUpIs) { delay(10); buttonUpIs = digitalRead(upPin); if (!buttonUpIs && m == 1) { if (Click_One == buttonUpIs) { lastSwitchTime = millis(); Click_One = !buttonUpIs; p1++; } lcd.backlight(); TimeLCDOff = currentTime; if ((millis() - lastSwitchTime) >= longTimeClick) { p1++; // delay (100); } if (p1 > 100) { p1 = 0; } delay (100); lcd.setCursor(5, 1);//очистка предыдущего параметра lcd.print(" "); menu(); } else Click_One = !buttonUpIs; } // Обработка нажатия для параметра p1 - if (buttonDownWas && !buttonDownIs) { delay(10); buttonDownIs = digitalRead(downPin); if (!buttonDownIs && m == 1) { lcd.backlight(); TimeLCDOff = currentTime; p1--; if (p1 < 0) { p1 = 100; } delay (100); lcd.setCursor(5, 1);//очистка предыдущего параметра lcd.print(" "); menu(); } } // Обработка нажатия для параметра р2 + if (buttonUpWas && !buttonUpIs) { delay(10); buttonUpIs = digitalRead(upPin); if (!buttonUpIs && m == 2) { lcd.backlight(); TimeLCDOff = currentTime; p2++; if (p2 > 10) { p2 = 0; } delay (100); lcd.setCursor(5, 1);//очистка предыдущего параметра lcd.print(" "); menu(); } } // Обработка нажатия для параметра р2 - if (buttonDownWas && !buttonDownIs) { delay(10); buttonDownIs = digitalRead(downPin); if (!buttonDownIs && m == 2) { lcd.backlight(); TimeLCDOff = currentTime; p2--; if (p2 < 0) { p2 = 10; } delay (100); lcd.setCursor(5, 1); lcd.print(" "); menu(); } } // Обработка нажатия для параметра р3 + if (buttonUpWas && !buttonUpIs) { delay(10); buttonUpIs = digitalRead(upPin); if (!buttonUpIs && m == 3) { lcd.backlight(); TimeLCDOff = currentTime; // ledEnabled = !ledEnabled; // digitalWrite(ledPin, ledEnabled); // p3 = ledEnabled; menu(); } } // Обработка нажатия для параметра р3 - if (buttonDownWas && !buttonDownIs) { delay(10); buttonDownIs = digitalRead(downPin); if (!buttonDownIs && m == 3) { lcd.backlight(); TimeLCDOff = currentTime; menu(); } } } //======================================================================= currentTime = millis(); // считываем время, прошедшее с момента запуска программы if (working == true) { show_work(); digitalWrite(ledPin, HIGH); // моргнем встроенным LED delay(100); digitalWrite(ledPin, LOW); //================================================== if (buttonEterWas && !buttonEterIs) { delay(10); buttonEterIs = digitalRead(upPin); if (!buttonEterIs && working == true )//&& m == 0 { lcd.backlight(); // включаем подсветку TimeLCDOff = currentTime; // в TimeLCDOff записываем новое значение m = 0; working = false; // прерываем режим "работа" menu(); // если были в рабочем режиме, то прерываем } } } if (currentTime >= (TimeLCDOff + (autoOFF * 1000))) { lcd.noBacklight(); } buttonUpWas = buttonUpIs; buttonDownWas = buttonDownIs; buttonPlusWas = buttonPlusIs; buttonMinusWas = buttonMinusIs; buttonEterWas = buttonEterIs; //end loop } //================================================================== void menu() { working = false; if (m == 0) { lcd.setCursor(0, 0); lcd.print( "Main Menu" ); } else if (m == 1) { lcd.setCursor(0, 0); lcd.print( "Parametr-1" ); lcd.setCursor(0, 1); lcd.print( "P1 = " ); lcd.print(p1); } else if (m == 2) { lcd.setCursor(0, 0); lcd.print( "Parametr-2" ); lcd.setCursor(0, 1); lcd.print( "P2 = " ); lcd.print(p2); } else if (m == 3) { lcd.setCursor(0, 0); lcd.print( "LED Control" ); lcd.setCursor(0, 1); lcd.print( "LED = " ); lcd.print(p3); } } void show_work() { lcd.clear(); lcd.setCursor(1, 0); lcd.print("work"); // lcd.setCursor(4, 1); //lcd.print("L=setup R=start"); // m = 0; working = true; }
Все заработало причем все нормально Click_One вроде не заметно чтоб конфликтовал Придется две кнопки делать по другой схеме.
Понятно переделал именно эту кнопку стало работать но вдобавок работает и со второй переменой р2 хотя прописан этот код в одном месте!
В общем понял что ваш вариант тоже не действует а фокус заключается вот в этих переменных bool buttonUpWas = true; bool buttonUpIs = digitalRead(upPin); Если их поставить в луп то переменная начинает быстро увеличиваться А если их объявить как глобальные то переменная увеличивается на единицу. Ниже как видно у меня закомментировано все что относиться к вашему варианту при этом переменная прибавляется со скоростью зависящей от delay() причем условие если переменные в лупе то их надо на + подтяжку делать Код (C++): boolean buttonPlusWas = true; boolean buttonMinusWas = true; boolean buttonEterWas = true; boolean working = false; //boolean EnablFlash1 = false; //boolean EnablFlash2 = false; // Enablsol = 0; void setup() { pinMode(plusPin, INPUT); // _PULLUP pinMode(minusPin, INPUT); pinMode(upPin, INPUT); pinMode(downPin, INPUT); pinMode(EterPin, INPUT); pinMode(BL, OUTPUT); pinMode(ledPin, OUTPUT); lcd.init(); // инициализация LCD lcd.backlight(); // включаем подсветку for (int i = 0; i <= 255; i++) { analogWrite(BL, i); delay(5); } delay (500); } void loop() { // const int longTimeClick = 500; // static unsigned long previous_millis; // static unsigned long lastSwitchTime; // static bool Click_One = true; bool buttonUpWas = true; bool buttonUpIs = digitalRead(upPin); bool buttonDownWas = true; bool buttonDownIs = digitalRead(downPin); boolean buttonPlusIs = digitalRead(plusPin); boolean buttonMinusIs = digitalRead(minusPin); boolean buttonEterIs = digitalRead(EterPin);
Целый день убился на то чтоб перетащить две переменные в луп и переделать две кнопки на подтяжку к плюсу
Вот выдрал из своего кода. Суть его в том, чтобы отслеживать нажатие кнопки и время ее удержания. Если держать меньше 1 сек ничего не происходит, если держать 1 сек уходим на функцию Stop(). В вашем случае вместо этой функции можете вставить свою. Ну и нажим кнопки перепишите под более понятное digitalRead(). Код (C++): if (!(PIND & 2)) { // остановка таймера кнопкой if (oldPress) { if (timerPRESS < millis()) Stop(); } else { timerPRESS = millis() + 1000; oldPress = 1; } } else { oldPress = 0; }