Автоколебания фотодатчика (решено)

Тема в разделе "Arduino & Shields", создана пользователем Karabas, 7 янв 2017.

  1. Karabas

    Karabas Гик

    Вем добрый вечер.
    Я немного запутался, хотел добавить в часы фотодатчик, который бы, при выключении света в комнате зажигал и плавно тушил подсветку (чтоб безопасно дойти до кровати :D).
    Код (объявление переменных и прочие сокращенно):
    Код (C++):
      if (millis() - l_check >= 250) {
       if (!l_flag) {
        l_curr = analogRead(A6); // чтение фоторезистора
       }
        l_check = millis();
      }
     
      if (l_curr < l_pre &&           // или стемнело
                l_pre >= 300 &&      // или до этого было свело
                    l_curr <= 250 && // или достаточно темно
                        !l_flag) {          // или уже горит подсветка
        l_flag = true;  // подсветка включилась
        l_pow = 255; // начальная яркость
      }
      l_pre = l_curr;

     
      if (l_flag) {
       if (millis() - l_interval > 70) {
       analogWrite (5, l_pow);
       if (l_pow <= 0) { // потухла ли подсветка
        l_flag = false;   // да потухла
        l_pre = 0;         // страховка от инерции фотодатчика
       }
       l_pow --; // уменьшение яркости
       l_interval = millis();
       }
      }
    Хотелось, чтоб он не тупо реагировал на потемнение, а с определенного значения.
    Но проблема вот в чем, иногда, после тушения подсветки, она вспыхивает снова, и снова, и снова.
    Причем случается это только в полной темноте (если даже светит монитор, подобный глюк не возникал), и как мне показалось, если над сенсором есть поверхность. Да, 6 штук 5050 светодиодов светят вверх, туда же смотрит сенсор (конструктивно они на одной планке,прикрытые матовым стеклом).

    Вроде и "костыли" поставил в виде условий и задержек, но все равно что то глючит.
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    Свет от подсветки повторно активирует фотодатчик?
    Тогда поставь условие, что если подсветка НЕ включена и есть резкое угасание внешнего света, то только тогда работать дальше.
     
  3. Karabas

    Karabas Гик

    Да, что то такое тоже было, примерно так
    Код (C++):
    if (l_curr < l_pre &&           // или стемнело
                l_pre >= 300 &&      // или до этого было свело
                    l_curr <= 250 && // или достаточно темно
                       l_pre - l_curr > 150 && // >>> проверка на резкое потемнение
                        !l_flag) {          // или уже горит подсветка
        l_flag = true;  // подсветка включилась
        l_pow = 255; // начальная яркость
      }
    Но с этим условием вообще ничего не работало, грешил на инерционносто фоторезистора.
     
  4. Karabas

    Karabas Гик

    Вот жеж блин! Тот случай, когда элементарная задача оборачивается какими-то космическими проблемами!
    Короче понаписал я кучу условий, итог- вообще не работает!
    Причина- тормознутость фоторезистора, если на свет он еще нормально реагирует, но при затемнении... вобщем чтот четко поймать резкий перепад значений, замеры нужно делать через 750 мкс:eek:
    В итоге решилось алгоритмом "перезарядка"
    Код (C++):
      if (millis() - l_check >= 250) {
       if (!l_flag ) {
        l_curr = analogRead(A6);
     
        if (l_curr < 100 && l_flag2 ) { // стемнело и было ли до этого светло
          l_flag  = true;
          l_flag2 = false;
          l_pow = 255;
        }
        if (l_curr > 200 && !l_flag2){ // посветлело и было ли до этого темно
          l_flag2 = true; // флаг "светло"
        }
     
       }
        l_check = millis();
      }
    Автоколебания решил просто, после того как на подсветку дается 0 (последняя итерация), я обновляю таймер l_check (проверка фотосенсора), и резюк затемняется окончательно, вреде помогло.
    Так что вот такие вот грабельки;)