ชื่อโปรเจกต์: นาฬิกาพร้อมจอแสดงผล SH1106 OLED และโมดูล DS1302 RTC

ขออภัยในคุณภาพของภาพถ่ายของผมด้วยครับผมแค่ถ่ายได้ไม่ดีเอง :)
ผมใช้อะไรบ้างในการสร้างโปรเจกต์นี้?

- บอร์ด Arduino UNO clone (คุณสามารถใช้บอร์ดของแท้ได้เลย ผมจนเกินไป).
- โมดูลนาฬิกา DS1302 RTC (Waveshare 9709)
- ปุ่มกด (จะเป็นปุ่มกดแบบไหนก็ได้เลยพี่ชาย)
- จอ OLED ขนาด 1.3" (SH1106 driver)
- เบรดบอร์ด 830-pin
- สายเชื่อมต่อ
ผมประกอบมันอย่างไร?
ขั้นตอนที่ศูนย์:

เปิดเพลงดีๆ ฟังสักหน่อย
ขั้นตอนที่หนึ่ง:

วาง Arduino ไว้ใกล้ๆ กับโปรเจกต์เพื่อต่อสาย
จริงๆแล้วการวางไว้อีกห้องหนึ่งมันไม่ใช่ความคิดที่ดีเลย
ขั้นตอนที่สอง:

ติดตั้งปุ่มกดบนบอร์ดแบบนั้นเลย
ขั้นตอนที่สาม:


ติดตั้ง OLED และ RTC
ขั้นตอนที่สี่:

เชื่อมต่อตามภาพนี้โดยประมาณ นี่คือการเชื่อมต่อขา:
OLED:
GND - Arduino GND
VCC - Arduino 5V
SCL - ช่องเชื่อมต่อ Analog ของ Arduino 5 (A5)
SDA - ช่องเชื่อมต่อ Analog ของ Arduino 4 (A4)
Button:
ขาซ้าย - Arduino GND
ขาขวา - ช่องเชื่อมต่อ Digital ของ Arduino 5 (5 หรือ D5)
RTC:
VCC - Arduino 5V
GND - Arduino GND
I/O - ช่องเชื่อมต่อ Digital ของ Arduino 4 (4 หรือ D4)
SCLK - ช่องเชื่อมต่อ Digital ของ Arduino 3 (3 หรือ D3)
CE - ช่องเชื่อมต่อ Digital ของ Arduino 2 (2 หรือ D2)
ขั้นตอนที่ห้า:
ติดตั้งไลบรารีที่จำเป็น:
Wire.h (ควรจะติดตั้ง/พบได้ใน arduino library manager)
https://github.com/chrisfryer78/ArduinoRTClibrary
Adafruit GFX (ควรจะพบได้ใน arduino library manager)
https://github.com/wonho-maker/Adafruit_SH1106
ขั้นตอนที่หก:
เขียนสคริปต์
ตัวอย่างของผม:
// รวมไลบรารีที่จำเป็น
#include
#include
#include
#include
// ตั้งค่านาฬิกา - virtuabotixRTC clock(SCLK_PIN, I/O_PIN, CE_PIN)
virtuabotixRTC clock(3, 4, 2);
// ตั้งค่าจอแสดงผล
Adafruit_SH1106 display(-1);
int state = 1;
void setup() {
pinMode(5, INPUT_PULLUP);
display.begin(SH1106_SWITCHCAPVCC, 0x3C);
display.setTextColor(WHITE);
drawUI();
display.display();
}
void loop() {
// โหมดพัก/ปิดนาฬิกา
if (digitalRead(5) == LOW) {
if (state == 0) {
delay(500);
drawUI();
state = 1;
}else{
delay(500);
display.drawRect(4, 7, 120, 50, WHITE);
display.fillRect(5, 8, 118, 48, BLACK);
display.setTextSize(1);
display.setCursor(6, 12);
display.println("นาฬิกาจะปิด");
display.println("ลงในไม่ช้า");
display.println("");
display.println(" หากต้องการเปิด");
display.println(" อีกครั้ง ให้กดปุ่ม");
display.display();
delay(3000);
display.clearDisplay();
display.display();
state = 0;
}
}
if (state == 1) {
// อัปเดตเวลาทุกวินาที
clock.updateTime();
drawUI();
display.setTextColor(WHITE);
display.setTextSize(3);
display.setCursor(1, 19);
if (clock.hours < 10) {
display.print("0");
}
display.print(clock.hours);
display.print(":");
if (clock.minutes < 10) {
display.print("0");
}
display.print(clock.minutes);
display.setTextSize(2);
display.print(":");
if (clock.seconds < 10) {
display.print("0");
}
display.print(clock.seconds);
display.setTextSize(1);
display.setCursor(26, 48);
if (clock.dayofweek == 1) {
display.print("วันจันทร์,");
}
if (clock.dayofweek == 2) {
display.print("วันอังคาร,");
}
if (clock.dayofweek == 3) {
display.print("วันพุธ,");
}
if (clock.dayofweek == 4) {
display.print("วันพฤหัสบดี,");
}
if (clock.dayofweek == 5) {
display.print("วันศุกร์,");
}
if (clock.dayofweek == 6) {
display.print("วันเสาร์,");
}
if (clock.dayofweek == 7) {
display.print("วันอาทิตย์,");
}
display.setCursor(26, 56);
if (clock.dayofmonth < 10) {
display.print("0");
}
display.print(clock.dayofmonth);
display.print(".");
if (clock.month < 10) {
display.print("0");
}
display.print(clock.month);
display.print(".");
display.print(clock.year);
display.display();
delay(999);
}
}
void drawUI() {
// วาด GUI
display.clearDisplay();
display.setTextSize(1);
display.setCursor(2, 2);
display.println(" นาฬิกาของ Adam ส