Lập trình đồng hồ trong arduino dùng ma trận MAX7219 với esp8266 cập nhật thời gian từ Internet

Cách thực hiện là sử dụng các mã nguồn có sẵn trên mạng, chỉnh sửa lại cho phù hợp và sử dụng.

Trong clip, Tôi cũng hướng dẫn cách quản lý mạng wifi trên module ESP khi cần thiết lập lại mạng wifi, các bạn không phải nạp lại code từ đầu.

LINH KIỆN CẦN CÓ:

  1. Led ma trận MAX7219
  2. Module ESP8266. Trong bài hướng dẫn, tôi sử dụng module ESP07 vì giá thành hợp lý. Nếu sử dụng ESP07 thì cần phải mua thêm đế để hàn module này lên.
  3. Module nạp chương trình CP1202 hoặc các mạch điện chuyển đổi USB thành cổng COM tương ứng.
  4. Module chuyển nguồn sang 3.3V

TẢI CÁC THƯ VIỆN

Các đường dẫn thư viện, bạn có thể lấy trong phần mô tả video hoặc hoặc trong bài viết này trên blog DanDienTu.com

Tải thư viện để cập nhật thời gian từ Internet theo đường link sau. 

https://github.com/PaulStoffregen/Time

Tải thư viện và demo cho MAX2719 gồm có 2 file thư viện và 1 file demo trên blog theo đường dẫn dưới đây:

https://hackaday.io/project/160337-nodemcu-wifi-sync-precision-dot-matrix-clock

Sau khi tải về 3 file từ blog hackaday.io như link ở mục 2. Khi bạn mở file ESP_LEDMatrix_clock.ino  bằng Arduino IDE, chương trình sẽ hỏi bạn tạo thư mục cho file này, bạn đồng ý với đề xuất. Sau đó chép 2 file thư viện của nó cho chung vào thư mục với file ESP_LEDMatrix_clock.ino.

CẤU HÌNH DÙNG ARDUINO IDE LẬP TRÌNH CHO ESP07

Nếu bạn chưa biết cách dùng Arduino để lập trình cho ESP thì có thể tham khảo bài viết sau đây. Nếu bạn đã biết có thể bỏ qua bước này.

Cài đặt thư viện của ESP8266 ESP-12E NodeMCU để lập trình trong Arduino

http://dandientu.com/lap-trinh-nhung/lap-trinh-esp8266-esp-12e-nodemcu-su-dung-arduino.html

Cài đặt thư viện của ESP32 để lập trình trong Arduino

http://dandientu.com/lap-trinh-nhung/cai-dat-thu-vien-cua-esp32-de-lap-trinh-trong-arduino.html

BẮT ĐẦU

Cài thư viện thời gian vào trong Arduino

Mở file ví dụ mẫu TimeNTP_ESP8266WiFi trong thư viện C:\Users\<tên máy tính của bạn>\Documents\Arduino\libraries\Time\examples\TimeNTP_ESP8266WiFi

Nhập tên mạng wifi nhà bạn vào 2 dòng code sau:

const char ssid[] = "*************";  //  your network SSID (name)
const char pass[] = "********";       // your network password

Thay thế các dấu hoa thị (*) bằng tên tài khoản mạng wifi nhà bạn.

Đổi server lấy dữ liệu thời gian từ Mỹ qua Châu Á

Sửa dòng:

static const char ntpServerName[] = "us.pool.ntp.org";

Thành :

static const char ntpServerName[] = "asia.pool.ntp.org";

Đổi múi giờ:

Sửa:

const int timeZone = 1;     // Central European Time

Thành:

const int timeZone = 7;     // VN

Sau đó nạp chương trình vào module ESP để kiểm tra. Mở Serial Monitor để xem kết quả trả về có giống với đồng hồ việt nam hay không.

Sau khi kiểm tra mọi thứ đã OK.  Trong file chương trình, bổ sung các biến như sau:

int sc, mn, h, d, m, y, wd;

Mở file ESP_LEDMatrix_clock.ino để copy và dán một số dòng code từ file này qua file bạn đang chỉnh sửa.

Copy các dòng từ ESP_LEDMatrix_clock.ino

#define NUM_MAX 4 //sử dụng module có 4 ic điều khiển

// for NodeMCU    Vcc Red   Gnd Brown

#define CS_PIN  0  // D3 Yellow

#define CLK_PIN 14  // D5 Green

#define DIN_PIN 13  // D7 Orange

#include "max7219.h"

#include "fonts.h" //font hiển thị số và chữ

Sửa lại tên chân các chân SPI tương ứng với bo mạch ESP07 theo sơ đồ chân sau:

#define CS_PIN  15  

#define CLK_PIN 14  

#define DIN_PIN 13  

Trở lại file file ESP_LEDMatrix_clock.ino, copy tiếp các dòng sau và đặt vào hàm setup của chương trình đang chỉnh sửa:

initMAX7219();

sendCmdAll(CMD_SHUTDOWN,1);

sendCmdAll(CMD_INTENSITY,5);

Copy tiếp 2 dòng code sau từ file ESP_LEDMatrix_clock.ino. 2 dòng code này sẽ thông báo cho bạn biết địa chỉ IP của module ESP.

printStringWithShift((String("  IP: ") + WiFi.localIP().toString()).c_str(), 15);

delay(1500);

Copy tiếp các dòng khai báo biến từ ESP_LEDMatrix_clock.ino

#define MAX_DIGITS 20

byte dig[MAX_DIGITS]={0};

byte digold[MAX_DIGITS]={0};

byte digtrans[MAX_DIGITS]={0};

int updCnt = 0;

int dots = 0;

long dotTime = 0;

long clkTime = 0;

int dx=0;

int dy=0;

byte del=0;

Copy hết tất cả các dòng code trong hàm loop() từ ESP_LEDMatrix_clock.ino đưa qua chương trình đang chỉnh sửa

Copy tất cả các hàm trong file ESP_LEDMatrix_clock.ino từ sau hàm loop()

void showAnimClock()

void showDigit(char ch, int col, const uint8_t *data)

void setCol(int col, byte v)

int showChar(char ch, const uint8_t *data)

int dualChar = 0;

unsigned char convertPolish(unsigned char _c)

void printCharWithShift(unsigned char c, int shiftDelay)

void printStringWithShift(const char* s, int shiftDelay)

Sau khi copy qua hết các hàm liên quan, chúng ta chuyển sang chương trình đang mở trong Arduino để tiếp tục chỉnh sửa

Viết hàm getTime để cập nhật thời gian

void getTime()

{

  h = hour();

  mn = minute();

  sc = second();

  mm = month();

  yy = year();

  d = day();

  wd = weekday() ;

}

Khai báo thêm biến

byte count5min= 0;

biến này dùng để đếm cứ sau 5 phút sẽ hiển thị ngày

Bổ sung dòng code

count5min--;

Khai báo thêm dòng hiển thị thứ trong tuần

char daysOfTheWeek[7][3] = {"CN", "T2", "T3", "T4", "T5", "T6", "T7"};

Bổ sung thêm các dòng sau:

if(count5min <=0){

    count5min=5;

    printStringWithShift(String(" TODAY:" + String(daysOfTheWeek[wd]) ).c_str(), 50);

    delay(2000);

    printStringWithShift(String(" " + String(d) + "/" + String(mm) + "/" + String(yy) ).c_str(), 50);

    delay(2000);

  }

Cuối cùng là cắm dây cho module gồm module max7219, module CP2012 theo sơ đồ chân, và bắt đầu nạp chương trình.

Sơ đồ chân ESP07

Sơ đồ cấp nguồn và đấu dây để nạp chương trình

Lưu ý, toàn bộ mạch điện chỉ sử dụng điện áp 3.3V, không được cấp nguồn cao hơn. Khi sử dụng, cần bổ sung thêm module nguồn từ 5V sang 3V3

Nguồn sử dụng bạn có thể lấy trực tiếp từ CP1202 để cấp và thử nghiệm.

Nguồn: Dân Điện Tử / dandientu.com

Trả lời

Email của bạn sẽ không được hiển thị công khai.