====== Эксперимент 5. Ночной светильник ====== [[конспект-arduino:терменвокс|← Терменвокс]] | [[конспект-arduino:|Оглавление]] | [[конспект-arduino:пульсар|Пульсар →]] В этом эксперименте светодиод должен включаться при падении уровня освещенности ниже порога, заданного потенциометром. ===== Список деталей для эксперимента ===== * 1 плата [[amp>product/arduino-uno|Arduino Uno]] * 1 беспаечная [[amp>collection/breadboards|макетная плата]] * 1 [[amp>product/led-5mm|светодиод]] * 1 [[amp>product/ldr|фоторезистор]] * 1 [[amp>product/resistor-220r|резистор]] номиналом 220 Ом * 1 [[amp>product/resistor-10k|резистор]] номиналом 10 кОм * 1 переменный резистор ([[amp>product/potentiometer|потенциометр]]) * 10 проводов [[amp>product/wire-mm|«папа-папа»]] ====Для дополнительного задания==== * еще 1 светодиод * еще 1 резистор номиналом 220 Ом * еще 2 провода ===== Принципиальная схема ===== {{ :конспект-arduino:5_scheme.svg.png?nolink& |}} ===== Схема на макетке ===== {{ :конспект-arduino:5_bread.svg.png?nolink& |}} ===== Обратите внимание ===== * В этом эксперименте мы устанавливаем фоторезистор между питанием и аналоговым входом, т.е. в позицию R1 в схеме [[конспект-arduino:делитель-напряжения|делителя напряжения]]. Это нам нужно для того, чтобы при уменьшении освещенности мы получали меньшее напряжение на аналоговом входе. * Постарайтесь разместить компоненты так, чтобы светодиод не засвечивал фоторезистор. ===== Скетч ===== #define LED_PIN 13 #define LDR_PIN A0 #define POT_PIN A1 void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { // считываем уровень освещённости. Кстати, объявлять // переменную и присваивать ей значение можно разом int lightness = analogRead(LDR_PIN); // считываем значение с потенциометра, которым мы регулируем // пороговое значение между условными темнотой и светом int threshold = analogRead(POT_PIN); // объявляем логическую переменную и назначаем ей значение // «темно ли сейчас». Логические переменные, в отличие от // целочисленных, могут содержать лишь одно из двух значений: // истину (англ. true) или ложь (англ. false). Такие значения // ещё называют булевыми (англ. boolean). boolean tooDark = (lightness < threshold); // используем ветвление программы: процессор исполнит один из // двух блоков кода в зависимости от исполнения условия. // Если (англ. «if») слишком темно... if (tooDark) { // ...включаем освещение digitalWrite(LED_PIN, HIGH); } else { // ...иначе свет не нужен — выключаем его digitalWrite(LED_PIN, LOW); } } ===== Пояснения к коду ===== * Мы используем новый тип переменных — ''boolean'', которые хранят только значения ''true'' (истина, 1) или ''false'' (ложь, 0). Эти значения являются результатом вычисления логических выражений. В данном примере логическое выражение — это ''lightness < threshold''. На человеческом языке это звучит как: «освещенность ниже порогового уровня». Такое высказывание будет истинным, когда освещенность ниже порогового уровня. Микроконтроллер может сравнить значения переменных ''lightness'' и ''threshold'', которые, в свою очередь, являются результатами измерений, и вычислить истинность логического выражения. * Мы взяли это логическое выражение в скобки только для наглядности. Всегда лучше писать читабельный код. В других случаях скобки могут влиять на порядок действий, как в обычной арифметике. * В нашем эксперименте логическое выражение будет истинным, когда значение ''lightness'' меньше значения ''threshold'', потому что мы использовали оператор ''<''. Мы можем использовать операторы ''>'', ''%%<=%%'', ''>='', ''=='', ''!='', которые значат «больше», «меньше или равно», «больше или равно», «равно», «не равно» соответственно. * Будьте особенно внимательны с логическим оператором ''=='' и не путайте его с оператором присваивания ''=''. В первом случае мы сравниваем значения выражений и получаем логическое значение (истина или ложь), а во втором случае присваиваем левому операнду значение правого. Компилятор не знает наших намерений и ошибку не выдаст, а мы можем нечаянно изменить значение какой-нибудь переменной и затем долго разыскивать ошибку. * Условный оператор ''if'' («если») — один из ключевых в большинстве языков программирования. С его помощью мы можем выполнять не только жестко заданную последовательность действий, но принимать решения, по какой ветви алгоритма идти, в зависимости от неких условий. * У логического выражения ''lightness < threshold'' есть значение: ''true'' или ''false''. Мы вычислили его и поместили в булеву переменную ''tooDark'' («слишком темно»). Таким образом мы как бы говорим «если слишком темно, то включить светодиод» * С таким же успехом мы могли бы сказать «если освещенность меньше порогового уровня, то включить светодиод», т.е. передать в ''if'' всё логическое выражение: if (lightness < threshold) { // ... } * За условным оператором ''if'' обязательно следует блок кода, который выполняется в случае истинности логического выражения. Не забывайте про обе фигурные скобки ''{}''! * Если в случае истинности выражения нам нужно выполнить только //одну// инструкцию, ее можно написать сразу после ''if (...)'' без фигурных скобок: if (lightness < threshold) digitalWrite(LED_PIN, HIGH); * Оператор ''if'' может быть расширен конструкцией ''else'' («иначе»). Блок кода или единственная инструкция, следующий за ней, будет выполнен только если логическое выражение в ''if'' имеет значение ''false'', «ложь». Правила, касающиеся фигурных скобок, такие же. В нашем эксперименте мы написали «если слишком темно, включить светодиод, иначе выключить светодиод». ===== Вопросы для проверки себя ===== - Если мы установим фоторезистор между аналоговым входом и землей, наше устройство будет работать наоборот: светодиод будет включаться при увеличении количества света. Почему? - Какой результат работы устройства мы получим, если свет от светодиода будет падать на фоторезистор? - Если мы все же установили фоторезистор так, как сказано в предыдущем вопросе, как нам нужно изменить программу, чтобы устройство работало верно? - Допустим, у нас есть код ''if (условие) {действие;}''. В каких случаях будет выполнено ''действие''? - При каких значениях ''y'' выражение ''x + y > 0'' будет истинным, если ''x > 0''? - Обязательно ли указывать, какие инструкции выполнять, если условие в операторе ''if'' ложно? - Чем отличается оператор ''=='' от оператора ''=''? - Если мы используем конструкцию ''if (условие) действие1; else действие2;'', может ли быть ситуация, когда ни одно из действий не выполнится? Почему? ===== Задания для самостоятельного решения ===== - Перепишите программу без использования переменной ''tooDark'' с сохранением функционала устройства. - Добавьте в схему еще один светодиод. Дополните программу так, чтобы при падении освещенности ниже порогового значения включался один светодиод, а при падении освещенности ниже половины от порогового значения включались оба светодиода. - Измените схему и программу так, чтобы светодиоды включались по прежнему принципу, но светились тем сильнее, чем меньше света падает на фоторезистор. ---- [[конспект-arduino:терменвокс|← Терменвокс]] | [[конспект-arduino:|Оглавление]] | [[конспект-arduino:пульсар|Пульсар →]]