Đồng hồ internet với NodeMCU và màn hình SSD1306 | Dự án IoT

Đồng hồ internet với NodeMCU và màn hình SSD1306 | Dự án IoT

Với dự án này, tôi đã tạo ra một chiếc đồng hồ thời gian thực đơn giản với chip DS3231 RTC và SSD1306 OLED, thời gian và ngày được hiển thị trên màn hình SSD1306 và chúng có thể được cài đặt bằng hai nút ấn.

Với board phát triển WiFi NodeMCU, chúng ta có thể sử dụng internet để có được giờ địa phương chính xác, do đó không cần chip đồng hồ thời gian thực như: DS1302, DS1307, DS3231,

Dự án này cho thấy cách xây dựng đồng hồ internet với Mô-đun NodeMCU WiFi nơi thời gian và ngày được hiển thị trên màn hình OLED SSD1306.

OLED SSD1306 được sử dụng trong dự án này được cấu hình để hoạt động ở chế độ I2C, một số board OLED SSD1306 có thể yêu cầu sửa đổi nhỏ về phần cứng (để chọn giữa chế độ SPI hoặc chế độ I2C) như hàn, nối dây.

 

Yêu cầu phần cứng:

  • Board phát triển ESP8266 NodeMCU
  • Màn hình OLED SSD1306 với độ phân giải 128 × 64 Pixel
  • cáp micro USB (để lập trình và cấp nguồn cho mạch)
  • Breadboard
  • Dây dẫn

Sơ đồ mạch dự án :

 

Và hình ảnh sau đây cho thấy mạch fritzing :

Các chân SDA và SCL của bus I2C nối với GPIO4 (D2) và GPIO0 (D3) của board NodeMCU (tương ứng), chúng được nối với các chân SDA và SCL (SCK) của mô-đun hiển thị SSD1306.

RESET (RES) của mô-đun hiển thị được nối với GPIO5 (D1) của board phát triển NodeMCU.

Mô-đun hiển thị SSD1306 được cung nguồn 3,3V từ board NodeMCU.

CODE:

Arduino IDE bên dưới sử dụng trình điều khiển Adafruit SSD1306 OLED và thư viện Adafruit GFX để liên kết giữa NodeMCU và mô-đun màn hình.

Thư viện khác là NTPClient , thư viện này kết nối WiFi ESP8266 với máy chủ thời gian, máy chủ này gửi thông tin thời gian đến mô-đun. NTP: Giao thức thời gian mạng.

NTPClient Library   —   direct link

Cái cuối cùng là Arduino Time library, thư viện này chuyển đổi thời gian Unix (Unix epoch) thành: giây, phút, giờ, ngày trong tuần, ngày, tháng và năm. Chu kỳ Unix là số giây bắt đầu từ ngày 1 tháng 1 năm 1970 (nửa đêm UTC / GMT).

Về cơ bản, máy chủ thời gian gửi thời gian ở định dạng epoch Unix cần được chuyển đổi, thư viện này thực hiện tất cả công việc. Liên kết tải xuống dưới đây:

Arduino Time Library   —   direct link

Các thư viện NtpClient được cấu hình để có được thông tin thời gian từ máy chủ  time.nist.gov (GMT thời gian) và bù giờ (==> GMT + 1 múi giờ) tương đương với 3600 giây, dòng cấu hình bên dưới:

NTPClient timeClient(ntpUDP, “time.nist.gov”, 3600, 60000);

Code hoàn chỉnh:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <NTPClient.h>               // include NTPClient library
#include <TimeLib.h>                 // include Arduino time library
// Libraries for SSD1306 OLED display
#include <Wire.h>              // include wire library (for I2C devices such as SSD1306 display)
#include <Adafruit_GFX.h>      // include Adafruit graphics library
#include <Adafruit_SSD1306.h>  // include Adafruit SSD1306 OLED display driver
#define OLED_RESET   5     // define SSD1306 OLED reset at ESP8266 GPIO5 (NodeMCU D1)
Adafruit_SSD1306 display(OLED_RESET);
const char *ssid     = “YOUR SSID”;
const char *password = “YOUR PASSWORD”;
WiFiUDP ntpUDP;
// ‘time.nist.gov’ is used (default server) with +1 hour offset (3600 seconds) 60 seconds (60000 milliseconds) update interval
NTPClient timeClient(ntpUDP, “time.nist.gov”, 3600, 60000);
void setup(void)
{
  Serial.begin(9600);
  delay(1000);
  Wire.begin(4, 0);           // set I2C pins [SDA = GPIO4 (D2), SCL = GPIO0 (D3)], default clock is 100kHz
  // by default, we’ll generate the high voltage from the 3.3v line internally! (neat!)
  display.begin(SSD1306_SWITCHCAPVCC, 0x3D);  // initialize with the I2C addr 0x3D (for the 128×64)
  // init done
  Wire.setClock(400000L);   // set I2C clock to 400kHz
  display.clearDisplay();  // clear the display buffer.
  display.setTextColor(WHITE, BLACK);
  draw_text(2, 0, “Wi-Fi Internet Clock”, 1);
  display.display();
  WiFi.begin(ssid, password);
  Serial.print(“Connecting.”);
  while ( WiFi.status() != WL_CONNECTED ) {
    delay(500);
    Serial.print(“.”);
  }
  Serial.println(“connected”);
  timeClient.begin();
}
char Time[] = ”  :  :  “;
char Date[] = ”  –  -20  “;
byte last_second, second_, minute_, hour_, wday, day_, month_, year_;
void loop()
{
  timeClient.update();
  unsigned long unix_epoch = timeClient.getEpochTime();   // get UNIX Epoch time
  second_ = second(unix_epoch);        // get seconds from the UNIX Epoch time
  if (last_second != second_)
  {
    minute_ = minute(unix_epoch);      // get minutes (0 – 59)
    hour_   = hour(unix_epoch);        // get hours   (0 – 23)
    wday    = weekday(unix_epoch);     // get minutes (1 – 7 with Sunday is day 1)
    day_    = day(unix_epoch);         // get month day (1 – 31, depends on month)
    month_  = month(unix_epoch);       // get month (1 – 12 with Jan is month 1)
    year_   = year(unix_epoch) 2000; // get year with 4 digits – 2000 results 2 digits year (ex: 2018 –> 18)
    Time[7] = second_ % 10 + ‘0’;
    Time[6] = second_ / 10 + ‘0’;
    Time[4] = minute_ % 10 + ‘0’;
    Time[3] = minute_ / 10 + ‘0’;
    Time[1] = hour_   % 10 + ‘0’;
    Time[0] = hour_   / 10 + ‘0’;
    Date[9] = year_   % 10 + ‘0’;
    Date[8] = year_   / 10 + ‘0’;
    Date[4] = month_  % 10 + ‘0’;
    Date[3] = month_  / 10 + ‘0’;
    Date[1] = day_    % 10 + ‘0’;
    Date[0] = day_    / 10 + ‘0’;
    display_wday();
    draw_text(4,  29, Date, 2);        // display date (format: dd-mm-yyyy)
    draw_text(16, 50, Time, 2);        // display time (format: hh:mm:ss)
    display.display();
    last_second = second_;
  }
  delay(200);
}
void display_wday()
{
  switch(wday){
    case 1:  draw_text(40, 15, ” SUNDAY  “, 1); break;
    case 2:  draw_text(40, 15, ” MONDAY  “, 1); break;
    case 3:  draw_text(40, 15, ” TUESDAY “, 1); break;
    case 4:  draw_text(40, 15, “WEDNESDAY”, 1); break;
    case 5:  draw_text(40, 15, “THURSDAY “, 1); break;
    case 6:  draw_text(40, 15, ” FRIDAY  “, 1); break;
    default: draw_text(40, 15, “SATURDAY “, 1);
  }
}
void draw_text(byte x_pos, byte y_pos, char *text, byte text_size)
{
  display.setCursor(x_pos, y_pos);
  display.setTextSize(text_size);
  display.print(text);
}
// End of code.

Video demo:

 

 

 

 

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *