Управление уличным освещением.

restiv
Offline
Зарегистрирован: 03.01.2016

Добрый день!

Прошу помочь в моем проекте управления уличным освещением. Суть задачи очень проста. Подключаю ардуинку нано, реле, фоторезистор и лампу. Заливаю примитивный скечь:

const int photoPin = A5;
const int relPin = 3;

void setup() {
    pinMode(photoPin, INPUT);
    pinMode(relPin, OUTPUT);
}

void loop() {
    if( analogRead(photoPin) < 200 )
        digitalWrite(relPin, HIGH);
    if( analogRead(photoPin) > 600 )
        digitalWrite(relPin, LOW);
}

Все работает, но не хватает ума как сделать защиту от ложных срабатываний. Когда проезжающие машины освещают фарами двор, свет отключается. И так периодически в течении всего вечера. Подскажите как доработать код, чтобы избежать этого. Зараее благодарю. 

Andrey_Y_Ostanovsky
Offline
Зарегистрирован: 03.12.2012

restiv пишет:
как сделать защиту от ложных срабатываний.

Почитать тему "мигаем светодиодом без delay()", ввести в свой цикл loop() понятие "период опроса фотодатчика" = 60 секунд, например, а не со скоростью работы процессора, как это сейчас сделано у Вас. После этого вводим еще одну переменную, в которую кладем предыдущее состояния датчика и условием включения будет "если сейчас светло и в предыдущий раз было светло"...

А можно просто соорудить непрозрачный цилиндрик на фотодатчике и ориентировать выше света фар - чтобы датчик не засвечивали. :) Но паузу между опросами в цикле loop() - все равно надо поставить: чтобы не изнашивался так сильно.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

заводите статическую переменную, значение которой меняете при изменении освещенности (с учетом вашего гистерезиса).

решение о реальности события принимаете, если освещенность осталась неизменной в течении защитного интервала времени (например 10-20секунд.)

// защитное время 20 сек
#define guardTime 20000

const int photoPin = A5;
const int relPin = 3;

void setup() {
  pinMode(relPin,OUTPUT);

}



void loop() {
  

static uint32_t om=millis();// старое значение миллис
uint32_t m=millis();//текущее значение миллис

static byte lght = HIGH; //освещенность старая
byte Newlght = HIGH;// освещенность новая

if (analogRead (photoPin) < 200) Newlght = LOW;
if (analogRead (photoPin) > 600) Newlght = HIGH;

// момент изменения освещенности, засекаем время
if (lght != Newlght) {om=m; lght=Newlght;}

if(m-om > guardTime) //если освещенность не менялась защитное время
  {
   digitalWrite(relPin, ~lght); // НЕ lght - включение света 
  }
  

}

 

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

Как у программиста у меня первая пришедшая на ум мысль, естественно, ввести задержку срабатывания.

Но была высказана, на мой взгляд, и более интересная мысль: направить датчик освещенности в небо.

restiv
Offline
Зарегистрирован: 03.01.2016

Спасибо всем за коменты.

Насчет цилиндрика думал, но если его делать очень узким, то в нем постоянно темно и освещенность меняется плохо. 

Насчет направить не небо, не вариант. Очень скоро на него осядет пыль и грязь и свет будет постоянно гореть. Нужно будет регулярно лазить и протирать его. Тоже не очень удобно.

Попробую сделать здержку в цикле. Посмотрим что получится.

Ещё раз спасибо.