«Arduino и Telegram» – Урок 5: LCD экран, добавление заметок

Пятый урок из цикла «Arduino и Telegram».  В нём мы разберемся с LCD I2C дисплеем, отображением времени и добавлением заметок.
[vc_row][vc_column][vc_wp_text][intense_spacer type=»block» height=»30″]

Пятый урок из цикла «Arduino и Telegram».  В нём мы разберемся с LCD I2C дисплеем, отображением времени и добавлением заметок.[/vc_wp_text][intense_alert border_radius=»10px» close=»1″ close_memory=»2″ shadow=»0″ margin_bottom=»» tab_984862461=»» tab_411412670=»» tab_1479978263=»» tab_1595777515=»» tab_1376433241=»» tab_928372326=»» tab_806280568=»» tab_1887796900=»»]Для прохождения данного урока необходимо настроить ArduinoIDE и подключить телеграм бота, как показано в первом уроке.[/intense_alert][intense_alert color=»warning» border_radius=»10px» close=»1″ close_memory=»2″ shadow=»0″ margin_bottom=»» tab_984862461=»» tab_411412670=»» tab_1479978263=»» tab_1595777515=»» tab_1376433241=»» tab_928372326=»» tab_806280568=»» tab_1887796900=»»]Не забывайте о технике безопасности при работе с электрическими устройствами![/intense_alert][/vc_column][/vc_row][vc_row][vc_column][vc_tta_tour][vc_tta_section title=»1. Компоненты» tab_id=»1531431456196-69a2d9d5-44c5″][vc_wp_text]

Нам понадобятся NodeMCU, LCD I2C 1602 экран, светодиод, резистор на 220 Ом, соединительные провода, breadboard.

[/vc_wp_text][vc_gallery interval=»3″ images=»3235,2915,2924,2935,2938,2993″ img_size=»300×300″][/vc_tta_section][vc_tta_section title=»2. Схема подключения» tab_id=»1531431456239-c61fe88f-5376″][vc_wp_text]LCD экран подключается по шине i2c в пины D1,D2 и питается от 5 вольт. На обратной стороне у него есть потенциометр — регулятор контрастности. Выберите наиболее удобное значение. Также рекомендую добавить светодиод для индикации работы. [/vc_wp_text][vc_gallery interval=»3″ images=»3239,3238″ img_size=»large»][/vc_tta_section][vc_tta_section title=»3. Цели» tab_id=»1531434282509-009dda06-99fc»][vc_wp_text]Чтобы не забыть самое важное иногда приходится идти на разные хитрости. Стикеры на видном месте уже не работают. Пусть теперь о важной задаче нам напоминает наш девайс с LCD экраном!

В коде для прошивки нам надо реализовать две основные задачи:

  1. Вывод получаемого из интернета времени на экран
  2. Отображение текста заметки из чата

[/vc_wp_text][/vc_tta_section][vc_tta_section title=»4. Подключение библиотеки» tab_id=»1531434285160-e90a84db-7f64″][vc_wp_text]Для работы i2c дисплея с nodemcu обычная arduino библиотека не подойдет. Вот ссылка на нужную. Кириллицу для nodemcu я пока не видел, напишите в комментариях, если знаете.

Библиотека подключается в меню “Скетч” — “Подключить библиотеку” — “добавить .zip библиотеку”. В открывшемся окне выберите скачанный архив с библиотекой.

[/vc_wp_text][/vc_tta_section][vc_tta_section title=»5. Определение I2C адреса» tab_id=»1531434287506-fe3f47cc-b657″][vc_wp_text]Так как экран работает по i2c, нам надо узнать его адрес. Для этого загружаем скетч сканера i2c устройств на плату и открываем монитор порта. В нем будут находиться заветные символы. Советую написать их перманентным маркером на задней стороне экрана.

В строке объявления экрана надо будет подставить свой i2c адрес:

LiquidCrystal_I2C lcd(0x27, 16, 2); //объявление экрана

[/vc_wp_text][/vc_tta_section][vc_tta_section title=»6. Код прошивки» tab_id=»1531495731312-d634c81f-1b91″][vc_wp_text]Подключаем библиотеки:

#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WifiUDP.h>
#include <WiFiClientSecure.h>
#include <String.h>
#include <Wire.h>
#include <Time.h>
#include <TimeLib.h>
#include <Timezone.h>
#include <TelegramBot.h>
#include <LiquidCrystal_I2C.h> // наша библиотека для работы с экраном

Пин светодиода

#define work 10 //SD3

Настройки NTP сервера

#define NTP_OFFSET   60 * 60 
#define NTP_INTERVAL 60 * 1000   
#define NTP_ADDRESS  "ca.pool.ntp.org" 

Куча переменных для работы скетча

const char* ssid = "xxx";
const char* password = "yyy";
const char BotToken[] = "zzz”;
unsigned long lastLcdUpdate = -30000;
String date;
String t;
String newMsg;
String msg;
const char * months[] = {"Jan", "Feb", "Mar", "Apr", "May", "June", "July", "Aug", "Sep", "Oct", "Nov", "Dec"} ;

Объявление экрана, UDP, NTP сервера, бота

LiquidCrystal_I2C lcd(0x27, 16, 2); //объявляем экран с указанием его адреса и размера
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, NTP_ADDRESS, NTP_OFFSET, NTP_INTERVAL);
WiFiClientSecure net_ssl;
TelegramBot bot (BotToken, net_ssl);

Настройка при запуске

void setup (){
  pinMode(work, OUTPUT);
  digitalWrite(work, LOW);
  Serial.begin(9600); 
  
  wifiConnect();
  lcdSetUp();
  timeClient.begin();
  
  delay(1000);
  
  bot.begin(); 

  Serial.println("Good");
  digitalWrite(work, HIGH);
}

Основной цикл

void loop(){
  updateLcdTime();
  chat();
}

Функция для получения времени

void getTime(){
  date = "";t = "";
  timeClient.update();
  unsigned long epochTime =  timeClient.getEpochTime();
  time_t local, utc;
  utc = epochTime;
  TimeChangeRule usEDT = {"EDT", Second, Sun, Mar, 2, +120};  //UTC - 5 hours - change this as needed
  TimeChangeRule usEST = {"EST", First, Sun, Nov, 2, +60};   //UTC - 6 hours - change this as needed
  Timezone usEastern(usEDT, usEST);
  local = usEastern.toLocal(utc);
  date += months[month(local)-1];
  date += " ";
  date += day(local);
  t += hour(local);
  t += ":";
  if(minute(local) < 10)  
    t += "0";
  t += minute(local);
  t += " ";
  Serial.println(date);
  Serial.println(t);
}

Функция для подключения wifi

void wifiConnect(){
  Serial.print("Connecting");
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) 
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi at ");
  Serial.print(WiFi.localIP());
  Serial.println("");
}

Функция для общения с пользователем

void chat(){
  message m = bot.getUpdates();
  lcd.setCursor(0,1); // переходим на вторую строку экрана
  if (m.text.startsWith("setNote")){  // если сообщение пользователя начинается с setNote
    msg = m.text;
    msg.replace("setNote ", " ");
    msg.trim();
    lcd.print(msg); // выводим на экран
    bot.sendMessage(m.chat_id, "setted"); // и отправляем пользователю сообщение об успехе 
  } else if (m.text.equals("deleteNote")){  // если же сообщение пользователя deleteNote
    lcd.print("                  "); // то очищаем экран
    bot.sendMessage(m.chat_id, "deleted");  // и отправляем сообщение, что экран очищен
  }
}

Функция для обновления времени на экране

void updateLcdTime(){
  if (millis() - 60000 > lastLcdUpdate){
    lcd.setCursor(0,0); // переходим на первую строку экрана
    getTime();
    lcd.print(date+" "+t);
    lastLcdUpdate = millis();
  }
}

Функция для инициализации экрана

void lcdSetUp(){
  lcd.begin(16,2);
  lcd.init();
  lcd.backlight();
  lcd.setCursor(0, 0);
  lcd.print("WIFI CONNECTED");
  lcd.setCursor(0, 1);      
  lcd.print(WiFi.localIP());
  delay(1000);
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Developed by");
  lcd.setCursor(0, 1);      
  lcd.print("My Name"); // тут добавляем своё имя
  delay(2000);
  lcd.clear();
}
[/vc_wp_text][/vc_tta_section][vc_tta_section title=»7. Демонстрация работы» tab_id=»1531432229727-9508fb9d-1743″][vc_gallery interval=»3″ images=»3241,3242,3243,3244″ img_size=»large»][/vc_tta_section][/vc_tta_tour][/vc_column][/vc_row][vc_row][vc_column][vc_wp_text]Благодарю за прочтение![/vc_wp_text][/vc_column][/vc_row]

Загрузка ...
The Robot
Adblock
detector