Помогите, пожалуйста! Не могу подключить кнопку для управления экраном!
- Войдите на сайт для отправки комментариев
Вс, 22/07/2018 - 23:17
Добгого времени суток! Я в ардуино относительно новичок, но какие-то понятия о программировании имею. Помогите, пожалуйста, мне! Я пытаюсь сделать так, чтобы можно было переключать старницы с информацией на дисплее 1602 нажатием кнопки. Пока я смог сделать только так, чтобы при удерживании кнопки открывалась вторая страница, а при отпускании закрывалась, но а если страниц много, то такое не прокатит, хочется, чтобы при единоразовом нажатии открывалась другая страница, и чтобы её закрыть, надо было бы нажать ещё раз.
Вот скетч с тем, что смог сделать:
#include <TimeLib.h>
#include <Wire.h> // библиотека для протокола IIC
#include <LiquidCrystal_I2C.h> // подключаем библиотеку LCD IIC
LiquidCrystal_I2C lcd(0x27,20,2); // присваиваем имя lcd для дисплея
#include <DHT.h> // подключаем библиотеку для DHT11
DHT dht(2, DHT11); // к какому порту подключаем датчик
const int BUTTON=4;
// создаем символ градуса и присваиваем имя "gradus"
byte gradus[8] = {
0b01100,0b10010,0b10010,0b01100,0b00000,0b00000,0b00000,0b00000
};
// создаем русскую букву "П"
byte P[8] = {
0b11111,0b10001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000
};
// создаем русскую букву "У"
byte Y[8] = {
0b10001,0b10001,0b10001,0b01111,0b00001,0b00001,0b01110,0b00000
};
// создаем русскую букву "Л"
byte L[8] = {
0b00111,0b01001,0b10001,0b10001,0b10001,0b10001,0b10001,0b00000
};
// создаем русскую букву "Ж"
byte ZH[8] = {
0b10101,0b10101,0b10101,0b01110,0b10101,0b10101,0b10101,0b00000
};
// создаем русскую букву "Ь"
byte znak[8] = {
0b10000,0b10000,0b10000,0b11110,0b10001,0b10001,0b11110,0b00000
};
byte YA[8] = {
0b01111,
0b10001,
0b10001,
0b01111,
0b00101,
0b01001,
0b10001,
0b00000
};
void setup() {
pinMode (BUTTON, INPUT);
Serial.begin(9600); // запуск последовательного порта
lcd.init(); // инициализация LCD дисплея
lcd.backlight(); // включение подсветки дисплея
lcd.createChar(1, gradus);
lcd.createChar(2, P);
lcd.createChar(3, Y);
lcd.createChar(4, L);
lcd.createChar(5, ZH);
lcd.createChar(6, znak);
lcd.createChar(7, YA);
setTime (15, 54, 0, 7, 21, 2018);
}
void loop() {
if(digitalRead(BUTTON) == HIGH)
{
// если нужны точные значение, то используйте float, вместо byte
byte h = dht.readHumidity(); // считываем значение температуры
byte t = dht.readTemperature(); // считываем значение влажности
Serial.print("Temperature: ");
Serial.println(t); // отправляем значение температуры на монитор
Serial.print("Humidity: ");
Serial.println(h); // отправляем значение температуры на монитор
Serial.println(" "); // пустая строка
lcd.setCursor(0,0); // ставим курсор на 1 символ первой строки
lcd.print("TEM"); // используем латинские буквы
lcd.print(char(2)); // выводим русскую букву "П"
lcd.print("EPAT"); // используем латинские буквы
lcd.print(char(3)); // выводим русскую букву "У"
lcd.print("PA: "); // используем латинские буквы
lcd.print(t); // выводим значение температуры на LCD
lcd.print(char(1)); // выводим знак градуса
lcd.setCursor(0,1); // анологично
lcd.print("B");
lcd.print(char(4));
lcd.print("A");
lcd.print(char(5));
lcd.print("HOCT");
lcd.print(char(6));
lcd.print(": ");
lcd.print(h);
lcd.print("%");
delay(1000);
}
else
{
lcd.clear();
lcd.print("BPEM");
lcd.print(char(7));
lcd.setCursor(0, 1);
lcd.print( hour() );
lcd.print( ":" );
lcd.print( minute() );
delay(1000);
}
}
Заранее огромное спасибо!
Лучше заведите переменную типа byte - она будет отвечать за выбранную страницу
И по каждому нажатию на кнопку -инкрементируйте ее(увеличивайте на 1)
К примеру
buttonСount++; // с каждым нажатием buttonСount++ пока buttonСount<4 if (buttonCount > 3) buttonСount = 0;А Вы не могли бы, пожалуйста, чуть более конкретный пример показать. Так, в целом понятно, но не всё...
Подождите тогда
Хорошо, спасбо большое!
#include <Wire.h> // библиотека для протокола IIC #include <LiquidCrystal_I2C.h> // подключаем библиотеку LCD IIC LiquidCrystal_I2C lcd(0x27,16,2); // присваиваем имя lcd для дисплея const int BUTTON=4; void setup() { pinMode (BUTTON, INPUT); } void loop() { static byte buttonCount = 0; if(digitalRead(BUTTON) == HIGH) { lcd.clear(); buttonCount++; // с каждым нажатием buttonСount++ пока buttonСount<4 if (buttonCount > 3) buttonCount = 0; } switch (buttonCount) { case 0: break; case 1: break; case 2: break; } }Пробуйте, каждый case - отдельная страница.
Да не забудьте про защиту от дребезга контактов кнопки. В этом коде я ее не делал. Поищите по гуглу, об этом информации хватает
Спасибо большое, про дребезг знаю, вы мне очень помогли!
VanyaDrug, по логике программы Вам нужно реагировать на факт изменения состояния кнопки, а в коде Вы реагируете на само состояние.
BuonanotteMash, а что будет делать Ваш код при длительном нажатии?
Простите за наглость, но я не понимаю, я нуб, куда мне деть мой оставшийся код? Как дать понять ардуино, что температура и влажность - первая страница, а время - вторая?
Простите за наглость, но я не понимаю, я нуб, куда мне деть мой оставшийся код? Как дать понять ардуино, что температура и влажность - первая страница, а время - вторая?
ну чеж так тупить-то... Или код на первой странице на самом деле не ваш, а целиком стянут где-то в инете?
Вот в том "вашем" коде есть часть, которая показывается при нажатой кнопке - ее ставим в первый кейс. А ветку else - во второй.