สารบัญ:

Wakeup Light: 7 ขั้นตอน (พร้อมรูปภาพ)
Wakeup Light: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Wakeup Light: 7 ขั้นตอน (พร้อมรูปภาพ)

วีดีโอ: Wakeup Light: 7 ขั้นตอน (พร้อมรูปภาพ)
วีดีโอ: Wake Up Lights using Smart Bulbs Tutorial 2024, พฤศจิกายน
Anonim
Wakeup Light
Wakeup Light

ขณะที่ฉันเขียนคำแนะนำนี้ มันเป็นช่วงกลางฤดูหนาวในซีกโลกเหนือ และนั่นหมายถึงกลางวันสั้นและกลางคืนยาวนาน ฉันเคยตื่นนอนเวลา 06:00 น. และในฤดูร้อนดวงอาทิตย์จะส่องแสงในตอนนั้น แม้ว่าในฤดูหนาวจะมีแสงสว่างในเวลา 09:00 น. หากเราโชคดีที่มีวันที่ไม่มีเมฆมาก (ซึ่ง…ไม่บ่อยนัก)

เมื่อไม่นานมานี้ ฉันอ่านเกี่ยวกับ "ไฟปลุก" ที่ผลิตโดยฟิลิปส์ซึ่งใช้ในนอร์เวย์เพื่อจำลองแสงแดดยามเช้า ฉันไม่เคยซื้อมันเลย แต่ฉันเอาแต่คิดจะทำมันขึ้นมาเพราะการทำด้วยตัวเองสนุกกว่าแค่ซื้อมัน

เสบียง:

กรอบรูป "ริบบ้า" 50 x 40 ซม. จาก IKEA

ฮาร์ดบอร์ดเจาะรูจากร้านฮาร์ดแวร์

บอร์ดพัฒนา STM8S103 ผ่าน Ebay หรืออื่นๆ

DS1307 นาฬิกาตามเวลาจริง (Mouser, Farnell, Conrad ฯลฯ)

นาฬิกาคริสตัล 32768 Hz (Mouser, Farnell, Conrad ฯลฯ)

3V ลิเธียม coincell + ที่ใส่ coincell

BUZ11 หรือ IRLZ34N N-channel MOSFET (3x)

BC549 (หรือทรานซิสเตอร์ NPN อื่น ๆ)

ไฟ LED สีขาว แดง น้ำเงิน เขียว ฯลฯ ตามที่คุณต้องการ

ตัวต้านทานและตัวเก็บประจุบางตัว (ดูแผนผัง)

Powerbrick, 12V ถึง 20V, 3A หรือมากกว่า (เช่น พาวเวอร์ซัพพลายสำหรับโน้ตบุ๊กรุ่นเก่า)

ขั้นตอนที่ 1: ทำให้ (เล็กน้อย) ง่ายขึ้น

ทำให้ (เล็กน้อย) ลุกขึ้นได้ง่ายขึ้น
ทำให้ (เล็กน้อย) ลุกขึ้นได้ง่ายขึ้น

แนวคิดก็คือว่า เป็นเรื่องยากที่จะลุกจากเตียงในตอนเช้าในขณะที่ยังมืดอยู่ และถ้าคุณอาศัยอยู่ใกล้หรือสูงกว่าอาร์กติกเซอร์เคิลก็จะมืดนานมาก ในสถานที่อย่างทรอมโซในนอร์เวย์จะไม่มีแสงส่องถึงเลย เพราะที่นั่นดวงอาทิตย์ตกในช่วงครึ่งเดือนพฤศจิกายนเท่านั้นที่จะปรากฏอีกครั้งในครึ่งทางของเดือนมกราคมัวรี

ดังนั้น สิ่งที่ฟิลิปส์ทำคือจำลองการขึ้นของดวงอาทิตย์

Philips ค่อยๆ เพิ่มความสว่างของหลอดไฟอย่างช้าๆ ซึ่งอาจประกอบด้วยไฟ LED หลายดวง แต่ซ่อนอยู่หลังตัวกระจายแสงตัวเดียว เวลาของพวกเขาจากปิดจนถึงความสว่างเต็มที่จะใช้เวลา 30 นาที

ไฟปลุกของ Philips ไม่ได้แพงขนาดนั้นแต่มีสีเดียวและดูเล็กไปหน่อย ฉันคิดว่าฉันทำได้ดีกว่านี้

ขั้นตอนที่ 2: สีเพิ่มเติม

สีเพิ่มเติม
สีเพิ่มเติม

ไฟปลุกของฉันใช้สี่สี ขาว แดง น้ำเงิน และเขียว อันดับแรก ให้มาที่ไฟ LED สีขาว ตามด้วยไฟสีแดง และไฟ LED สีน้ำเงินและสีเขียวสองสามดวงสุดท้าย ความคิดของฉันคือฉันสามารถจำลองไม่เพียงแต่การเพิ่มความสว่างเท่านั้น แต่ยังรวมถึงการเปลี่ยนสีของแสงยามเช้าด้วย โดยเริ่มจากสีขาวเล็กน้อย เติมสีแดงในภายหลังเล็กน้อย แล้วผสมสีน้ำเงินและสีเขียวในตอนท้าย ฉันไม่แน่ใจว่าจริง ๆ แล้วมันคล้ายกับแสงยามเช้าจริง ๆ แต่ฉันชอบจอแสดงผลที่มีสีสันเหมือนตอนนี้

ของฉันยังเร็วกว่าไฟปลุกของ Philips อีกด้วย แทนที่จะเป็น 30 นาทีของแสง Philips ของฉันจะสว่างจาก 0% ถึง 100% ในเวลาน้อยกว่า 5 นาที ดังนั้นดวงอาทิตย์ของฉันจึงขึ้นเร็วขึ้นมาก

บันทึก:

มันยากมากที่จะสร้างภาพไฟปลุกของฉัน ฉันลองใช้กล้องหลายตัวและสมาร์ทโฟนหลายตัว แต่รูปภาพทั้งหมดที่ฉันสร้างไม่ยุติธรรมเลย

ขั้นตอนที่ 3: Sigmoid Curve, ริบหรี่และ "ความละเอียด"

Sigmoid Curve, ริบหรี่และ
Sigmoid Curve, ริบหรี่และ

แน่นอน ฉันต้องการทำให้ความสดใสเป็นไปอย่างราบรื่นที่สุด ดวงตาของมนุษย์มีความไวลอการิทึม หมายความว่าในความมืดสนิท ดวงตาจะไวกว่าเวลากลางวันเต็มที่ ความสว่างเพิ่มขึ้นเล็กน้อยมากเมื่อระดับแสงต่ำ "รู้สึก" เหมือนกับขั้นตอนที่ใหญ่กว่ามากเมื่อแสงอยู่ที่ระดับความสว่าง 40% เพื่อให้บรรลุสิ่งนี้ ฉันใช้เส้นโค้งพิเศษที่เรียกว่า Sigmoid (หรือ S-curve) เส้นโค้งนี้เริ่มเป็นเส้นโค้งเลขชี้กำลังที่ลดระดับลงครึ่งหนึ่งอีกครั้ง ฉันพบว่าเป็นวิธีที่ดีมากในการเพิ่ม (และลด) ความเข้ม

ความถี่สัญญาณนาฬิกาของไมโครคอนโทรลเลอร์ (และตัวจับเวลา) คือ 16 MHz และฉันใช้ความละเอียดสูงสุด TIMER2 (65536) เพื่อสร้างสัญญาณความกว้างพัลส์ (PWM) สามสัญญาณ ดังนั้นพัลส์จึงมา 16000000 / 65536 = 244 ครั้งต่อวินาที ซึ่งอยู่เหนือขอบเขตของดวงตามากจนมองเห็นริบหรี่ได้

ดังนั้นไฟ LED จึงถูกป้อนด้วยสัญญาณ PWM ที่สร้างด้วยตัวจับเวลา 16 บิตของไมโครคอนโทรลเลอร์ STM8S103 อย่างน้อยที่สุด สัญญาณ PWM นี้สามารถเปิดได้คือ 1 ความยาวพัลส์และความยาวพัลส์ 65535 ที่เหลือปิด

ดังนั้นไฟ LED ที่เชื่อมต่อกับสัญญาณ PM นั้นจะอยู่ที่ 1/65536 ของเวลา: 0.0015%

สูงสุดคือ ON 65536/65536 ของเวลา: 100%

ขั้นตอนที่ 4: อุปกรณ์อิเล็กทรอนิกส์

อิเล็กทรอนิกส์
อิเล็กทรอนิกส์
อิเล็กทรอนิกส์
อิเล็กทรอนิกส์
อิเล็กทรอนิกส์
อิเล็กทรอนิกส์
อิเล็กทรอนิกส์
อิเล็กทรอนิกส์

ไมโครคอนโทรลเลอร์

สมองของไฟปลุกคือไมโครคอนโทรลเลอร์ STM8S103 จาก STMicroelectronics ฉันชอบใช้ชิ้นส่วนที่มีความสามารถเพียงพอสำหรับงาน สำหรับงานง่าย ๆ เช่นนี้ ไม่จำเป็นต้องใช้ไมโครคอนโทรลเลอร์ STM32 (รายการโปรดอื่น ๆ ของฉัน) แต่ Arduino UNO ไม่เพียงพอเพราะฉันต้องการสัญญาณ PWM สามสัญญาณที่มีความละเอียด 16 บิต และไม่มีตัวจับเวลาที่มีช่องสัญญาณออกสามช่องบน UNO.

นาฬิกาเรียลไทม์

เวลาอ่านจากนาฬิกาเรียลไทม์ DS1307 ที่ทำงานร่วมกับคริสตัล 32768 Hz และมีแบตเตอรี่สำรอง 3V

การตั้งเวลาปัจจุบัน วัน และเวลาปลุกทำได้ด้วยปุ่มสองปุ่ม และแสดงเป็นจอ LCD ขนาด 16 x 2 ตัว เพื่อให้ห้องนอนของฉันมืดสนิทในตอนกลางคืน ไฟแบ็คไลท์ของจอ LCD จะเปิดขึ้นก็ต่อเมื่อไฟ LED สว่างกว่าไฟแบ็คไลท์และเมื่อคุณตั้งเวลา วัน และเวลาปลุกเท่านั้น

พลัง

พลังงานมาจากแหล่งจ่ายไฟแล็ปท็อปเครื่องเก่า เหมืองผลิต 12V และสามารถส่ง 3A เมื่อคุณมีแหล่งจ่ายไฟอื่น อาจจำเป็นต้องปรับตัวต้านทานแบบอนุกรมด้วยสายไฟ LED (ดูด้านล่าง)

ไฟ LED

ไฟ LED เชื่อมต่อกับแหล่งจ่ายไฟ 12V ส่วนงานอิเล็กทรอนิกส์ที่เหลือบน 5V ทำด้วยตัวควบคุมเชิงเส้น 7805 ในแผนผังบอกว่าฉันใช้ตัวควบคุม TO220 ซึ่งไม่จำเป็นเนื่องจากไมโครคอนโทรลเลอร์ จอแสดงผล และนาฬิกาแบบเรียลไทม์ใช้เพียงไม่กี่มิลลิแอมป์ นาฬิกาของฉันใช้รุ่น TO92 ที่เล็กกว่าของ 7805 ที่สามารถจ่ายกระแสไฟได้ 150mA

การสลับของสตริงนำทำได้ด้วย N-channel MOSFET อีกครั้งในแผนผังจะแสดงอุปกรณ์อื่นที่ไม่ใช่ของฉัน ฉันมี BUZ11 MOSFET ที่เก่ามากสามตัวแทนที่จะเป็น IRLZ34N MOSFET ที่ใหม่กว่า พวกเขาทำงานได้ดี

แน่นอน คุณสามารถใส่ไฟ LED ได้มากเท่าที่คุณต้องการ ตราบใดที่ MOSFET และพาวเวอร์ซัพพลายสามารถรองรับกระแสไฟได้ ในแผนผังฉันได้วาดเพียงเส้นเดียวของสีใดๆ ก็ตาม ในความเป็นจริงมีหลายสีแต่ละสีขนานกับสตริงอื่นๆ ของสีนั้น

ขั้นตอนที่ 5: ตัวต้านทาน (สำหรับไฟ LED)

ตัวต้านทาน (สำหรับไฟ LED)
ตัวต้านทาน (สำหรับไฟ LED)

เกี่ยวกับตัวต้านทานในสายนำ ไฟ LED สีขาวและสีน้ำเงินมักจะมีแรงดันไฟฟ้าอยู่ที่ 2.8V เมื่ออยู่ที่ความสว่างเต็มที่

ไฟ LED สีแดงมีเพียง 1.8V ไฟ LED สีเขียวของฉันมี 2V ที่ความสว่างเต็มที่

อีกอย่างคือความสว่างเต็มที่ไม่เหมือนกัน ดังนั้นจึงต้องใช้การทดลองบางอย่างเพื่อให้สว่างเท่ากัน (ในสายตาของฉัน) ด้วยการทำให้ไฟ LED สว่างเท่ากันที่ความสว่างเต็มที่ พวกมันจะดูสว่างเท่ากันในระดับที่ต่ำกว่า สัญญาณความกว้างพัลส์จะเปิดขึ้นที่ความสว่างเต็มที่เสมอ แต่ในช่วงเวลาที่นานขึ้นและสั้นลง ดวงตาของคุณจะดูแลการเฉลี่ย

เริ่มต้นด้วยการคำนวณเช่นนี้ แหล่งจ่ายไฟส่ง (ในกรณีของฉัน) 12V

ไฟ LED สีขาวสี่ดวงในชุดต้องใช้ 4 x 2.8V = 11.2V ซึ่งจะเหลือ 0.8V สำหรับตัวต้านทาน

ฉันพบว่าพวกมันสว่างเพียงพอที่ 30mA ดังนั้นตัวต้านทานต้องเป็น:

0.8 / 0.03 = 26.6 โอห์ม ในแผนผังคุณจะเห็นว่าฉันใส่ตัวต้านทาน 22 โอห์ม ทำให้ไฟ LED สว่างขึ้นเล็กน้อย

ไฟ LED สีฟ้าสว่างเกินไปที่ 30mA แต่เมื่อเทียบกับไฟ LED สีขาวที่ดีที่ 15 mA พวกเขายังมีไฟประมาณ 2.8V ที่ 15mA ดังนั้นการคำนวณจึงเป็น 4 x 2.8V = 11.2V อีกครั้งเหลือ 0.8V

0.8 / 0.015 = 53.3 โอห์ม ดังนั้นฉันจึงเลือกตัวต้านทาน 47 โอห์ม

ไฟ LED สีแดงของฉันก็ต้องการไฟ 15 mA ที่สว่างเท่าๆ กัน แต่มีไฟมากกว่า 1.8V ที่กระแสนั้นเท่านั้น ดังนั้นฉันจึงสามารถใส่ชุดเพิ่มเติมและยังมี "ที่ว่าง" สำหรับตัวต้านทาน

ไฟ LED สีแดงหกดวงให้ 6 x 1.8 = 10.8V ดังนั้นตัวต้านทานคือ 12 – 10.8 = 1.2V

1.2 / 0.015 = 80 โอห์ม ฉันทำให้มันเป็น 68 โอห์ม เช่นเดียวกับคนอื่น ๆ สว่างขึ้นเล็กน้อย

ไฟ LED สีเขียวที่ฉันใช้สว่างพอๆ กับไฟอื่นๆ ที่ประมาณ 20mA ฉันต้องการเพียงไม่กี่ (เช่นเดียวกับสีน้ำเงิน) และฉันเลือกที่จะใส่สี่ในซีรีส์ ที่ 20mA พวกมันมี 2, 1V เหนือพวกมัน ให้ 3 x 2.1 = 8.4V

12 – 8.4 = 3.6V สำหรับตัวต้านทาน และ 3.6 / 0.02 = 180 โอห์ม

หากคุณสร้างไฟปลุกนี้ ไม่น่าจะเป็นไปได้ว่าคุณมีแหล่งจ่ายไฟแบบเดียวกัน คุณจะต้องปรับจำนวนไฟ LED ในซีรีส์และตัวต้านทานที่ต้องการ

ตัวอย่างเล็กๆ น้อยๆ สมมติว่าคุณมีพาวเวอร์ซัพพลายที่ให้ 20V ฉันจะเลือกตั้งค่าไฟ LED สีฟ้า (และสีขาว) 6 ดวงเป็นอนุกรม 6 x 3V = 18V ดังนั้น 2V สำหรับตัวต้านทาน และสมมติว่าคุณชอบความสว่างที่ 40mA ตัวต้านทานจะต้องเป็น 2V / 0.04 = 50 โอห์ม ตัวต้านทาน 47 โอห์มก็ใช้ได้

ฉันแนะนำว่าอย่าไปสูงกว่า 50mA กับไฟ LED ธรรมดา (5 มม.) บางคนรับมือได้มากกว่านี้ แต่ฉันชอบอยู่อย่างปลอดภัย

ขั้นตอนที่ 6: ซอฟต์แวร์

สามารถดาวน์โหลดรหัสทั้งหมดได้จาก:

gitlab.com/WilkoL/wakeup_light_stm8s103

เปิดซอร์สโค้ดไว้ข้างๆ ส่วนที่เหลือของคำสั่งนี้ หากคุณต้องการทำตามคำอธิบาย

Main.c

Main.c ตั้งค่านาฬิกา ตัวจับเวลา และอุปกรณ์ต่อพ่วงอื่นๆ ก่อน “ไดรเวอร์” ส่วนใหญ่ที่ฉันเขียนโดยใช้ Standard Library จาก STMicroelectronics และหากคุณมีคำถามใด ๆ เกี่ยวกับพวกเขา เขียนในความคิดเห็นด้านล่างของคำแนะนำ

อีพรอม

ฉันทิ้งโค้ด "ข้อความที่จะแสดง" ไว้ที่ฉันใช้ใส่ข้อความใน eeprom ของ STM8S103 เป็นความคิดเห็น ฉันไม่แน่ใจว่าฉันมีหน่วยความจำแฟลชเพียงพอสำหรับโค้ดทั้งหมดของฉัน ดังนั้นฉันจึงพยายามใส่ใน eeprom ให้มากที่สุดเพื่อให้มีแฟลชทั้งหมดสำหรับโปรแกรม ในที่สุดก็พิสูจน์แล้วว่าไม่จำเป็นและฉันก็ย้ายข้อความไปที่แฟลช แต่ฉันปล่อยให้มันเป็นข้อความแสดงความคิดเห็นในไฟล์ main.c เป็นเรื่องที่ดีเมื่อฉันต้องการทำสิ่งที่คล้ายคลึงกันในภายหลัง (ในโครงการอื่น)

eeprom ยังคงใช้อยู่ แต่สำหรับเก็บเวลาปลุกเท่านั้น

สักครั้ง

หลังจากตั้งค่าอุปกรณ์ต่อพ่วงแล้ว รหัสจะตรวจสอบว่าผ่านไปหนึ่งวินาทีหรือไม่

เมนู

หากเป็นกรณีนี้ จะตรวจสอบว่ามีการกดปุ่มหรือไม่ หากเป็นเช่นนั้น ปุ่มจะเข้าสู่เมนูที่คุณสามารถตั้งเวลาปัจจุบัน วันในสัปดาห์ และเวลาปลุกได้ จำไว้ว่าจะใช้เวลาประมาณ 5 นาทีในการเปลี่ยนจากโหมดปิดเป็นความสว่างเต็มที่ ดังนั้นให้ตั้งเวลาปลุกให้เร็วขึ้นเล็กน้อย

เวลาปลุกจะถูกเก็บไว้ใน eeprom เพื่อให้แม้หลังจากไฟฟ้าดับก็จะ "รู้" เมื่อต้องปลุกคุณ เวลาปัจจุบันจะถูกเก็บไว้ในนาฬิกาเรียลไทม์แน่นอน

เปรียบเทียบเวลาปัจจุบัน & เวลาตื่น

เมื่อไม่มีการกดปุ่ม ระบบจะตรวจสอบเวลาปัจจุบันและเปรียบเทียบกับเวลาปลุกและวันทำงาน ฉันไม่ต้องการให้มันปลุกฉันในช่วงสุดสัปดาห์:-)

ส่วนใหญ่ไม่จำเป็นต้องทำสิ่งใดจึงตั้งค่าตัวแปร "leds" เป็น OFF อื่นเป็น ON ตัวแปรนี้ได้รับการตรวจสอบพร้อมกับสัญญาณ “change_intensity” ซึ่งมาจากตัวจับเวลาและทำงาน 244 ครั้งต่อวินาที ดังนั้นเมื่อตัวแปร "ไฟ LED" เปิดอยู่ ความเข้มจะเพิ่มขึ้น 244 ครั้งต่อวินาที และเมื่อปิดอยู่จะลดลง 244 ครั้งต่อวินาที แต่การเพิ่มขึ้นเป็นขั้นตอนเดียวโดยที่การลดลงคือขั้นตอนที่ 16 ซึ่งหมายความว่าเมื่อไฟปลุกทำงานสำเร็จแล้ว ไฟจะดับเร็วขึ้น 16 เท่าแต่ยังคงทำงานได้อย่างราบรื่น

ความราบรื่นและหน่วยความจำไม่เพียงพอ

ความเรียบมาจากการคำนวณเส้นโค้งซิกมอยด์ การคำนวณค่อนข้างง่าย แต่ต้องทำในตัวแปรทศนิยม (สองเท่า) เนื่องจากฟังก์ชัน exp() ดูไฟล์ sigmoid.c

ในสถานการณ์มาตรฐาน Cosmic compiler / linker ไม่รองรับตัวแปรทศนิยม การเปิดใช้งานเป็นเรื่องง่าย (เมื่อคุณพบแล้ว) แต่มาพร้อมกับการเพิ่มขนาดโค้ด การเพิ่มขึ้นนี้มากเกินไปที่จะทำให้โค้ดพอดีกับหน่วยความจำแฟลชเมื่อรวมกับฟังก์ชัน sprintf() และฟังก์ชันนั้นจำเป็นสำหรับการแปลงตัวเลขเป็นข้อความสำหรับการแสดงผล

อิโต้()

เพื่อแก้ไขปัญหานี้ ฉันได้สร้างฟังก์ชัน itoa() นี่คือฟังก์ชัน Integer To Ascii ที่ค่อนข้างธรรมดา แต่ไม่รวมอยู่ในไลบรารีมาตรฐาน STMicroelectronics หรือกับไลบรารี Cosmic

ขั้นตอนที่ 7: IKEA (เราจะทำอย่างไรถ้าไม่มีพวกเขา)

IKEA (เราจะทำอย่างไรถ้าไม่มีพวกเขา)
IKEA (เราจะทำอย่างไรถ้าไม่มีพวกเขา)
IKEA (เราจะทำอย่างไรถ้าไม่มีพวกเขา)
IKEA (เราจะทำอย่างไรถ้าไม่มีพวกเขา)
IKEA (เราจะทำอย่างไรถ้าไม่มีพวกเขา)
IKEA (เราจะทำอย่างไรถ้าไม่มีพวกเขา)

รูปนี้ซื้อมาจากอิเกีย เป็นโครง Ribba ขนาด 50 x 40 ซม. กรอบนี้ค่อนข้างหนาและเหมาะสำหรับซ่อนอุปกรณ์อิเล็กทรอนิกส์ไว้ด้านหลัง แทนที่จะใส่โปสเตอร์หรือรูปภาพ ฉันใส่แผ่นกระดาษแข็งที่มีรูพรุน คุณสามารถซื้อได้ที่ร้านฮาร์ดแวร์ซึ่งบางครั้งเรียกว่า "แผ่นรองเตียง" มีรูเล็กๆ อยู่ด้านในซึ่งทำให้เหมาะสำหรับการใส่ไฟ LED น่าเสียดายที่รูในกระดานของฉันใหญ่กว่า 5 มม. เล็กน้อย ดังนั้นฉันจึงต้องใช้กาวร้อนเพื่อ "ยึด" ไฟ LED

ฉันทำรูสี่เหลี่ยมตรงกลางฮาร์ดบอร์ดสำหรับจอแสดงผลขนาด 16x2 แล้วกดเข้าไป PCB ที่มีอุปกรณ์อิเล็กทรอนิกส์ทั้งหมดแขวนอยู่บนจอแสดงผลนี้ มันไม่ได้ติดตั้งกับอย่างอื่น

ฮาร์ดบอร์ดที่มีรูพรุนถูกพ่นสีดำและอยู่ด้านหลังเสื่อ ฉันเจาะรูสองรูในเฟรมสำหรับปุ่มต่างๆ เพื่อตั้งเวลาและวันที่ เนื่องจากกรอบค่อนข้างหนา จึงต้องขยายรูด้านในของเฟรมเพื่อให้ปุ่มยื่นออกมาเพียงพอ

แนะนำ: