Hướng dẫn kit phát triển esp8266 lcd12864b5: đồng hồ thời gian thực

Đào Hùng 09/04/2021
huong-dan-kit-phat-trien-esp8266-lcd12864b5-dong-ho-thoi-gian-thuc
  • 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,…Hướng dẫn kit phát triển ESP8266 LCD12864B5: Đồng hồ thời gian thực

Sơ đồ chân của bộ kitHướng dẫn kit phát triển ESP8266 LCD12864B5: Đồng hồ thời gian thực

Hướng dẫn kit phát triển ESP8266 LCD12864B5: Đồng hồ thời gian thực

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 KitHướng dẫn kit phát triển ESP8266 LCD12864B5: Đồng hồ thời gian thực

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);
}

 

Hướng dẫn kit phát triển ESP8266 LCD12864B5: Đồng hồ thời gian thực

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.

Hướng dẫn kit phát triển ESP8266 LCD12864B5: Đồng hồ thời gian thực

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

Bình luận
Nội dung này chưa có bình luận, hãy gửi cho chúng tôi bình luận đầu tiên của bạn.
VIẾT BÌNH LUẬN