Пятый урок из цикла «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 экраном!В коде для прошивки нам надо реализовать две основные задачи:
- Вывод получаемого из интернета времени на экран
- Отображение текста заметки из чата
[/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]