Включение света по расписанию
- Войдите на сайт для отправки комментариев
Привет, друзья!
Установил себе один товарищ датчик движения в прихожую. Очень удобно - идешь свет зажигается, через несколько секунд гаснет. Но проблемка такая появилась, встаешь ночью в туалет, идешь, крадешься, и тут БАЦ - света на 150 Вт - аж появляется риск до туалета не дойти.
Так вот, сделал я такую штуку - включение этого света строго по времени - с 6 утра до 23 в будний день и с 10 до 23 в выходной. В ночное время горит маленький светодиодик приклееный на двусторонний скотч. Мягкий свет не режет глаза и освещает путь.
Устройство состоит из: микроконтроллер(куда без него) - 2$, микросхема часов на DS1307 - 0.5$, твердотельное реле (5 В катушка) - 0,7$, светодиод, транзистор, несколько резисторов, плата зарядного, провода, однополюсная кнопка для принудительного включения света в любое время. Зеленый светодиод на плате мигает каждую секунду, указывая на работу МК. Устройство потребляет не более 80 мА тока.
#include "Wire.h" #define DS1307_I2C_ADDRESS 0x68 byte decToBcd(byte val) {return ((val/10*16) + (val%10));} byte bcdToDec(byte val) {return ((val/16*10) + (val%16));} #define led 0 #define rele 8 #define led1 31 #define kn 13 #define per 9 byte h[6]; void setup() { Wire.begin(); pinMode(kn, INPUT); digitalWrite(kn, HIGH); pinMode(per, INPUT); digitalWrite(per, HIGH); pinMode(led, OUTPUT); pinMode(rele, OUTPUT); pinMode(led1, OUTPUT); } void loop() { byte second, minute, hour, dayOfWeek; getDateDs1307(&second, &minute, &hour, &dayOfWeek); if (h[0] != second) {h[1] = !h[1]; h[0] = second;} if ((h[1] == 1) && (digitalRead(per) == 1)) digitalWrite(31, HIGH); else digitalWrite(31, LOW); if (digitalRead(per) == 0) {digitalWrite(led1, LOW); if((digitalRead(kn) == 0) && (h[2] == 0)) {h[3]++; h[2] = 1; digitalWrite(led1, HIGH); delay(3000); digitalWrite(led1, LOW); h[4] = 1; } } if (digitalRead(kn) == 1) {delay(2000); h[2] = 0;} if ((digitalRead(per) == 1) && (h[4] == 1)) {digitalWrite(led1, HIGH); delay(4000); setDateDs1307(); digitalWrite(led1, LOW); h[4] = 0; } //установка времени if (h[5] != hour) { if (dayOfWeek < 6) { if ((hour == 23) || (hour < 6)) {digitalWrite(led, HIGH); digitalWrite(rele, LOW);} else {digitalWrite(led, LOW); digitalWrite(rele, HIGH);} } else { if ((hour == 23) || (hour < 10)) {digitalWrite(led, HIGH); digitalWrite(rele, LOW);} else {digitalWrite(led, LOW); digitalWrite(rele, HIGH);} } ; h[3] = hour;} } void setDateDs1307() { byte second, minute, hour; hour = (17+h[3]); minute = 00; second = 0; //в 19 часов установить время Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.write(decToBcd(second)); Wire.write(decToBcd(minute)); Wire.write(decToBcd(hour)); Wire.endTransmission(); } void getDateDs1307(byte *second, byte *minute, byte *hour, byte *dayOfWeek) { Wire.beginTransmission(DS1307_I2C_ADDRESS); Wire.write(0); Wire.endTransmission(); Wire.requestFrom(DS1307_I2C_ADDRESS, 4); *second = bcdToDec(Wire.read()); *minute = bcdToDec(Wire.read()); *hour = bcdToDec(Wire.read()); *dayOfWeek = bcdToDec(Wire.read()); }
Непонятно, зачем датчик управляет сразу 150-ю Ваттами. По логике - должен именно включать что-то вроде светодиода, чтобы не впилить впотьмах в стену и найти при необходимости выключатель.
ardiano, не понятен ваш вопрос. Выключателя как токового нету, есть датчик движения, который включает свет, если есть движение. Данный блок не даёт ему включить свет, если время от 23 до 6. В то же время, блок вклюает светодиод - вроде дежурного освещения.
может быть я Вас разочарую сейчас, но ваше твердотельное реле не совсем твердотельное :)
Спасибо, действительно не совсем. Но суть не меняется :)
Кода не будет?
Кода не будет
в посте тс есть кнопка "показать код"