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

โปรเจกต์ Astronomical Clock พร้อม RTC ds3231

Astronomical clock ที่มี 16 functions โดยใช้เพียงสาม shift registers

โปรเจกต์ Astronomical Clock พร้อม RTC ds3231

วิดีโอสาธิต

Video

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

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

1x Grove - Barometer Sensor (BMP280)
🛒 สั่งซื้อ
4x Toggle Switch, Toggle
-
1x Rotary Encoder with Push-Button
🛒 สั่งซื้อ
3x Shift Register- Parallel to Serial
-
1x DS3231MPMB1 Peripheral Module
🛒 สั่งซื้อ
2x Transistor driver UDN2981
-
1x Soldering iron (generic)
-

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

หลายปีก่อนผมสั่งซื้อ 7-segment display มา 12 ตัว ผมอยากทำนาฬิกาที่แสดงเวลาและวันที่ได้ แต่ดูเหมือนว่ามันต้องใช้ digital IC จำนวนมากเกินไปที่จะทำให้สำเร็จ ปัจจุบันมี Arduino แล้ว และตอนนี้การทำมันจึงง่ายขึ้นมาก

นาฬิกาเรือนนี้สามารถแสดงเวลาและวันที่, อายุดวงจันทร์เป็นจำนวนวัน, เวลาพระอาทิตย์ขึ้นและพระอาทิตย์ตก, ระดับความสูงสูงสุดของดวงอาทิตย์, ระดับความสูงจริงของดวงอาทิตย์, ความเอียงของโลก, ระยะเวลาระหว่างพระอาทิตย์ขึ้นถึงพระอาทิตย์ตก, ความกดอากาศในหน่วย mBar, อุณหภูมิในหน่วย celsius, โหมด Adjust สำหรับตั้งเวลาและวันที่ และตั้งค่า aging register ของ RTC

นาฬิกาเรือนนี้ใช้สัญญาณ 1 Hz SQW จาก RTC เป็น interrupt ผมเขียน routines สำหรับ RTC (DS3231) ขึ้นมาเอง ดังนั้นจึงไม่จำเป็นต้องโหลด RTC library

เนื่องจากผมใช้วิธี multiplexing สิ่งแรกที่ผมทำคือเชื่อมต่อ a-segment ของ display ทั้ง 12 ตัวเข้าด้วยกัน รวมถึง b-segment, และ c, d, e, f, g และ dot segment ด้วย ดูรูปภาพของ displayboard ประกอบ

จากนั้นผมได้ทำ Board เล็กๆ สำหรับ shift registers ทั้งสามตัว (SN74595)

ผมใช้ resistors ขนาด 220 Ohm เพราะกระแสสูงสุดของ segments คือ 20 mA

กระแสไฟฟ้าคือ (5-1.8)/220=14.5 mA เนื่องจากผมไม่แน่ใจว่ากระแสจะเป็นเท่าไหร่ ผมจึงใส่ transistor drivers (UDN2981) สองตัวที่ขา CA (Common Anode) ของแต่ละ display กระแส output สูงสุดของ shiftregister คือ 35 mA ในทางทฤษฎีเมื่อ segments ทุกส่วนสว่างขึ้น กระแสควรจะเป็น 8*14.5 = 116 mA

ซึ่งมากเกินไปสำหรับ shiftregister แต่ในความเป็นจริงมันจะน้อยกว่านั้นเนื่องจากผลของการ multiplexing

Board2- CN1 เชื่อมต่อกับ CN1 ของ display board ขาด้านซ้ายของ connector คือ display แถวบนตัวแรก ขาที่สองคือ display ตัวที่สอง ฯลฯ

Board2- CN2 เชื่อมต่อกับ CN2 ของ display board ขาด้านซ้ายของ connector คือ display แถวล่างตัวแรก ขาที่สองคือ display ตัวที่สอง ฯลฯ

Board2- CN3 เชื่อมต่อกับ CN3 ของ display board ขาด้านซ้ายของ connector คือ a-segment, ขาที่สองคือ b-segment ไปจนถึง e-segment

Board2- CN4 เชื่อมต่อกับ CN4 ของ display board ขาด้านซ้ายของ connector คือ f-segment, ขาที่สองคือ g-segment, ขาด้านขวาคือ dot-segment

ตัว program จะตรวจสอบสถานะของ switches ทั้งสี่ตัว (ใน void loop)

ใน loop เวลาจะถูกอัปเดตวินาทีละครั้ง และ sensor วัดความกดอากาศจะถูกอ่านค่าทุกๆ 3 วินาที

วิดีโอถัดไปจะแสดงการเริ่มทำงานของนาฬิกา จากนั้นจะแสดงเวลาและวันที่

ด้วย switches สี่ตัว ทำให้มีฟังก์ชันการทำงานได้ 16 แบบ

ฟังก์ชันทั้ง 16 แบบมีดังนี้:

Switch  position 0000

upper display: เวลา

lower display: วันที่ (วัน, เดือน, ปี)

Switch  position 0001

upper display: dn = (จำนวนวันนับจากวันที่ 1 มกราคม)

lower display: n = อายุดวงจันทร์เป็นจำนวนวัน

Switch  position 0010

upper display: จำนวนวินาทีนับจากเที่ยงคืน (สูงสุด = 86400)

lower display: จำนวนนาทีนับจากวันที่ 1 มกราคม

Switch  position 0011

upper display: p = พระอาทิตย์ขึ้น (ขึ้นอยู่กับ latitude และ longitude ท้องถิ่น)

lower display: n = พระอาทิตย์ตก

Switch  position 0100

upper display: H = ระดับความสูงสูงสุดของดวงอาทิตย์ตอนเที่ยงในหน่วยองศา

lower display: n = ระดับความสูงจริงของดวงอาทิตย์ (จะเป็นศูนย์เมื่อพระอาทิตย์ขึ้นหรือตก)

Switch  position 0101

upper display: ความเอียงของโลกในหน่วยองศา (เป็นศูนย์ในช่วงเริ่มต้นของฤดูใบไม้ผลิและฤดูใบไม้ร่วง, +23.5 ในช่วงเริ่มต้นของฤดูร้อน, -23.5 ในช่วงเริ่มต้นของฤดูหนาว)

lower display: dL = ระยะเวลาระหว่างพระอาทิตย์ขึ้นถึงพระอาทิตย์ตก = แสงกลางวัน

Switch  position 0110

upper display: L = ความกดอากาศในหน่วย mBar

lower display: t = อุณหภูมิในหน่วย celsius

Switch  position 0111

upper display: AdjUst

lower display: ว่างเปล่า

คุณสามารถตั้งเวลา วันที่ และ aging register ของ RTC ได้ รวมถึงสามารถตั้งค่า latitude และ longitude ได้

Switch  position 1000

upper display: เวลา

lower display: เวลาในรูปแบบ binary (ยกเว้นหมายเลข 8 และ 9)

Switch  position 1001

upper display: dow 6, หมายเลขของวันในสัปดาห์, 1 = วันอาทิตย์, 2 = วันจันทร์ ฯลฯ...

lower display: unr 45, หมายเลขสัปดาห์

Switch  position 1010

upper display : u = Azimuth ของโลกในหน่วยองศา

lower display : n = Azimuth ของดวงจันทร์ในหน่วยองศา

ตำแหน่งบนขอบฟ้า: 0 = เหนือ, 90 = ตะวันออก, 180 = ใต้, 270 = ตะวันตก)

Switch  position 1011

upper display : t = Equation of time

lower display : H = มุมระหว่างโลกและดวงจันทร์

มุม : 0 = จันทร์ดับ (new moon), 90 = ข้างขึ้นครึ่งดวง (first quarter), 180 = จันทร์เต็มดวง (full moon), 270 = ข้างแรมครึ่งดวง (last quarter)

Switch  position 1100

upper display : u = ตำแหน่งพระอาทิตย์ขึ้นบนขอบฟ้า ( 90 = ตะวันออก, ในช่วงเริ่มต้นของฤดูใบไม้ผลิหรือฤดูใบไม้ร่วง)

lower display : n = ตำแหน่งพระอาทิตย์ตกบนขอบฟ้า ( 270 = ตะวันตก, ในช่วงเริ่มต้นของฤดูใบไม้ผลิหรือฤดูใบไม้ร่วง)

Switch  position 1101

upper display : b = Latitude

lower display : L = Longitude

Switch  position 1110

upper display : u = เวลาที่ดวงอาทิตย์อยู่ในตำแหน่งทิศใต้

lower display : เปอร์เซ็นต์ความสว่างของดวงจันทร์

Switch  position 1111

Night mode: เมื่อเวลาอยู่ระหว่างเที่ยงคืนถึง 8 โมงเช้า display จะว่างเปล่า,

มิฉะนั้น: จะแสดง:

upper display: เวลา

lower display: วันที่ (วัน, เดือน, ปี)

คำอธิบายของ code

Time

ดู ที่ code : void Tijd()

//---------------------------------------------------------------------------------

void Tijd() { // เวลาบน display1 และวันที่บน display2

int test;

test = a % 2;

if (test == 0) {

display1( Data1[f], Data1[e] - 1, Data1[d], Data1[c], Data1[b], Data1[a]);

} else {

display1( Data1[f], Data1[e], Data1[d], Data1[c] - 1, Data1[b], Data1[a]);

}

display2( Data1[h], Data1[g] - 1, Data1[j], Data1[i] - 1, Data1[m], Data1[k]);

// เมื่อคุณใส่ '' - 1'' ต่อท้าย ""]", จุดบน display จะสว่างขึ้น ดังนั้นในบรรทัด

display2(.....) display ตัวที่ 2 และ 4 จะมีจุดสว่างขึ้น

}

//---------------------------------------------------------------------------------

Variable ตัวแรก Data[f] คือ display บนซ้ายตัวแรก

e และ f คือ hour variables เมื่อเวลาคือ 15 นาฬิกา

ค่า f=1 โปรแกรมจะค้นหาใน array Data1[f] และพบในตำแหน่งที่สอง (ศูนย์คือตำแหน่งแรก คอมพิวเตอร์นับจากศูนย์) เป็นตัวเลข 243 และนั่นคือข้อมูลที่จะส่งไปยัง shiftregister ตัวเลข 243 คือหมายเลขหนึ่งสำหรับ display ตัวแรก ข้อมูลนี้จะคงอยู่เพียงช่วงสั้นๆ จากนั้นโปรแกรมจะอ่าน Data1[e] ตัวถัดไป และพบที่ตำแหน่ง 6 เป็นตัวเลข 37 ซึ่งเป็นข้อมูลที่จะส่งไปยัง shiftregister ตัวเลข 37 คือหมายเลข 5 สำหรับ display ตัวที่สอง เป็นต้น......

ดังนั้น ในบรรทัด display1(x,x,x,x,x,x); จะมี 6 variables สำหรับ display แถวบน โดยตัวแรกคือ display ด้านซ้ายตัวแรก ตัวที่สองคือ display ตัวที่สอง เป็นต้น...

ในบรรทัด display2(x,x,x,x,x,x); จะมี 6 variables สำหรับ display แถวล่าง โดยตัวแรกคือ display ด้านซ้ายตัวแรก ตัวที่สองคือ display ตัวที่สอง เป็นต้น...

เมื่อคุณเห็นเพียงตัวเลข นั่นคือตัวเลขที่สร้างขึ้นเอง เมื่อคุณเห็นตัวเลข 67 บน display คุณจะเห็นตัวอักษร d, 25 คือ P, 143 คือ L, 195 คือ j, 15 คือ t, 199 คือ u

95 คือ r, 18 คือ H ดังนั้นคุณจึงสามารถสร้างข้อความบางอย่างได้ด้วย

Code

🔒 ปลดล็อก Code

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

รหัสอ้างอิงโปรเจกต์: astronomical-clock-with-rtc-ds3231-e63235
2450 บาท
PromptPay QR Code

ประเมิน Project

อยากได้งานคล้ายโปรเจคนี้? กดไปหน้าประเมินราคา

เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า

รีวิวจากคนใช้งานจริง

รีวิวจากลูกค้าและคนที่เคยใช้งาน

ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย

กำลังโหลดรีวิว...