Проблема с пониманием кода

StanHD
Offline
Зарегистрирован: 18.09.2014

Привет всем! Нужно для личных целей реализовать меню в ардуино, наткнулся на пример, представляю как это работает но не понимаю логику . Может кто поможет понять что подразумевает написаное?

Зачем нужны эти переменные?

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;

}

 

X-Dron
Offline
Зарегистрирован: 24.01.2015

для определения фронта нажатия и отсеивания дребезга кнопки
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-...

StanHD
Offline
Зарегистрирован: 18.09.2014

Спасибо, разобрался!