Помогите, пожалуйста! Не могу подключить кнопку для управления экраном!

VanyaDrug
Offline
Зарегистрирован: 22.07.2018

Добгого времени суток! Я в ардуино относительно новичок, но какие-то понятия о программировании имею. Помогите, пожалуйста, мне! Я пытаюсь сделать так, чтобы можно было переключать старницы с информацией на дисплее 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);
}
}

Заранее огромное спасибо!

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Лучше заведите переменную типа byte - она будет отвечать за выбранную страницу

И по каждому нажатию на кнопку -инкрементируйте ее(увеличивайте на 1)

К примеру

buttonСount++;  // с каждым нажатием buttonСount++ пока buttonСount<4
    if (buttonCount > 3) buttonСount = 0;

 

 

VanyaDrug
Offline
Зарегистрирован: 22.07.2018

А Вы не могли бы, пожалуйста, чуть более конкретный пример показать. Так, в целом понятно, но не всё...

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018

Подождите тогда

VanyaDrug
Offline
Зарегистрирован: 22.07.2018

Хорошо, спасбо большое!

BuonanotteMasha
BuonanotteMasha аватар
Offline
Зарегистрирован: 02.01.2018
#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
Offline
Зарегистрирован: 22.07.2018

Спасибо большое, про дребезг знаю, вы мне очень помогли!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

VanyaDrug, по логике программы Вам нужно реагировать на факт изменения состояния кнопки, а в коде Вы реагируете на само состояние.

 

BuonanotteMash, а что будет делать Ваш код при длительном нажатии?

VanyaDrug
Offline
Зарегистрирован: 22.07.2018

Простите за наглость, но я не понимаю, я нуб, куда мне деть мой оставшийся код? Как дать понять ардуино, что температура и влажность - первая страница, а время - вторая?

b707
Offline
Зарегистрирован: 26.05.2017

VanyaDrug пишет:

Простите за наглость, но я не понимаю, я нуб, куда мне деть мой оставшийся код? Как дать понять ардуино, что температура и влажность - первая страница, а время - вторая?

ну чеж так тупить-то... Или код на первой странице на самом деле не ваш, а целиком стянут где-то в инете?

Вот в том "вашем" коде есть часть, которая показывается при нажатой кнопке - ее ставим в первый кейс. А ветку else - во второй.