Mục lục:

Wakeup Light: 7 bước (có hình ảnh)
Wakeup Light: 7 bước (có hình ảnh)

Video: Wakeup Light: 7 bước (có hình ảnh)

Video: Wakeup Light: 7 bước (có hình ảnh)
Video: Don't Côi - RPT Orijinn x Ronboogz (Visualizer) 2024, Tháng mười một
Anonim
Đèn báo thức
Đèn báo thức

Như tôi viết bài hướng dẫn này, đó là giữa mùa đông ở Bắc bán cầu và điều đó có nghĩa là ngày ngắn và đêm dài. Tôi đã quen với việc thức dậy lúc 06:00 và vào mùa hè, lúc đó mặt trời sẽ chiếu sáng. Tuy nhiên, vào mùa Đông, trời sẽ sáng lúc 09:00 nếu chúng ta may mắn có một ngày trời không có mây (điều này… không thường xuyên).

Cách đây một thời gian, tôi đã đọc về “đèn đánh thức” do Philips sản xuất được sử dụng ở Na Uy để mô phỏng một buổi sáng đầy nắng. Tôi chưa bao giờ mua một cái, nhưng tôi vẫn nghĩ về việc làm một cái vì tự mình làm một cái thú vị hơn là chỉ mua nó.

Quân nhu:

Khung ảnh "Ribba" 50 x 40 cm của IKEA

tấm cứng đục lỗ từ cửa hàng phần cứng

Bảng phát triển STM8S103 qua Ebay hoặc những người khác

Đồng hồ thời gian thực DS1307 (Mouser, Farnell, Conrad, v.v.)

Tinh thể đồng hồ 32768 Hz (Mouser, Farnell, Conrad, v.v.)

Trùng liti 3V + giá đỡ trùng

BUZ11 hoặc IRLZ34N MOSFET kênh N (3x)

BC549 (hoặc bất kỳ bóng bán dẫn NPN nào khác)

bao nhiêu đèn led trắng, đỏ, xanh dương, xanh lá cây, v.v. như bạn muốn

một số điện trở và tụ điện (xem sơ đồ)

Powerbrick, 12V đến 20V, 3A trở lên (ví dụ: nguồn cung cấp năng lượng cho máy tính xách tay cũ)

Bước 1: Làm cho nó (một chút) dễ dàng hơn để thức dậy

Làm cho nó (một chút) dễ dàng hơn để thức dậy
Làm cho nó (một chút) dễ dàng hơn để thức dậy

Có ý kiến cho rằng thật khó để ra khỏi giường vào buổi sáng khi trời còn tối. Và nếu bạn sống gần hoặc thậm chí ở phía trên vòng Bắc Cực, nó sẽ tối rất lâu. Ở những nơi như Tromsö ở Na Uy, nó sẽ hoàn toàn không nhận được ánh sáng vì ở đó, mặt trời lặn vào nửa tháng 11 chỉ xuất hiện trở lại vào nửa tháng Januari.

Vì vậy, những gì Philips đã làm là mô phỏng sự mọc của mặt trời.

Philips từ từ tăng độ sáng của đèn, có thể được làm bằng một số đèn LED nhưng ẩn sau một bộ khuếch tán duy nhất. Thời gian của chúng từ khi tắt đến khi sáng hoàn toàn mất 30 phút.

Đèn đánh thức của Philips không đắt như vậy nhưng nó chỉ có một màu duy nhất và trông hơi nhỏ. Tôi nghĩ rằng tôi có thể làm tốt hơn.

Bước 2: Nhiều màu hơn

Nhiều màu hơn
Nhiều màu hơn

Đèn báo thức của tôi sử dụng bốn màu, trắng, đỏ, xanh dương và xanh lục. Đầu tiên là đèn led màu trắng, sau đó đến đèn màu đỏ và cuối cùng là đèn led màu xanh lam và xanh lá cây. Ý tưởng của tôi là tôi có thể mô phỏng không chỉ sự gia tăng độ sáng mà còn cả sự thay đổi của màu ánh sáng ban mai, bằng cách bắt đầu với một chút màu trắng, thêm màu đỏ sau đó một chút và cuối cùng là trộn màu xanh lam và xanh lục. Tôi không chắc rằng nó có thực sự giống với ánh sáng ban mai thực sự hay không, nhưng tôi thích màn hình đầy màu sắc như hiện tại.

Đèn đánh thức của tôi cũng nhanh hơn đèn đánh thức Philips, thay vì 30 phút của đèn Philips, đèn của tôi chuyển từ độ sáng 0% lên 100% trong vòng chưa đầy 5 phút. Vì vậy, mặt trời của tôi mọc nhanh hơn nhiều.

GHI CHÚ:

RẤT RẤT khó để tạo ra những bức ảnh về ánh sáng đánh thức của tôi, tôi đã thử với một số máy ảnh và điện thoại thông minh nhưng tất cả những bức ảnh tôi tạo ra đều không thực sự công bằng.

Bước 3: Đường cong Sigmoid, nhấp nháy và "độ phân giải"

Đường cong Sigmoid, nhấp nháy và
Đường cong Sigmoid, nhấp nháy và

Tất nhiên tôi muốn làm cho da sáng mịn nhất có thể. Đôi mắt của con người có độ nhạy logarit, có nghĩa là trong bóng tối hoàn toàn, chúng nhạy cảm hơn so với ánh sáng ban ngày. Một mức tăng rất nhỏ về độ sáng khi mức độ thấp "cảm thấy" giống như một bước lớn hơn nhiều khi đèn ở độ sáng 40%. Để đạt được điều này, tôi đã sử dụng một đường cong đặc biệt được gọi là Sigmoid (hoặc đường cong chữ S), đường cong này bắt đầu như một đường cong hàm mũ mà nửa chừng lại chững lại. Tôi thấy rằng đó là một cách rất hay để tăng (và giảm) cường độ.

Tần số xung nhịp của vi điều khiển (và bộ định thời) là 16 MHz và tôi sử dụng độ phân giải tối đa TIMER2 (65536) để tạo ra ba tín hiệu độ rộng xung (PWM). Do đó xung đến 16000000/65536 = 244 lần mỗi giây. Điều đó vượt xa giới hạn mắt có thể nhìn thấy bất kỳ sự nhấp nháy nào.

Vì vậy, các led được cấp tín hiệu PWM được tạo ra bằng 16 bittimer này của vi điều khiển STM8S103. Ở mức tối thiểu tín hiệu PWM này có thể BẬT với độ dài 1 xung và độ dài xung còn lại là 65535 sẽ tắt.

Vì vậy, các đèn led được kết nối với tín hiệu PM đó sau đó sẽ BẬT 1/65536-th của thời gian: 0,0015%

Ở mức tối đa, chúng là ON 65536/65536-th của thời gian: 100%.

Bước 4: Điện tử

Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử
Thiết bị điện tử

Vi điều khiển

Bộ não của đèn báo thức là một vi điều khiển STM8S103 của STMicroelectronics. Tôi thích sử dụng các bộ phận có khả năng vừa đủ cho một công việc. Đối với một nhiệm vụ đơn giản vì điều này không cần thiết phải sử dụng vi điều khiển STM32 (mục yêu thích khác của tôi) nhưng Arduino UNO là không đủ vì tôi muốn có ba tín hiệu PWM với độ phân giải 16 bit và không có bộ đếm thời gian với ba kênh đầu ra trên UNO.

Đồng hồ thời gian thực

Thời gian được đọc từ đồng hồ thời gian thực DS1307 hoạt động với tinh thể 32768 Hz và có pin dự phòng 3V.

Cài đặt thời gian hiện tại, ngày và thời gian đánh thức được thực hiện bằng hai nút và hiển thị trên màn hình ký tự LCD 16 x 2. Để giữ cho phòng ngủ của tôi thực sự tối vào ban đêm, đèn nền của màn hình LCD chỉ được bật khi đèn led sáng hơn đèn nền và khi bạn đang cài đặt thời gian, ngày và thời gian thức dậy.

Quyền lực

Nguồn điện lấy từ nguồn điện máy tính xách tay cũ, của tôi tạo ra 12V và có thể phân phối 3A. Khi bạn có nguồn điện khác, có thể cần điều chỉnh các điện trở mắc nối tiếp với dây dẫn. (Xem bên dưới)

Đèn Led

Các đèn led được kết nối với nguồn cung cấp 12V, phần còn lại của các thiết bị điện tử hoạt động trên nguồn 5V được thực hiện với bộ điều chỉnh tuyến tính 7805. Trong sơ đồ, nó nói rằng tôi sử dụng bộ điều chỉnh TO220, không cần thiết vì bộ vi điều khiển, màn hình và đồng hồ thời gian thực chỉ sử dụng một vài miliampe. Đồng hồ của tôi sử dụng phiên bản TO92 nhỏ hơn của 7805 có khả năng cung cấp 150mA.

Việc chuyển đổi các chuỗi dẫn được thực hiện với MOSFET kênh N. Một lần nữa, trong sơ đồ, nó hiển thị các thiết bị khác mà tôi đã sử dụng. Tôi tình cờ có đúng ba MOSFET BUZ11 rất cũ thay vì MOSFET IRLZ34N mới hơn. Họ làm việc tốt

Tất nhiên, bạn có thể đặt bao nhiêu led tùy thích, miễn là MOSFET và nguồn cung cấp có thể xử lý dòng điện. Trong giản đồ, tôi đã vẽ chỉ một chuỗi màu bất kỳ, trong thực tế có một số màu mỗi màu song song với các chuỗi màu khác.

Bước 5: Điện trở (cho Led)

Điện trở (cho đèn Led)
Điện trở (cho đèn Led)

Giới thiệu về các điện trở trong dây dẫn. Đèn led màu trắng và xanh thường có điện áp 2,8V trên chúng khi chúng ở độ sáng đầy đủ.

Đèn LED màu đỏ chỉ có 1,8V, đèn LED màu xanh lá cây của tôi có 2V trên chúng ở độ sáng đầy đủ.

Một điều nữa là độ sáng đầy đủ của chúng không giống nhau. Vì vậy, phải mất một số thử nghiệm để làm cho chúng sáng như nhau (đối với mắt tôi). Bằng cách làm cho các đèn led sáng như nhau ở độ sáng đầy đủ, chúng cũng sẽ sáng như nhau ở các mức thấp hơn, tín hiệu độ rộng xung luôn bật chúng ở độ sáng tối đa nhưng trong thời gian dài hơn và ngắn hơn, mắt của bạn sẽ quan tâm đến mức trung bình.

Bắt đầu với một phép tính như thế này. Nguồn điện cung cấp (trong trường hợp của tôi) 12V.

Bốn led trắng mắc nối tiếp cần 4 x 2,8V = 11,2V, điều này để lại 0,8V cho điện trở.

Tôi đã thấy rằng chúng đủ sáng ở 30mA vì vậy điện trở cần phải là:

0,8 / 0,03 = 26,6 ohm. Trong sơ đồ, bạn thấy rằng tôi đặt một điện trở 22 ohm, làm cho các đèn led sáng hơn một chút.

Các đèn led màu xanh quá sáng ở 30mA, nhưng so với đèn led màu trắng ở 15 mA, chúng cũng có khoảng 2,8V hơn chúng ở 15mA nên tính toán là 4 x 2,8V = 11,2V lại để lại 0,8V

0,8 / 0,015 = 53,3 ohm vì vậy tôi đã chọn một điện trở 47 ohm.

Các led đỏ của tôi cũng cần một số te 15 mA sáng như những con khác, nhưng chúng chỉ hơn chúng 1,8V ở dòng điện đó. Vì vậy, tôi có thể đặt nhiều hơn trong loạt và vẫn có một số "chỗ" cho điện trở.

Sáu đèn led đỏ cho tôi 6 x 1,8 = 10,8V, vì vậy trên điện trở là 12 - 10,8 = 1,2V

1,2 / 0,015 = 80 ohm, tôi đã biến nó thành 68 ohm. Cũng như những cái khác, sáng hơn một chút.

Các đèn LED màu xanh lá cây tôi đã sử dụng sáng như những cái khác ở khoảng 20mA. Tôi chỉ cần một vài cái (cũng giống như những cái màu xanh lam) và tôi đã chọn đặt bốn cái trong chuỗi. Ở 20mA, chúng hơn chúng 2, 1V, cho 3 x 2,1 = 8,4V

12 - 8,4 = 3,6V đối với điện trở. Và 3,6 / 0,02 = 180 ohm.

Nếu bạn chế tạo đèn báo thức này thì chưa chắc bạn có cùng nguồn điện, bạn sẽ phải điều chỉnh số lượng đèn led mắc nối tiếp và các điện trở cần thiết.

Một ví dụ nhỏ. Giả sử bạn có nguồn điện cung cấp 20V. Tôi sẽ chọn đặt 6 đèn led xanh lam (và trắng) mắc nối tiếp, 6 x 3V = 18V vì vậy 2V cho điện trở. Và giả sử bạn thích độ sáng ở 40mA. Khi đó điện trở cần phải là 2V / 0,04 = 50 ohm, một điện trở 47 ohm sẽ ổn.

Tôi khuyên không nên đi cao hơn 50mA với đèn led thông thường (5mm). Một số có thể xử lý nhiều hơn, nhưng tôi thích ở bên an toàn.

Bước 6: Phần mềm

Tất cả mã có thể được tải xuống từ:

gitlab.com/WilkoL/wakeup_light_stm8s103

giữ mã nguồn mở, bên cạnh phần còn lại của hướng dẫn này nếu bạn muốn làm theo lời giải thích.

C chính

Đầu tiên Main.c thiết lập đồng hồ, bộ hẹn giờ và các thiết bị ngoại vi khác. Hầu hết các “trình điều khiển” tôi đã viết bằng cách sử dụng Thư viện Chuẩn từ STMicroelectronics và nếu bạn có bất kỳ câu hỏi nào về chúng, hãy viết nó trong một bình luận bên dưới hướng dẫn.

Eeprom

Tôi để lại mã "văn bản để hiển thị" mà tôi đã sử dụng để đưa văn bản vào eeprom của STM8S103 dưới dạng nhận xét. Tôi không chắc mình có đủ bộ nhớ flash cho tất cả mã của mình nên tôi đã cố gắng đưa vào eeprom nhiều nhất có thể để có tất cả flash cho chương trình. Cuối cùng, điều đó được chứng minh là không cần thiết và tôi đã chuyển văn bản sang flash. Nhưng tôi đã để nó dưới dạng văn bản đã nhận xét trong tệp main.c. Thật tuyệt khi có nó, khi tôi cần làm điều gì đó tương tự sau này (trong một dự án khác)

Eeprom vẫn được sử dụng, nhưng chỉ để lưu trữ thời gian đánh thức.

Một lần một giây

Sau khi thiết lập các thiết bị ngoại vi, mã sẽ kiểm tra xem một giây đã trôi qua chưa (thực hiện với bộ đếm thời gian).

Thực đơn

Nếu đúng như vậy, nó sẽ kiểm tra xem một nút đã được nhấn hay chưa, nếu có, nó sẽ vào menu nơi bạn có thể đặt thời gian hiện tại, ngày trong tuần và thời gian thức dậy. Hãy nhớ rằng mất khoảng 5 phút để chuyển từ chế độ tắt sang chế độ sáng hoàn toàn, vì vậy hãy đặt thời gian đánh thức sớm hơn một chút.

Thời gian đánh thức được lưu trữ trong eeprom để ngay cả sau khi mất điện, nó vẫn "biết" khi nào cần đánh thức bạn. Tất nhiên, thời gian hiện tại được lưu trong đồng hồ thời gian thực.

So sánh hiện tại và thời gian đánh thức

Khi không có nút nào được nhấn, nó sẽ kiểm tra thời gian hiện tại và so sánh với thời gian thức dậy và ngày trong tuần. Tôi không muốn nó đánh thức tôi vào cuối tuần:-)

Hầu hết thời gian không cần phải làm gì nên nó đặt biến “leds” thành TẮT khác thành BẬT. Biến này được kiểm tra cùng với tín hiệu “change_intensity”, cũng đến từ một bộ đếm thời gian và hoạt động 244 lần mỗi giây. Vì vậy, khi biến "led" BẬT, cường độ được tăng lên 244 lần mỗi giây và khi nó TẮT thì giảm 244 lần mỗi giây. Nhưng sự gia tăng diễn ra theo từng bước đơn lẻ trong đó mức giảm là 16 bước có nghĩa là khi đèn báo thức đã hoàn thành công việc của nó, nó sẽ tắt nhanh hơn 16 lần nhưng vẫn trơn tru.

Độ mượt và NGOÀI BỘ NHỚ

Độ mịn đến từ việc tính toán đường cong Sigmoid. Việc tính toán khá đơn giản nhưng nó cần được thực hiện trong các biến dấu phẩy động (gấp đôi) vì hàm exp (), hãy xem tệp sigmoid.c.

Trong tình huống tiêu chuẩn, trình biên dịch / liên kết Cosmic không hỗ trợ các biến dấu phẩy động. Việc bật nó lên rất dễ dàng (khi bạn đã tìm thấy nó) nhưng đi kèm với việc tăng kích thước mã. Sự gia tăng này quá nhiều để làm cho mã vừa với bộ nhớ flash khi kết hợp với hàm sprintf (). Và chức năng đó cần thiết để chuyển đổi số thành văn bản cho màn hình.

Itoa ()

Để khắc phục sự cố này, tôi đã tạo hàm itoa (). Đây là một hàm Integer To Ascii khá phổ biến, nhưng không có trong thư viện tiêu chuẩn STMicroelectronics, cũng như trong các thư viện Cosmic.

Bước 7: IKEA (Chúng ta sẽ làm gì nếu không có chúng)

IKEA (Chúng ta sẽ làm gì nếu không có chúng)
IKEA (Chúng ta sẽ làm gì nếu không có chúng)
IKEA (Chúng ta sẽ làm gì nếu không có chúng)
IKEA (Chúng ta sẽ làm gì nếu không có chúng)
IKEA (Chúng ta sẽ làm gì nếu không có chúng)
IKEA (Chúng ta sẽ làm gì nếu không có chúng)

Bức tranh từ đã được mua từ IKEA. Đó là một khung Ribba có kích thước 50 x 40cm. Khung này khá dày và điều đó làm cho nó trở nên tuyệt vời để giấu các thiết bị điện tử đằng sau nó. Thay vì áp phích hoặc hình ảnh, tôi đặt một miếng bìa cứng đục lỗ. Bạn có thể mua nó ở cửa hàng phần cứng, nơi nó đôi khi được gọi là “bảng mạch”. Nó có những lỗ nhỏ trên đó rất lý tưởng để lắp đèn led. Thật không may, các lỗ trên bảng của tôi lớn hơn 5 mm một chút nên tôi phải sử dụng keo nóng để "gắn" các đèn led.

Tôi đã tạo một lỗ hình chữ nhật ở giữa bảng cứng cho màn hình 16x2 và ấn nó vào. PCB với tất cả các thiết bị điện tử được treo trên màn hình này, nó không được gắn vào bất kỳ thứ gì khác.

Tấm bìa cứng đục lỗ được phun sơn màu đen và ở phía sau tấm thảm. Tôi khoan hai lỗ trên khung cho các nút để đặt thời gian và ngày tháng, vì khung khá dày nên tôi phải mở rộng các lỗ ở bên trong khung để làm cho các nút đủ nhô ra ngoài.

Đề xuất: