Автоматическое освещение санузла | Аппаратная платформа Arduino

Arduino.ru

Всем доброго дня!
Пытаюсь организовать автоматическое включение и выключение света в туалете.
Использую Arduino Nano, датчик движения, ультразвуковой дальномер (определяет есть ли кто на унитазе), передатчик на 433 МГц управляет верхним светом (радиовыключатель LIVOLO), часы реального времени, MOSFET транзистор (управляет светодиодной подсветкой в темное время суток, в скетче после 21-00), фоторезистор (датчик освещенности).
В программировании не силен, скетч собирал из разных кусков и он работает, все включается и выключается в автоматическом режиме, но если кто-то включит свет вручную то беда.
Надо помощь в описании процедуры проверки освещенности, т.е. если движения нет и на унитазе никого и вне зависимости от времени суток (мало ли кто включил верхний свет ночью) свет (подсветка) выключался, но так, чтобы если я захочу включить свет ночью мог дойти до санузла секунд за 10 (выключатель находится в коридоре)

Также подстраховать включение верхнего света, бывает, что и радиосигнал не с первого раза доходит.

И еще момент: как предусмотреть вариант, когда зашел в туалет в 20-50, а вышел в 21-05, все ли выключится?
Буду очень признателен за помощь.
Скетч ниже.

#include #include #define fadePin 6 //пин управления MOSFET транзистором Livolo livolo(11); // Передатчик FS1000A 433 МГц на пин 11 int calibrationTime = 10;//. //Время калибровки датчика движения 30 сек (10-60 сек. по даташиту) long unsigned int lowIn; //Время, в которое был принят сигнал отсутствия движения(LOW) long unsigned int pause = 7000; //Пауза, после которой движение считается оконченным - 7 сек boolean lockLow = true; //Флаг. false = значит движение уже обнаружено, true - уже известно, что движения нет boolean takeLowTime; //Флаг. Сигнализирует о необходимости запомнить время начала отсутствия движения int move = 0; //Движение int time = 0; DS1302 rtc(7, 8, 12); // Часы Time t; const int pinPhoto = A0; // Фоторезистор с подтягивающим на А0 int raw = 0; // Освещенность int TrigPin = 4; // Пины 3, 4 ультразвукового дальномера int EchoPin = 3; int light; //переменная для хранения состояния света (вкл/выкл) int pirPin = 2; //вывод подключения датчика движения int ledPin = 13; void setup() < pinMode(13, OUTPUT); pinMode(TrigPin,OUTPUT); pinMode(EchoPin,INPUT); pinMode(fadePin, OUTPUT); digitalWrite(pirPin, LOW); pinMode( pinPhoto, INPUT ); delay(1000); //калибровка 30 сек for(int i = 0; i < calibrationTime; i++) < //Во время калибровки будет мигать сигнальный диод i % 2 ? digitalWrite(ledPin, HIGH) : digitalWrite(ledPin, LOW); delay(1000); >//По окончанию калибровки зажжем сигнальный диод digitalWrite(ledPin, HIGH); delay(50); Serial.begin(9600); > void loop() < move = digitalRead(pirPin); raw = analogRead( pinPhoto ); if(raw>=500) light = 1; if(raw<500) light = 0; delay(50); t = rtc.getTime(); delay(50); int distance,duration; digitalWrite(TrigPin,HIGH); delayMicroseconds(11); digitalWrite(TrigPin,LOW); duration = pulseIn(EchoPin, HIGH); delay(50); //Верхний свет с 9 до 21 //Если обнаружено движение if((digitalRead(pirPin) == HIGH) && (light == 0) && (t.hour >= 9) && (t.hour takeLowTime = true; > //Ели движения нет if((digitalRead(pirPin) == LOW) && (duration > 3000) && (t.hour >= 9) && (t.hour //Если время без движение превышает паузу => движение окончено if((!lockLow && millis() - lowIn > pause) && (light == 1)) //проверяем также освещенность, вдруг кто-то вышел и выключил свет вручную < //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения lockLow = true; livolo.sendButton(6400, 120); Serial.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx LightOFF"); delay(50); >> //Подсветка с 21 до 9 //Если обнаружено движение if((digitalRead(pirPin) == HIGH) && (light == 0) && ((t.hour = 21) || (t.hour = 22) || (t.hour = 23) || (t.hour = 0) || (t.hour = 1) || (t.hour = 2) || (t.hour = 3) || (t.hour = 4) || (t.hour = 5) || (t.hour = 6) || (t.hour = 7) || (t.hour = 8))) < //Если до этого момента еще не включили подсветку if(lockLow) < lockLow = false; //Включаем плавно подсветку. for(int i=0; iSerial.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx BackLightOn"); delay(50); > takeLowTime = true; > //Ели движения нет if((digitalRead(pirPin) == LOW) && (duration > 3000) && ((t.hour = 21) || (t.hour = 22) || (t.hour = 23) || (t.hour = 0) || (t.hour = 1) || (t.hour = 2) || (t.hour = 3) || (t.hour = 4) || (t.hour = 5) || (t.hour = 6) || (t.hour = 7) || (t.hour = 8))) < //Если время окончания движения еще не записано if(takeLowTime) < lowIn = millis(); //Сохраним время окончания движения takeLowTime = false; //Изменим значения флага, чтобы больше не брать время, пока не будет нового движения >//Если время без движение превышает паузу => движение окончено if(!lockLow && millis() - lowIn > pause) < //Изменяем значение флага, чтобы эта часть кода исполнилась лишь раз, до нового движения lockLow = true; for(int i=255; i>=0; i--)//плавно гасим подсветку < analogWrite(fadePin, i); delay(20); >Serial.println("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx BackLightOff"); delay(50); > > // вывожу в порт для настройки Serial.print("Illumination "); Serial.print( raw ); Serial.print("Svet "); Serial.println( light ); Serial.print("Move "); Serial.print(move); Serial.print("Time no Move "); Serial.println(lowIn); Serial.print("Distance "); Serial.print(duration); Serial.print(" ("); Serial.print(duration/29/2); Serial.println(" cm)"); Serial.print(t.date, DEC); Serial.print(" "); Serial.print(rtc.getMonthStr()); Serial.print(" "); Serial.print(t.year, DEC); Serial.println("."); Serial.println(rtc.getDOWStr()); Serial.print(t.hour, DEC); Serial.print(":"); Serial.print(t.min, DEC); Serial.print(":"); Serial.println(t.sec, DEC); delay (500); >
  • Войдите на сайт для отправки комментариев
Средний рейтинг
0 из 5 звезд. 0 голосов.