หน้าแรก ดูโปรเจกต์ทั้งหมด
Expert

โปรเจกต์ LED Matrix NTP Clock พร้อม DS3231, BME280, BH1750 & ESP01

ปรับปรุง Project เดิมเพื่อเพิ่ม Sensor และปุ่มกดเพิ่มเติม สามารถใช้ ESP01 เพื่อตั้งเวลาผ่าน NTP ได้

โปรเจกต์ LED Matrix NTP Clock พร้อม DS3231, BME280, BH1750 & ESP01

วิดีโอสาธิต

Video

▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์

รายการอุปกรณ์และเครื่องมือ

1x LM3940IT3.3
-
1x BH1750 Light Sensor
🛒 สั่งซื้อ
2x Capacitor 10 µF
-
1x Level Shifter Board
-
1x SparkFun Atmospheric Sensor Breakout - BME280
-
1x Max7219 32x8 LED Matrix
-
1x DS3231MPMB1 Peripheral Module
🛒 สั่งซื้อ
}

รายละเอียดและวิธีทำ

นี่คือสิ่งที่ทำให้ผมเริ่มสนใจ Arduino ผมได้ไปเจอ LED Word Clock ของ Nick และคิดว่าอยากจะลองสร้างมันขึ้นมาบ้าง

ตั้งแต่ดาวน์โหลดโค้ดของเขามา ผมก็ได้นำมาปรับปรุงโดยเพิ่ม Sensor และปุ่มกดพิเศษเข้าไป รวมถึงเพิ่ม ESP01 อีกด้วย

BH1750 ถูกนำมาใช้เพื่อปรับความสว่างหน้าจออัตโนมัติตามสภาพแสง และสามารถปิดหน้าจอตอนกลางคืนได้ ส่วน BME280 จะแสดงค่าอุณหภูมิ ความชื้น และความกดอากาศ สำหรับ ESP01 นั้นใช้สำหรับดึงเวลาจาก pool.ntp.org

ปุ่มที่เพิ่มเข้ามาช่วยให้การปรับแต่งการตั้งค่าทำได้ง่ายขึ้น คุณสามารถปรับการตั้งค่า Light Sensor ผ่านปุ่มกด รวมถึงเปลี่ยน Font และตั้งค่า NTP/DST/UTC ได้

มีการเพิ่ม Font ใหม่เข้าไป 6 แบบ โดยผมสร้าง Font เหล่านี้จาก: http://dotmatrixtool.com/.

ผมได้แก้ไข Word Clock ไปค่อนข้างมาก ตอนนี้มีคำศัพท์เพิ่มขึ้น และได้ย้ายข้อมูลหลายส่วนไปเก็บไว้ใน PROGMEM เพื่อประหยัด RAM

หน้าโปรเจกต์ของ Nick: https://123led.wordpress.com/mini-led-clock/

โค้ดของผม: https://github.com/Ratti3/miniclock

ตอนนี้โค้ดเสร็จสมบูรณ์แล้ว ยกเว้น Bug ที่อาจจะยังไม่พบและการปรับจูนเล็กน้อยในบางจุด หลังจากนี้ผมจะทำ Case ให้กับมัน

คุณจำเป็นต้องปรับแต่งโค้ดส่วน Light Sensor ให้เข้ากับสภาพแสงของคุณเอง เนื่องจากผมเขียนโค้ดนี้ตอนที่มีแสงแดดจ้าขณะนั่งอยู่ข้างหน้าต่าง

ESP01 ใช้สำหรับดึงเวลาผ่าน NTP โดยตัว ESP01 ถูกเขียนโค้ดให้ Sleep (ปิด WiFi) เมื่อไม่ได้ใช้งาน และจะถูกปลุกผ่าน Serial เพื่อดึงเวลาในรูปแบบ UNIX ส่วนชื่อ SSID และรหัสผ่านจะถูกส่งผ่านโค้ด Arduino เพื่อความสะดวก

เวอร์ชันนี้ยังมีการคำนวณ DST/UTC และ BST ซึ่งสามารถปรับแต่งหรือปิดการใช้งานได้ผ่านเมนู

การตั้งค่าจะถูกบันทึกลงใน EEPROM ซึ่งหมายความว่าหากคุณปิดเครื่องแล้วเปิดใหม่ การตั้งค่าที่เปลี่ยนผ่านเมนูจะยังคงถูกบันทึกไว้

นี่คือไฟล์โค้ดบน Github:

Code on Github [https://github.com/Ratti3/miniclock]:
Arduino
LEDClock32x8.ino
ProgmemData.h
Arduino
ESP-01_NTP.ino
LEDClock32x8_ESP01-NTP.ino
ProgmemData.h

เมื่อ ESP01 กำลังทำงาน Arduino Serial จะแสดงข้อความดังนี้:

Arduino : Sent NTP request to ESP01
ESP01 : NTP request received from Arduino
[attempt 1 of 3]
Connecting to SSID: TheInternets....connected
SSID: TheInternets, IP Address: 192.168.0.135
Signal Strength (RSSI): -42 dBm
Sending NTP packet to: 195.195.221.100 [attempt 1]
Sending NTP packet to: 195.195.221.100 [attempt 2]
UNIX1562848457
Disabling WiFi....ok

รูปภาพและคำแนะนำเพิ่มเติมจะตามมาในเร็วๆ นี้...

โปรเจกต์ที่เสร็จสมบูรณ์

เวอร์ชัน ESP01 ซึ่ง ESP01 จำเป็นต้องมี Regulator 3.3V ที่สามารถจ่ายกระแสได้เพียงพอ

เวอร์ชัน Arduino อย่างเดียว

การประกอบทั้งหมดเข้าด้วยกัน:

การต่อสาย (Wiring):

DS3231, BH1750 และ BME280:
SCL PINS = A5
SDA PINS = A4
VCC = 3.3v
LED Matrix:
CLK = D11
CS = D10
DIN = D12
VCC = 5v
Switches:
D2 - Menu
D3 - Date / +
D4 - Temp / -
D5 - Display options
ESP01 - เสริม
D7 - TX pin of ESP01
D6 - RX pin of ESP01

นี่คือตัวแปร Global ที่คุณสามารถเปลี่ยนแปลงได้:

// ตัวแปร Global (ค่าเริ่มต้นที่เปลี่ยนได้), ตัวเลขในวงเล็บ [] คือตำแหน่งที่เก็บข้อมูลใน EEPROM สำหรับค่านั้นๆ
// การตั้งค่านาฬิกา
// [200] ค่าความสว่างเริ่มต้น (0-15) สามารถตั้งค่าผ่านเมนูได้
byte intensity = 2;
// [201] โหมดนาฬิกาเริ่มต้น ค่าเริ่มต้นคือ 0 (basic_mode)
byte clock_mode = 0;
// [206] กำหนดโหมดสุ่ม - เปลี่ยนรูปแบบการแสดงผลทุกๆ ไม่กี่ชั่วโมง ค่าเริ่มต้นคือ 0 (ปิด)
bool random_mode = 0;
// [207] กำหนดโหมดสุ่ม Font - เปลี่ยน Font ทุกๆ ไม่กี่ชั่วโมง 1 = เปิดการสุ่ม Font
bool random_font_mode = 0;
// [208] กำหนดรูปแบบเวลา 12 หรือ 24 ชั่วโมง 0 = 24 ชั่วโมง, 1 = 12 ชั่วโมง
bool ampm = 0;
// การตั้งค่าแสง
// [202] โหมดเปิด/ปิดหน้าจอเริ่มต้น ใช้โดย Light Sensor 0 = ปกติ, 1 = เปิดตลอดเวลา, 2 = ปิดตลอดเวลา, 3 - 5 = กำหนดตามค่า hour_off_1,2,3
byte display_mode = 5;
// [209] การตั้งค่าความสว่างอัตโนมัติเริ่มต้น
bool auto_intensity = 1;
// ทั้งสามตัวนี้กำหนดชั่วโมงที่ Light Sensor สามารถปิดหน้าจอได้หากมืดพอ รูปแบบคือ 24 ชั่วโมง โดยฟังก์ชันนี้จะ
// ตรวจสอบระหว่างช่วงเวลา 8.00 น. ถึงค่าใดค่าหนึ่งเหล่านี้
byte hour_off_1 = 21;
byte hour_off_2 = 22;
byte hour_off_3 = 23;
// การตั้งค่า Font - ตั้งค่าผ่านเมนู setup Font ดูรายละเอียดค่าเริ่มต้นทั้งหมดที่ฟังก์ชัน set_font_case():
// [203] รูปแบบ Font ขนาดใหญ่เริ่มต้นของนาฬิกา
byte font_style = 2;
// [204] การปรับ Offset ของ Font ขนาดใหญ่
byte font_offset = 1;
// [205] การปรับ Column ของ Font ขนาดใหญ่
byte font_cols = 6;
// การตั้งค่า DST NTP และ UTC
// [210] เปิดใช้งานฟังก์ชัน DST, 1 = เปิด, 0 = ปิด
bool dst_mode = 1;
// [211] เปิดใช้งานฟังก์ชัน NTP, 1 = เปิด, 0 = ปิด
bool ntp_mode = 1;
// จำนวนวินาทีเพื่อปรับค่า NTP ก่อนนำไปใช้กับ DS3231 เนื่องจากต้องใช้เวลาสองสามร้อยมิลลิวินาทีในการประมวลผลข้อมูลจาก ESP01
byte ntp_adjust = 1;
// [213] การปรับค่า UTC Offset ในหน่วยชั่วโมง
int8_t utc_offset = 0;
// ชั่วโมงที่การ Sync NTP/DST รายวันเกิดขึ้น ควรปล่อยไว้ที่ตี 2 หากใช้โหมด DST
byte ntp_dst_hour = 2;
// จำนวนครั้งที่พยายามส่ง NTP Request 1 ครั้งจะใช้เวลาประมาณ 35 วินาทีโดยรวม ค่าที่ใช้ได้คือ 1 - 9
byte ntp_max_retry = 3;
// ใช้สำหรับคำนวณเวลาที่จะหยุด ntp() เมื่อไม่ได้รับข้อมูล หน่วยเป็นวินาที โดยจะถูกคูณด้วย ntp_max_retry
byte ntp_timeout = 45;
// ค่าคงที่ Global - SSID และรหัสผ่านสำหรับ WiFi ซึ่งจะถูกส่งไปยัง ESP01 ผ่าน SoftwareSerial
// ความยาวรวมของ SSID และรหัสผ่านห้ามเกิน 72 ตัวอักษร
// ความยาวของชื่อ SSID ของคุณ เช่น SSID = MyWifi, ssid_len = 6
const byte ssid_len = 8;
// ชื่อ SSID ของคุณ เช่น MyWifi
const char ssid[] = "YourSSID";
// ความยาวของรหัสผ่าน SSID ของคุณ เช่น password = password, pass_len = 8
const byte pass_len = 12;
// รหัสผ่าน SSID ของคุณ เช่น password
const char pass[] = "YourPassword";

Code

🔒 ปลดล็อก Code

สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้

รหัสอ้างอิงโปรเจกต์: led-matrix-ntp-clock-with-ds3231-bme280-bh1750-esp01-ff3121
2450 บาท
PromptPay QR Code