Из вопросов к эксперименту: Какой результат работы устройства мы получим, если свет от светодиода будет падать на фоторезистор? Если мы все же установили фоторезистор так, как сказано в предыдущем вопросе, как нам нужно изменить программу, чтобы устройство работало верно? Как ни ставил фото-резистор и светодиод, разницы никакой не ощутил. Понятно, что когда темно, светодиод загорается и теоретически фоторезистор должен на него среагировать, потухнуть, и последовательность повторяется. Но грань, когда светодиод влияет на фото-резистор, так незаметна, что я даже не знаю, как переписать программу, а уж тем более проверить, правильно ли она работает. В общем, эти два вопроса я не понял, объясните, пожалуйста.
Рабочий. Сама схема из эксперимента работает отлично. Вырубаю свет, светодиод загорается, включаю - затухает, всё, как положено. После расположения светодиода рядом с фоторезистором - ничего не меняется - т.е. схема работает так же исправно (при том же повороте ручки потенциометра).
Значит пишем в выводах эксперимента №5 - светового потока светодиода недостаточно для работы с данным типом фоторезистора
Ок, спасибо. Значит, ответы на вопросы будут следующие: 1. Заметных изменений не наблюдается 2. И программу менять не надо
UPD. Я вновь вернулся к этому вопросу. Теперь, когда мне стала известна команда Serial.print, можно отследить показатели при которых светодиод гаснет и зажигается. Они говорят о том, насколько влияет светодиод на фоторезистор. Также, если сделать задержку в конце цикла, то заметно, как светодиод начинает мигать, чего не должно происходить (или хотя бы свести вероятность и длительность миганий к минимуму). Предыдущие ответы на вопросы отменяются. 1. Разброс между пороговыми значениями включения/выключения при удалённом светодиоде - в среднем 27 (тоже есть, но не так значительно), а при близком расположении - более 100 (иногда проскальзывали значения в 150). Без задержки светодиод горит не в полную силу - то есть мечется между двумя значениями - HIGH и LOW. 2. Теперь задача уменьшить влияние светодиода программно. Бьюсь весь день. Может, кто-нибудь тоже занимался этим вопросом и решил его. Даже если не решил, интересно посмотреть разные версии. Помогите, пока не решу эту задачу, не успокоюсь.
Схема и код отсюда. Оттуда же и само задание (в самом низу) http://wiki.amperka.ru/конспект-arduino:ночной-светильник Я там добавил лишь вывод в консоль показаний при переключении светодиода. Все свои попытки выполнить задание я, к сожалению, не сохранил, но вот некоторые из них: 1. Добавлять или убавлять свет искусственно в зависимости от того, включён или выключен светодиод. Иногда разброс компенсировался, но при повороте потенциометра всё слетало. 2. Добавил счётчик мельканий. Каждый раз, когда светодиод пробегает из одного состояния в другое более определённого количества раз (допустим, 10), свет компенсировался значением, равным разнице между пороговыми значениями включения/выключения. Появились трудности с вычислением этой самой разницы. Даже если взять её за константу, как в предыдущем варианте, то счётчик всё равно рано или поздно ведь придётся обнулить и мелькания начнутся заново.
Я тут много понаписал, а на самом деле вся задача - просто ответить на вопросы к эксперименту. Они ведь в пятой схеме и должны быть относительно простыми. Чувствую, что решение элементарное, раз больше никто не обращался за помощью, но, наверное, я недостаточно сообразителен.
Вы не обижайтесь, но если вам нужна помощь, то покажите свой код, чётко напишите что вам хочется получить и какие у вас возникают проблемки. Тогда может быть кто то и поможет вам. Пока только болтовня.
На радиокоте помогли, вот готовый скетч для тех, кто столкнётся с теми же трудностями в будущем xD Короче, как я и ожидал, решение оказалось довольно простым. Надо просто вырубать светодиод на момент считывания показаний с фоторезистора. Код (Text): #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 int ledOn = false; void setup() { pinMode(LED_PIN, OUTPUT); Serial.begin(9600); } void loop() { digitalWrite(LED_PIN, LOW); delay(1); int lightness = analogRead(LDR_PIN); if(ledOn) digitalWrite(LED_PIN, HIGH); int threshold = analogRead(POT_PIN); boolean tooDark = (lightness < threshold); if (tooDark) { digitalWrite(LED_PIN, HIGH); delay(50); if(!ledOn) Serial.println(lightness); ledOn = true; // светодиод горит } else { digitalWrite(LED_PIN, LOW); if(ledOn) Serial.println(lightness); ledOn = false; // светодиод не горит } }
Если намекнёшь на решение, буду благодарен. Если нет, то думаю, когда наберусь опыта оно придёт само. А пока я приступлю к следующему уроку, чтоб не топтаться на месте. Я делаю модификации к каждому примеру, а затем повторяю по памяти, чтобы запомнить схему и код. Ну и, конечно, в процессе навык повышаю, почему бы не совместить эти две цели.