สารบัญ:
2025 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2025-01-13 06:58
ฉันต้องการนาฬิกาเพื่อช่วยให้ลูกแฝดวัย 4 ขวบของฉันเรียนรู้ที่จะนอนให้นานขึ้นอีกหน่อย (ฉันมีเวลาพอที่จะตื่นตอน 5:30 น. ในวันเสาร์ตอนเช้า) แต่พวกเขาก็ยังอ่านเวลาไม่ได้ หลังจากดูสินค้าสองสามรายการในเว็บไซต์ช็อปปิ้งยอดนิยม ฉันคิดว่า มันยากแค่ไหนที่จะสร้างมันขึ้นมา!
นี่คือสิ่งที่ฉันคิดว่าฉันต้องการในโครงการนี้ มันจะใช้ RGB LED บางตัว (ส่วนใหญ่เพราะฉันมีประมาณห้าสิบตัวจากโปรเจ็กต์อื่น) เพื่อแสดงสีที่ต่างกันสามสี สีแดงหมายถึงกลับไปนอนเร็วเกินไปที่จะตื่น สีเหลืองหมายความว่าพวกเขาสามารถลุกขึ้นและเล่นอย่างเงียบ ๆ ในห้องของพวกเขา แน่นอนว่าสีเขียวหมายความว่าคุณสามารถลุกขึ้นได้ ฉันยังต้องการที่จะปรับเวลาเพราะฉันอยากจะนอนให้นานขึ้นในบางวัน (วันหยุดสุดสัปดาห์/วันหยุดเทียบกับวันธรรมดาและอื่นๆ)
เสบียง
Raspberry Pi Zero W
ไฟ LED RGB สองดวง
ตัวต้านทาน 220 โอห์ม 6 ตัว
พบไฟล์ (.stl, python, html) ที่นี่
สกรู สายไฟ และชิ้นส่วนขนาดเล็กต่างๆ ตามต้องการ
ขั้นตอนที่ 1: การพิมพ์ 3 มิติ
ลูกสาวของฉันเหมือนยูนิคอร์นจริงๆ ดังนั้นสำหรับโปรเจ็กต์นี้ ฉันรีมิกซ์ Unicorn Nightlight ของ Riven02 ซึ่งเป็นเพลงรีมิกซ์ของ Unicorn Trophy ของ Apachcreation ซึ่งสามารถพบได้บน Thingiverse.com และใช้ภายใต้ใบอนุญาต Creative Commons Non-Commercial ฉันแก้ไขฐานยูนิคอร์นให้พอดีกับสายไฟสำหรับราสเบอร์รี่ pi ศูนย์ ฉันบังเอิญมี AMZ3D Red PLA วางอยู่รอบ ๆ ดังนั้นฐานและหัวของยูนิคอร์นจะเป็นสีแดง ฉันใช้ PLA แบบใส/โปร่งแสงสำหรับแตร ไฟล์.stl และการตั้งค่าที่ฉันใช้คือ:
Unicorn.stl
- ความสูงของชั้น: 0.02
- ความหนาของผนัง:.8
- จำนวนเส้นผนัง: 2
- เติม: 15%
- รูปแบบการเติม: Grid
UnicornBase.stl
- ความสูงของชั้น: 0.02
- ความหนาของผนัง:.8
- จำนวนเส้นผนัง: 2
- เติม: 15%
- รูปแบบการเติม: Grid
Horn.stl
- ความสูงของชั้น: 0.02
- ความหนาของผนัง: 0.8
- จำนวนเส้นผนัง: 3
- เติม: 0
ขั้นตอนที่ 2: วงจร
วงจรค่อนข้างง่าย ฉันเลือกพิน GPIO ที่แตกต่างกันหกตัวเพื่อควบคุมการเปิด/ปิดสำหรับสีต่างๆ ของ RGB หมุดเหล่านั้นและสี LED ที่เกี่ยวข้องคือ:
- ปักหมุด 11 เป็น RGB 1 สีแดง
- ปักหมุด 13 เป็น RGB 1 สีเขียว
- ปักหมุด 15 เป็น RGB 1 BLUE
- ปักหมุด 16 ถึง RGB 2 RED
- ปักหมุด 18 ถึง RGB 2 สีเขียว
- ปักหมุด 36 ถึง RGB 2 BLUE
- ปักหมุด 39 ลงกราวด์
แต่ละพินเชื่อมต่อกับตัวต้านทานผ่านตัวต้านทาน จำกัด กระแส 220 โอห์ม (ยกเว้นกราวด์แน่นอน) ฉันบัดกรีตัวต้านทานในแนวเดียวกันและปิดด้วยท่อหดความร้อน
ขั้นตอนที่ 3: การเตรียมราสเบอร์รี่ Pi
ฉันต้องการตั้งเวลาสำหรับนาฬิกาฝึกการนอนหลับโดยใช้อินเทอร์เฟซบนเว็บ ดังนั้นฉันจึงต้องตั้งค่าเซิร์ฟเวอร์ Apache และ PHP บน Raspberry Pi สิ่งแรกที่คุณควรทำเมื่อติดตั้งซอฟต์แวร์ใหม่บน Raspberry Pi คือต้องแน่ใจว่าเป็นเวอร์ชันล่าสุดโดยพิมพ์:
sudo apt-get update
หลังจากนั้นเราสามารถลงมือทำธุรกิจได้จริงๆ เราจะทำโดยการติดตั้ง Apache2:
sudo apt-get ติดตั้ง apache2 -y
สิ่งนี้ควรติดตั้งเว็บเซิร์ฟเวอร์ Apache คุณสามารถทดสอบสิ่งนี้ได้โดยใช้เบราว์เซอร์บน Raspberry pi และไปที่:
localhost/
หรือโดยการนำทางจากเบราว์เซอร์ของคอมพิวเตอร์เครื่องอื่นไปยังที่อยู่ IP ของ Raspberry Pi วิธีค้นหาประเภทที่อยู่ IP ของคุณ:
ชื่อโฮสต์ -I
การทำเช่นนี้จะนำไปสู่หน้า Apache Web Server เริ่มต้น ซึ่งสามารถเปลี่ยนแปลงได้โดยแทนที่ index.html ที่อยู่ในไดเร็กทอรี /var/www/html/ สามารถแทนที่ด้วยไฟล์ index.html ของฉันเอง
ต่อไปเราจะตั้งค่าเว็บเซิร์ฟเวอร์ Apache เพื่อให้สามารถเรียกใช้ไฟล์ PHP ได้ เริ่มต้นด้วยการพิมพ์:
sudo apt-get ติดตั้ง php libapache2-mod-php -y
ในตอนนี้ คุณควรจะสามารถวางไฟล์ sleepset.php ลงใน /var/www/html ด้วยไฟล์ index.html
เพื่อไปยังหน้านี้ในเครือข่ายของคุณเอง คุณจะต้องตั้งค่า Raspberry Pi ของคุณด้วยที่อยู่ IP แบบคงที่ (หรือคุณอาจลองหาที่อยู่ IP ใหม่เมื่อเครือข่ายของคุณต่ออายุก็ได้) คุณจะต้องแก้ไขไฟล์สองสามไฟล์จึงจะใช้งานได้ คุณจะต้องแก้ไขไฟล์ /etc/dhcpcd.conf ดังต่อไปนี้:
อินเทอร์เฟซ wlan0
ip_address แบบคงที่=192.168.1.เราเตอร์แบบคงที่=192.168.1.1 โดเมนแบบคงที่_name_servers=192.168.1.1
แทนที่ด้วยข้อมูลเครือข่ายของคุณ สิ่งเดียวที่คุณต้องทำตอนนี้คือรีบูต
sudo รีบูต
ตำแหน่งของไฟล์จากลิงก์ของ Google ไดรฟ์ควรเป็นดังนี้:
- index.html และ sleepset.php ควรอยู่ในไดเร็กทอรี /var/www/html
- sleepset.txt และ sleeptrainer1_1.py ควรอยู่ในไดเร็กทอรี /home/pi/pythoncode (คำใบ้: คุณจะต้องสร้างไดเร็กทอรีนี้)
หลังจากวางไฟล์เหล่านี้ในไดเร็กทอรีที่ถูกต้อง ไฟล์ rc.local จะต้องได้รับการแก้ไขเพื่อรันโปรแกรม sleeptrainer1_1.py เมื่อเริ่มต้น คุณจะต้องมีสิทธิ์เข้าถึงระดับรูทเพื่อแก้ไขไฟล์ rc.local ดังนั้นให้พิมพ์:
sudo nano /etc/rc.local
ในตัวแก้ไข ให้เลื่อนลง และก่อนถึงบรรทัด exit 0 ให้เพิ่ม:
หลาม /home/pi/pythoncode/sleeptrainer1_1.py &
มีสองสิ่งที่ต้องจำไว้ที่นี่:
- ใช้เส้นทางไฟล์แบบสัมบูรณ์เพื่อให้ LINUX ไม่คิดว่าไฟล์ sleeptraner1_1.py อยู่ในไดเรกทอรีเดียวกับ rc.local
- อย่าลืมเครื่องหมายและ (&) ที่ท้าย สิ่งนี้จะทำให้ LINUX สามารถเรียกใช้ไฟล์นี้ในพื้นหลังและทำการบูทต่อไป
ตอนนี้ บันทึกไฟล์โดยพิมพ์ ctrl-x ตามด้วย y เมื่อได้รับพร้อมท์ให้บันทึก จากนั้นกด ENTER
จากนั้นพิมพ์ sudo reboot
ควรจะกล่าวถึงในที่นี้ว่า (อย่างน้อย) คุณควรเปลี่ยนรหัสผ่าน Raspberry Pi โดยใช้คำสั่ง passwd ถ้ายังไม่ได้ทำตอนนี้ก็เป็นเวลาที่ดี
ขั้นตอนที่ 4: รหัส
ต่อไปนี้เป็นรหัสจากไฟล์ sleeptrainer1_1.py ฉันใช้วัตถุ datetime เพื่อเปรียบเทียบเวลาที่อ่านในไฟล์ sleepset.txt ไฟล์ข้อความมีเพียงสองบรรทัด อันแรกเป็นชั่วโมง ที่สองเป็นนาที sleeptrainer1_1.py สลีปเป็นเวลาหนึ่งนาทีระหว่างการวนซ้ำเพื่อไม่ให้ผูกกับโปรเซสเซอร์ เดิมทีแสงสีเขียวออกมาสว่างเกินไป ดังนั้นฉันจึงใช้การปรับความกว้างพัลส์เพื่อลดแสงเมื่อใช้สีแดงเพื่อทำให้เป็นสีเหลือง
รหัสหลาม:
นำเข้า RPi. GPIO เป็น GPIO
จากวันที่และเวลานำเข้า วันที่และเวลาเป็นเวลานำเข้า dt GPIO.setmode(GPIO. BOARD) GPIO.setwarnings (False) red1 = 11 red2 = 16 green1 = 13 green2 = 18 blue1 = 15 blue2 = 36 GPIO.setup (red1, GPIO. OUT) GPIO.setup(red2, GPIO. OUT) GPIO.setup(green1, GPIO. OUT) GPIO.setup(green2, GPIO. OUT) GPIO.setup(blue1, GPIO. OUT) GPIO.setup(blue2, GPIO. OUT) p1 = GPIO. PWM(green1, 100) p2 = GPIO. PWM(green2, 100) def readset(): setfile = open("/home/pi/pythoncode/sleepset.txt", 'r') a = setfile readline() b = setfile.readline() a = int(a) b = int(b) คืนค่า a, b def ledlight(color): if (color == "red"): GPIO.output(red1, GPIO. สูง) GPIO.output(red2, GPIO. HIGH) p1.stop() p2.stop() GPIO.output(blue1, GPIO. LOW) GPIO.output(blue2, GPIO. LOW) elif (color == "blue"): GPIO.output(red1, GPIO. LOW) GPIO.output(red2, GPIO. LOW) p1.stop() p2.stop() GPIO.output(blue1, GPIO. HIGH) GPIO.output(blue2, GPIO. สูง) elif (สี == "สีเขียว"): GPIO.output(red1, GPIO. LOW) GPIO.output(red2, GPIO. LOW) p1.start(100) p2.start(100) GPIO.output(blue1, GPIO. LOW) GPIO.output(blue2, GPIO. LOW) elif (color == "yellow"): p1.start(60) p2.start(60) GPIO.output(red1, GPIO. HIGH) GPIO.output (red2, GPIO. HIGH) GPIO.output(blue1, GPIO. LOW) GPIO.output(blue2, GPIO. LOW) elif (สี == "ปิด"): GPIO.output(red1, GPIO. LOW) GPIO.output (red2, GPIO. LOW) GPIO.output(blue1, GPIO. LOW) GPIO.output(blue2, GPIO. LOW) p1.stop() p2.stop() while True: settime = readset() ชั่วโมง นาที = settime ถ้านาที == 0: if dt(dt.now().year, dt.now().month, dt.now().day, hour-2) < dt.now() < dt(dt.now().year, dt.now().month, dt.now().วัน ชั่วโมง-1 นาที+30): ledlight("red") elif dt(dt.now().year, dt.now().เดือน dt.now().วัน ชั่วโมง-1 นาที+30) < dt.now() < dt(dt.now().year, dt.now().month, dt.now().วัน ชั่วโมง นาที): ledlight("yellow") elif dt(dt.now().year, dt.now().month, dt.now().day, hour, minutes) < dt.now() < dt(dt.now().year, dt.now().month, dt.now().day, hour+1, minutes): ledlight("green") else: ledlight("off") elif dt(dt.now().year, dt.now().month, dt.now().วัน โฮ ur-2) < dt.now() < dt(dt.now().year, dt.now().month, dt.now().day, hour, minutes-30): ledlight("red") elif dt(dt.now().year, dt.now().month, dt.now().วัน ชั่วโมง นาที-30) < dt.now() < dt(dt.now().year, dt.now().month, dt.now().วัน ชั่วโมง นาที): ledlight("yellow") elif dt(dt.now().year, dt.now().month, dt.now().วัน ชั่วโมง นาที) < dt.now() < dt(dt.now().year, dt.now().month, dt.now().day, hour+1, minutes): ledlight("สีเขียว") อื่น: ledlight("ปิด") time.sleep(60)
ไฟล์ index.html เป็นรูปแบบพื้นฐานที่ออกแบบใน HTML ใช้เนื้อหาของกล่องข้อความสองกล่องและส่งผ่านไปยังไฟล์ sleepset.php สำหรับการจัดการแบบฟอร์ม ไฟล์ PHP จะเขียนทับไฟล์ sleepset.txt ด้วยข้อมูลที่อัปเดต
ขั้นตอนที่ 5: นำทุกอย่างมารวมกัน
เมื่อเขียนโค้ดเสร็จแล้วและพิมพ์ชิ้นส่วนทั้งหมด ก็ถึงเวลาประกอบ ฉันทำตามขั้นตอนเหล่านี้เพื่อรวบรวมทั้งหมด:
- เจาะรูเล็กๆ สองรูขนาดเท่า RGB LED ที่ด้านล่างของแตร และวาง LEDS ลงในรูเหล่านี้
- ใส่ฮอร์นเข้าไปในรูของหัวยูนิคอร์นแล้วดึงเข้าไปจนแน่น ใช้กาวจากด้านในเพื่อยึดแตร
- ติด Raspberry Pi Zero W เข้ากับด้านในของหัวยูนิคอร์น (อาจใช้ปืนกาวร้อน)
- แนบหัวยูนิคอร์นเข้ากับฐานยูนิคอร์น
- ติดสายไฟ และติดชุดประกอบทั้งหมดเข้ากับผนัง
- เสียบนาฬิกา.
ณ จุดนี้ฉันมีนาฬิกาฝึกการนอนหลับสำหรับเด็กที่ใช้งานได้
ขั้นตอนที่ 6: หนึ่งปีต่อมา …
หนึ่งปีต่อมา:
สาวๆ ของฉันกำลังหลับใหลอีกสักหน่อย เราเคยชินกับการตื่นมาเจอเด็กน้อยในห้องบอกว่า "พ่อคะ ไฟเขียวแล้ว" และนั่นก็เยี่ยมมาก สรุปคือ เราตื่นนอนเวลา 05.30 น. ในวันเสาร์เท่านั้นเมื่อเราวางแผนอีกต่อไป
สิ่งที่ฉันวางแผนจะปรับปรุงในอนาคต:
- อาจเพิ่มเซ็นเซอร์หรือสิ่งของอื่นๆ เช่น ไมโครโฟนและลำโพง
- อาจแก้ไขรหัสเพื่อทำงานร่วมกับผู้พูดเพื่อใช้เป็นนาฬิกาปลุก เนื่องจากลูกๆ ของฉันกำลังจะเข้าโรงเรียนในไม่ช้า