Светодиодное освещение - помощь с фоторезистором

ant145
Offline
Зарегистрирован: 03.02.2016

Доброго! Делаю освещение рабочей зоны на кухне. Основные компоненты: arduino pro mini, два куска светодиодной ленты (большой и маленький), pir-датчик, фоторезистор. Цель: включение светодиодных лент при недостаточном освещении по сигналу от pir-датчика и соответственно наоборот - чтобы не включались днем. Собрал на макетке,  практически получилось, но где-то накосячил в скетче, в результате - когда светло ленты не включаются (как и должно быть), а при недостаточном освещении загораются, но буквально на 3 секунды.  За основу брал чужой скетч, т.к. тяжело с программированием, немного раньше баловался с Паскалем в универе - вот и весь опыт. Подскажите, где ошибка?

#define big_led 3       // пин большой ленты
 #define small_led 6    // пин малой ленты
#define senspin 10      // пин датчика движения
 #define statled 13     // встроенный светодиод для контроля
#define  FOTO A0        // пин фоторезистора
#define pause 10
  int stat=0;          // глобальные переменные
  boolean sens=0;
  int I=0;


void setup (){
 pinMode (big_led, OUTPUT);    // конфигурируем пины
 pinMode (small_led, OUTPUT);
 pinMode (statled, OUTPUT);
 // pinMode (BR, OUTPUT);
 pinMode (senspin,INPUT);
 Serial.begin(9600);           //вывод для отладки
 digitalWrite (big_led, LOW);  // устанавливаем ленты в ноль
 digitalWrite (small_led, LOW);
 digitalWrite(FOTO, HIGH);

}
void loop(){                    // основной цикл
Serial.println(analogRead(FOTO)); 
  Serial.println(" ");
   delay(10);
  static bool state, state0;
  if (analogRead(FOTO) > 960) state0 = 1; // включение - выключение дежурки
  if (analogRead(FOTO) < 940) // гистерезис отключения дежурки
{
    state0 = 0;
    analogWrite(small_led, LOW);
    analogWrite(big_led, LOW);
  }
  if (analogRead(FOTO) < 700) state = 1; // порог освещенности включения
 //else analogWrite(big_led, LOW);   
  if (analogRead(FOTO) > 985) state = 0; // порог освещенности выключения
 //else analogWrite(big_led, HIGH);   // âêëþ÷àåì íî÷íóþ ïîäñâåòêó
  if (state)
sens=digitalRead(senspin);
 digitalWrite(statled, sens);  //встроенный диод горит, если есть движение
Serial.print("Motion Sensor: "); Serial.print(sens);
Serial.print("/ Mode: "); Serial.println(stat); // вывод для отладки
  if (sens==1 && stat==0) stat=2; 
  if (sens==1 && stat==4) stat=2;
  if (I!=0) restart(I);
 
 switch (stat){ // выбор следующего действия (горит,вкл,выкл)
     case 0: digitalWrite (big_led,LOW);digitalWrite (small_led,LOW);  break;
     case 1: looking(); break;
     case 2: led_on(); break;
     case 4: led_off(); break;
 }
 
 
}

void led_on(){                   // плавное включение лент по очереди
int i=0; int i2=0;
for (int i=0; i <=255; i++){
 analogWrite (big_led,i);
 if (i>50) i2=i2+2;
 if (i2>255) i2=255;
analogWrite (small_led,i2);
delay (10);
stat=1;
}
}

void led_off(){                 // плавно выключаем ленты
 for (int i=255; i >= 0; i--){
     analogWrite(big_led, i);
     analogWrite(small_led, i);
     sens=digitalRead(senspin);
     if (sens==1) {I=i;break;}
     delay(10);}
 stat=0;
}

void looking(){                 // пока горит свет, слушаем датчик
 int Q=0;                      // для определения присутствия
 for (int C=0; C<150;C++){
   Q=Q+digitalRead(senspin);delay(200);}
   if (Q!=0) stat=1;
   else stat=4;
}
   
void restart(int i){            // если свет начал гаснуть и случилось движение
do                              // плавно выводим яркость в максимальное значение
{analogWrite (big_led,i);
analogWrite (small_led,i);
i++;
delay (10);}
while (i<=255);
I=0;
stat=1;
}

 

 

 

Andrey12
Andrey12 аватар
Offline
Зарегистрирован: 26.12.2014

А датчик освещения у вас где расположен? Свет от подсветки на него попадает?

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

Nosferatu
Offline
Зарегистрирован: 04.11.2012

Где стоит датчик освещенности? Когда лента включается, она сама себя не гасит?

keefa
Offline
Зарегистрирован: 19.06.2015

Я реализовал такой проект, стоит дома и работает уже около года. Фоторезистор не использовал за ненадобностью, освещения в рабочей зоне всегда не хватает. Так же реализовал управление освещением с помощью ИК пульта от телевизора. С пульта можно менять задержку на отключение освещения, включать режим "на 1час" (бывает что супруга чем то мелким занимается, и ПИР-датчик не видит движения, при включении этого режима, не зависимо от движения, освещение отключится через час.). Включать режим "постоянно включено" (работают только механические выключатели. тоже бывает необходим). Все режимы индицируются с помощью одного светодиода (частота моргания). Сначала использовал ленту RGB, не устроило то, что добиться нормального бело света, практически невозможно. Заменил на жесткие светодиодные линеки, вставил их в аллюминивый светодиодный профиль, стало очень светло, теперь думаю ввести диммирование )))))) .  Фото---

https://yadi.sk/i/7_sgO_WuoD7NJ

ant145
Offline
Зарегистрирован: 03.02.2016

Andrey12 пишет:

А датчик освещения у вас где расположен? Свет от подсветки на него попадает?

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

Датчик освещенности на макетной плате :-) Блин, совсм забыл про возможную самозасветку. Вечером проверю и отпишусь.

ant145
Offline
Зарегистрирован: 03.02.2016

keefa пишет:

Я реализовал такой проект, стоит дома и работает уже около года. Фоторезистор не использовал за ненадобностью, освещения в рабочей зоне всегда не хватает. Так же реализовал управление освещением с помощью ИК пульта от телевизора. С пульта можно менять задержку на отключение освещения, включать режим "на 1час" (бывает что супруга чем то мелким занимается, и ПИР-датчик не видит движения, при включении этого режима, не зависимо от движения, освещение отключится через час.). Включать режим "постоянно включено" (работают только механические выключатели. тоже бывает необходим). Все режимы индицируются с помощью одного светодиода (частота моргания). Сначала использовал ленту RGB, не устроило то, что добиться нормального бело света, практически невозможно. Заменил на жесткие светодиодные линеки, вставил их в аллюминивый светодиодный профиль, стало очень светло, теперь думаю ввести диммирование )))))) .  Фото---

https://yadi.sk/i/7_sgO_WuoD7NJ

Вариант без датчика света тоже рассматривал, но кухня находится с южной стороны и большую часть активного времени  хорошо освещается (естественнно не зимой с коротким световым днем). Время на задержку отключения можно любое поставить. Львиная доля походов на кухню в область рабочей зоны связана с: попить чая/воды, отрезать хлеба/булки, на это времени много не нужно. Режим "постоянно включено" тоже будет, как раз для ситуаций, когда готовится еда. Что касается лент, то они на разных светодиодах бывают, я использовал на 5630, на мой взгляд яркости хватает. Купил для них аллюминиевый профиль с дефлекторами.

Йожэг
Offline
Зарегистрирован: 16.01.2016

Знакомая ситуация с освещением: http://bash.im/quote/408905

ant145
Offline
Зарегистрирован: 03.02.2016

Протестировал. Всё-таки ошибка в скетче. .

PEN
Offline
Зарегистрирован: 21.04.2017

ant145 пишет:

Протестировал. Всё-таки ошибка в скетче. .

а где то ошибка была? скетч исправленый выложи