โปรเจกต์ LED Matrix NTP Clock พร้อม DS3231, BME280, BH1750 & ESP01
ปรับปรุง Project เดิมเพื่อเพิ่ม Sensor และปุ่มกดเพิ่มเติม สามารถใช้ ESP01 เพื่อตั้งเวลาผ่าน NTP ได้
ปรับปรุง Project เดิมเพื่อเพิ่ม Sensor และปุ่มกดเพิ่มเติม สามารถใช้ ESP01 เพื่อตั้งเวลาผ่าน NTP ได้
▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์
นี่คือสิ่งที่ทำให้ผมเริ่มสนใจ 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
รูปภาพและคำแนะนำเพิ่มเติมจะตามมาในเร็วๆ นี้...











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




























การต่อสาย (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";
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้