Вем добрый вечер. Я немного запутался, хотел добавить в часы фотодатчик, который бы, при выключении света в комнате зажигал и плавно тушил подсветку (чтоб безопасно дойти до кровати ). Код (объявление переменных и прочие сокращенно): Код (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 светодиодов светят вверх, туда же смотрит сенсор (конструктивно они на одной планке,прикрытые матовым стеклом). Вроде и "костыли" поставил в виде условий и задержек, но все равно что то глючит.
Свет от подсветки повторно активирует фотодатчик? Тогда поставь условие, что если подсветка НЕ включена и есть резкое угасание внешнего света, то только тогда работать дальше.
Да, что то такое тоже было, примерно так Код (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; // начальная яркость } Но с этим условием вообще ничего не работало, грешил на инерционносто фоторезистора.
Вот жеж блин! Тот случай, когда элементарная задача оборачивается какими-то космическими проблемами! Короче понаписал я кучу условий, итог- вообще не работает! Причина- тормознутость фоторезистора, если на свет он еще нормально реагирует, но при затемнении... вобщем чтот четко поймать резкий перепад значений, замеры нужно делать через 750 мкс В итоге решилось алгоритмом "перезарядка" Код (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 (проверка фотосенсора), и резюк затемняется окончательно, вреде помогло. Так что вот такие вот грабельки