Проблема с пониманием кода
- Войдите на сайт для отправки комментариев
Привет всем! Нужно для личных целей реализовать меню в ардуино, наткнулся на пример, представляю как это работает но не понимаю логику . Может кто поможет понять что подразумевает написаное?
Зачем нужны эти переменные?
boolean buttonnextWasUp = true; boolean buttonprevWasUp = true; boolean buttonupWasUp = true; boolean buttondownWasUp = true;
При использовании pinMode, состояниие указанных переменных будет LOW если кнопка не нажата а если нажата то HIGH?
pinMode(nextPin, INPUT); pinMode(prevPin, INPUT); pinMode(upPin, INPUT); pinMode(downPin, INPUT);
Эти переменные проверяю какое сейчас состояние кнопки если HIGH то значение true а если LOW то значение false?
boolean buttonnextIsUp = digitalRead(nextPin); boolean buttonprevIsUp = digitalRead(prevPin); boolean buttonupIsUp = digitalRead(upPin); boolean buttondownIsUp = digitalRead(downPin);
Из за того что не понял зачем нужны были первые булевские переменные не знаю что в условии проверяется?
if (buttonnextWasUp && !buttonnextIsUp) { delay(10); buttonnextIsUp = digitalRead(nextPin);
Мои размышления правильны или нет:
Допустим кнопка нажата на пине 6 значит переменной buttonnextisup = true. Затем идет сравнение если buttonnextWasUP(она сейчас в состоянии true) и buttonnextisup = false то делаем задержку и потом переменной buttonnextisup присваеваем то что на порту(а она нажата) т.е. true?
Тогда не понятно следующее...
Переменная которя содержит то состояние которое сейчас buttonnextisup(она сейчас в состоянии true), почему то проверяется false и тогда он переменную меню увеличивает. Почему false то? Что то все это в тупик меня завело... Помогите добрые люди разобраться!
if (!buttonnextIsUp) { m++; if (m>3) { m=0; } delay(100); lcd.clear(); } }
Сам пример:
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x20,16,2); //инициализируем 2х строчный дисплей int m=0; // переменная для экранов меню int p1=0; // переменная для примера 1 int p2=0; // переменная для примера 2 #define nextPin 6 // кнопка меню на 6 входе #define prevPin 7 // кнопка возврата #define upPin 9 // увеличение значения отображаемого параметра #define downPin 10 // уменьшение значения boolean buttonnextWasUp = true; boolean buttonprevWasUp = true; boolean buttonupWasUp = true; boolean buttondownWasUp = true; void setup() { // Установка пинов как входов pinMode(nextPin, INPUT); pinMode(prevPin, INPUT); pinMode(upPin, INPUT); pinMode(downPin, INPUT); lcd.init(); // инициализация LCD lcd.backlight(); // включаем подсветку // Вывод приветствия lcd.print( "TEST MENU!" ); // задержка delay (1000); } void loop () { boolean buttonnextIsUp = digitalRead(nextPin); boolean buttonprevIsUp = digitalRead(prevPin); boolean buttonupIsUp = digitalRead(upPin); boolean buttondownIsUp = digitalRead(downPin); //Обработка нажатия кнопки меню if (buttonnextWasUp && !buttonnextIsUp) { delay(10); buttonnextIsUp = digitalRead(nextPin); if (!buttonnextIsUp) { m++; if (m>3) { m=0; } delay(100); lcd.clear(); } } //Обработка нажатия кнопки назад if (buttonprevWasUp && !buttonprevIsUp) { delay(10); buttonprevIsUp = digitalRead(prevPin); if (!buttonprevIsUp) { m--; if (m<0) { m=3; } delay(100); lcd.clear(); } } // Обработка нажатия для р1 + if (buttonupWasUp && !buttonupIsUp) { delay(10); buttonupIsUp = digitalRead(upPin); if (!buttonupIsUp && m==1) { p1++; if (p1>10) { p1=0; } delay (100); lcd.setCursor(5, 1); lcd.print(" "); } } // Обработка нажатия для р1 - if (buttondownWasUp && !buttondownIsUp) { delay(10); buttondownIsUp = digitalRead(downPin); if (!buttondownIsUp && m==1) { p1--; if (p1<0) { p1=10; } delay (100); lcd.setCursor(5, 1); lcd.print(" "); } } // Обработка нажатия для р2 + if (buttonupWasUp && !buttonupIsUp) { delay(10); buttonupIsUp = digitalRead(upPin); if (!buttonupIsUp && m==2) { p2++; if (p2>10) { p2=0; } delay (100); lcd.setCursor(5, 1); lcd.print(" "); } } // Обработка нажатия для р2 - if (buttondownWasUp && !buttondownIsUp) { delay(10); buttondownIsUp = digitalRead(downPin); if (!buttondownIsUp && m==2) { p2--; if (p2<0) { p2=10; } delay (100); lcd.setCursor(5, 1); lcd.print(" "); } } // Обработка нажатия для р3 + if (buttonupWasUp && !buttonupIsUp) { delay(10); buttonupIsUp = digitalRead(upPin); if (!buttonupIsUp && m==3) { ledEnabled = !ledEnabled; digitalWrite(ledPin, ledEnabled); p3 = ledEnabled; } } // Обработка нажатия для р3 - if (buttondownWasUp && !buttondownIsUp) { delay(10); buttondownIsUp = digitalRead(downPin); if (!buttondownIsUp && m==3) { ledEnabled = !ledEnabled; digitalWrite(ledPin, ledEnabled); p3 = ledEnabled; } } //вывод меню if (m==0) { lcd.setCursor(0, 0); lcd.print( "Main Menu" ); lcd.setCursor(0, 1); lcd.print( "P1=" ); lcd.print(p1); lcd.print( " P2=" ); lcd.print(p2); lcd.print( " LED=" ); lcd.print(p3); } 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); } buttonupWasUp = buttonupIsUp; buttondownWasUp = buttondownIsUp; buttonnextWasUp = buttonnextIsUp; buttonprevWasUp = buttonprevIsUp; }
для определения фронта нажатия и отсеивания дребезга кнопки
http://arduino.ru/forum/programmirovanie/rabota-s-knopkami-v-pomoshch-no...
http://wiki.amperka.ru/%D0%BA%D0%BE%D0%BD%D1%81%D0%BF%D0%B5%D0%BA%D1%82-...
Спасибо, разобрался!