Включение света по расписанию

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Привет, друзья!

Установил себе один товарищ датчик движения в прихожую. Очень удобно - идешь свет зажигается, через несколько секунд гаснет. Но проблемка такая появилась, встаешь ночью в туалет, идешь, крадешься, и тут БАЦ - света на 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());
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Непонятно, зачем датчик управляет сразу 150-ю Ваттами. По логике - должен именно включать что-то вроде светодиода, чтобы не впилить впотьмах в стену и найти при необходимости выключатель.

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

ardiano, не понятен ваш вопрос. Выключателя как токового нету, есть датчик движения, который включает свет, если есть движение. Данный блок не даёт ему включить свет, если время от 23 до 6. В то же время, блок вклюает светодиод - вроде дежурного освещения. 

uservasil
Offline
Зарегистрирован: 09.07.2015

может быть я Вас разочарую сейчас, но ваше твердотельное реле не совсем твердотельное :)

Emeljanowich
Emeljanowich аватар
Offline
Зарегистрирован: 30.04.2015

Спасибо, действительно не совсем. Но суть не меняется :)

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

Кода не будет?

uservasil
Offline
Зарегистрирован: 09.07.2015

ua6em пишет:

Кода не будет

в посте тс есть кнопка "показать код"