- Kit ESP8266 LCD12864B5 là một kit phát triển bởi MTE, tích hợp sẵn màn hình và 4 nút bấm, phù hợp với những ứng dụng với những ứng dụng cần nhu cầu hiển thị. Với bộ kit này bạn có thể làm nhiều ứng dụng khác nhau, ví dụ như làm đồng hồ, báo thức, lập trình trò chơi,…
Sơ đồ chân của bộ kit
Lưu ý: Khi khai báo các chân vào phải khai báo INPUT_PULLUP
Phần nguồn chỉ để cấp điện cho board hoạt động, muốn nạp code phải sử dụng mạch nạp USB to TTL cắm vào phần mạch nạp để nạp code cho board
Hướng dẫn lập trình đồng hồ thời gian thực với Kit
Code mẫu
Màn hình LCD 12864B5 giao tiếp khá là giống với LCD Gphone ST7565 nên mình sẽ sử dụng luôn thư viện LCD ST7565.
/* * Author: RedFox97 * Đấu nối * |---------|---------|---------------| * | LCD | ESP8266 | Chân đặc biệt | * |---------|---------|---------------| * | RST | D0 | GPIO16 | * | SCLK | D6 | GPIO12 | * | A0 | D5 | GPIO14 | * | SID | D7 | GPIO13 | * |---------|---------|---------------| */ #include <ESP8266WiFi.h> #include <time.h> #include <Ticker.h> #include "ST7565_homephone_esp8266.h" const unsigned char logo[] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x18, 0x1C, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1E, 0x1C, 0x18, 0x10, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0xF8, 0xF0, 0xE0, 0xE0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFC, 0xFC, 0xFC, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0xFC, 0xFC, 0xFC, 0x9C, 0x9C, 0x9C, 0x9C, 0x9C, 0x98, 0x90, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x01, 0x03, 0x07, 0x01, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x7F, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x7F, 0x7F, 0x73, 0x73, 0x73, 0x73, 0x73, 0x31, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, }; const char* ssid = ".............."; // SSID của WiFi const char* password = ".............."; // Mật khẩu của WiFi // Tọa độ tâm đồng hồ const int clockCenterX = 32; const int clockCenterY = 32; String dayOfWeek, thang, ngay, gio, phut, giay, nam; int hour, minute, sec; ST7565 lcd(16, 12, 14, 13); Ticker flip; void setup() { Serial.begin(9600); // Khởi tạo Serial với baudrate 9600 WiFi.begin(ssid,password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } lcd.ON(); lcd.SET(35,0,0,0,4); configTime(7 * 3600, 0, "pool.ntp.org", "time.nist.gov"); capNhatThoiGian(); flip.attach(1,ngat); // Khởi tạo ngắt 1s } void loop() { if(nam.toInt() < 2000) { // Nếu năm chưa cập nhật đúng năm hiện tại sẽ tiếp tục chạy hàm cập nhật capNhatThoiGian(); } lcd.clear(); lcd.Circle(clockCenterX, clockCenterY, 28, 1); // Vẽ vòng ngoài của đồng hồ lcd.Circle(clockCenterX, clockCenterY, 29, 1); for (int i=0; i<3; i++) { // Vẽ Tâm đồng hồ lcd.Circle(clockCenterX, clockCenterY, i, 1); } for (int i=0; i<12; i++) { // Vẽ 12 vị trí giờ tương ứng từ 1 đến 12 drawMark(i); } lcd.Bitmap(73,28,40,40,logo,BLACK); // Hiển thị Logo MTE canGiua(93,8,dayOfWeek); // Hiển thị ngày trong tuần hienThi(67,23,ngay+"/"+thang+"/"+nam); // Hiển thị ngày, tháng, năm drawHour(hour,minute); // Vẽ kim giờ drawMin(minute); // Vẽ kim phút drawSec(sec); // Vẽ kim giây lcd.display(); } void ngat() { sec++; if(sec == 60) { minute++; sec = 0; } if(minute == 60) { hour++; minute = 0; } if(hour == 24) { // Sau 1 ngày cập nhật thời gian 1 lần hour = 0; capNhatThoiGian(); } Serial.print(String(hour)+":"+String(minute)+":"+String(sec)); Serial.print("\t"); Serial.println(ngay+"/"+thang+"/"+nam); } void capNhatThoiGian() { time_t now = time(nullptr); String data = ctime(&now); Serial.println(data); // Tách dữ liệu String ngayTrongTuan = data.substring(0,3); String month = data.substring(4,7); ngay = data.substring(8,10); gio = data.substring(11,13); phut = data.substring(14,16); giay = data.substring(17,19); nam = data.substring(20,24); //Biến đổi ngayTrongTuan.toUpperCase(); if(ngayTrongTuan == "MON") dayOfWeek = "MONDAY"; else if(ngayTrongTuan == "TUE") dayOfWeek = "TUESDAY"; else if(ngayTrongTuan == "WED") dayOfWeek = "WEDNESDAY"; else if(ngayTrongTuan == "THU") dayOfWeek = "THURSDAY"; else if(ngayTrongTuan == "FRI") dayOfWeek = "FRIDAY"; else if(ngayTrongTuan == "SAT") dayOfWeek = "SATURDAY"; else if(ngayTrongTuan == "SUN") dayOfWeek = "SUNDAY"; if(ngay.toInt() < 10) { ngay = "0" + ngay; } if(month=="Jan") thang="01"; else if(month=="Feb") thang="02"; else if(month=="Mar") thang="03"; else if(month=="Apr") thang="04"; else if(month=="May") thang="05"; else if(month=="Jun") thang="06"; else if(month=="Jul") thang="07"; else if(month=="Aug") thang="08"; else if(month=="Sep") thang="09"; else if(month=="Oct") thang="10"; else if(month=="Nov") thang="11"; else if(month=="Dec") thang="12"; hour = gio.toInt(); minute = phut.toInt(); sec = giay.toInt(); } void hienThi(int x, int y,String chuoi) { // Hiển thị 1 chuỗi kí tự lcd.Asc_String(x,y,(char*) chuoi.c_str(),BLACK); } void canGiua(int x, int y, String a) { // Căn giữa 1 chuỗi kí tự lcd.Asc_String(x+1-(a.length()*6)/2,y+1,(char*) a.c_str(),BLACK); } void drawMark(int h) { float x1, y1, x2, y2; h=h*30; h=h+270; x1=27*cos(h*0.0175); y1=27*sin(h*0.0175); x2=24*cos(h*0.0175); y2=24*sin(h*0.0175); lcd.DrawLine(x1+32, y1+32, x2+32, y2+32, 1); } void drawSec(int s) { float x1, y1, x2, y2; s=s*6; s=s+270; x1=27*cos(s*0.0175); y1=27*sin(s*0.0175); x2=24*cos(s*0.0175); y2=24*sin(s*0.0175); lcd.DrawLine(clockCenterX, clockCenterY, x2+clockCenterX, y2+clockCenterY, 1); } void drawMin(int m) { float x1, y1, x2, y2, x3, y3, x4, y4; m=m*6; m=m+270; x1=25*cos(m*0.0175); y1=25*sin(m*0.0175); x2=3*cos(m*0.0175); y2=3*sin(m*0.0175); x3=10*cos((m+8)*0.0175); y3=10*sin((m+8)*0.0175); x4=10*cos((m-8)*0.0175); y4=10*sin((m-8)*0.0175); lcd.DrawLine(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY, 1); lcd.DrawLine(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY, 1); lcd.DrawLine(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY, 1); lcd.DrawLine(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY, 1); } void drawHour(int h, int m) { float x1, y1, x2, y2, x3, y3, x4, y4; h=(h*30)+(m/2); h=h+270; x1=20*cos(h*0.0175); y1=20*sin(h*0.0175); x2=3*cos(h*0.0175); y2=3*sin(h*0.0175); x3=8*cos((h+12)*0.0175); y3=8*sin((h+12)*0.0175); x4=8*cos((h-12)*0.0175); y4=8*sin((h-12)*0.0175); lcd.DrawLine(x1+clockCenterX, y1+clockCenterY, x3+clockCenterX, y3+clockCenterY, 1); lcd.DrawLine(x3+clockCenterX, y3+clockCenterY, x2+clockCenterX, y2+clockCenterY, 1); lcd.DrawLine(x2+clockCenterX, y2+clockCenterY, x4+clockCenterX, y4+clockCenterY, 1); lcd.DrawLine(x4+clockCenterX, y4+clockCenterY, x1+clockCenterX, y1+clockCenterY, 1); }
KIT ESP8266 | USB to TTL |
RX | RX |
VCC | VCC |
TX | TX |
GND | GND |
- Để nạp code cho mạch, sau khi nhấn Upload trên IDE, bạn nhấn giữ nút GPIO0 -> nhấn RESET, nhả RESET, cuối cùng nhả nút GPIO0 ra.
Trong bài sau mình sẽ hướng dẫ các bạn lập trình dự báo thời tiết sử dụng bộ kit này