โปรเจกต์ Astronomical Clock พร้อม RTC ds3231
Astronomical clock ที่มี 16 functions โดยใช้เพียงสาม shift registers
Astronomical clock ที่มี 16 functions โดยใช้เพียงสาม shift registers
▶ กดเพื่อดูวิดีโอสาธิตโปรเจกต์
หลายปีก่อนผมสั่งซื้อ 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 ดังนั้นคุณจึงสามารถสร้างข้อความบางอย่างได้ด้วย
สนับสนุนเพื่อรับ Source Code หรือแอปพลิเคชันสำหรับโปรเจกต์นี้
ประเมิน Project
เอาฟอร์มยาวออกจากท้ายหน้า Project แล้ว เหลือเป็นปุ่มให้กดไปกรอกหน้าเดียว ตัวใหญ่ เว้นบรรทัดเยอะ อ่านง่ายกว่า
รีวิวจากคนใช้งานจริง
ถ้าเคยสั่งงาน เคยอ่านหน้านี้แล้วได้ประโยชน์ หรือมีข้อเสนอแนะ ฝากรีวิวไว้ได้เลย
ยังไม่มีรีวิวบนหน้านี้ ถ้าเคยใช้งานหรือมีข้อเสนอแนะ เขียนเป็นคนแรกได้เลย