В большинстве случаев я являюсь осознанным противником хардкорного радиолюбительства. Это когда всё делается с нуля. Разводится плата, травится. Схемотехника рассчитывается с использованием мелкой логики и пассивных элементов. Дроссели исключительно самодельные и так далее. Нет, если процесс важнее результата, то всё в полном порядке. И да, при таком подходе возможна значительная экономия бюджета проекта. Вот только самый ценный ресурс, который стоит экономить всегда, это время. Если процесс обмена времени на деньги хорошо отработан и широко используется, то вот с обратным обменом всё куда печальнее - он в обозримой реальности отсутствует.
К чему я это всё? К тому, что в большинстве случаев предпочитаю использовать готовые модули - те самые электронные кубики, вынесенные в название канала, но не всегда. Одним из таких исключений является
датчик освещённости.
Предположим наличие на кухне часов на светодиодных семисегментных индикаторах. С одной стороны, такие часы облегчают тайные ночные набеги на холодильник, неплохо освещая кухню. С другой, ненароком брошенный на них в темноте взгляд, может надолго выжечь текущее время на сетчатке глаза. Выхода из этой ситуации ровно два - надевать по ночам тёмные очки перед тем, как поинтересоваться текущим временем и организовать динамическое изменение яркости дисплея, в зависимости от освещённости. (Вариант, не появляться на кухне по ночам и в темноте не рассматривается по понятным причинам) Как ни странно, организовать динамическое изменение яркости проще, чем искать тёмные очки в тёмной комнате. Этим и займёмся.
Для реализации датчика освещённости нужно всего 2 (две) детали. Фоторезистор и просто резистор. Даже не знаю - имеет ли смысл рисовать схему. Ладно пусть будет.
Как не сложно заметить получился делитель напряжения. На выходе напряжение будет изменяться прямо пропорционально освещённости фоторезистора. Нужна обратная зависимость? Так нет ничего проще - просто меняем полярность включения датчика. Т.е. свободную ногу фоторезистора к земле, а резистор на "+" и всё, теперь напряжение на выходе будет падать при увеличении освещённости.
Как всё это поможет не ослепнуть при взгляде на часы? В моём случае использовался фоторезистор заказанный с известного китайского сайта по цене около трех рублей за штуку. Характеристики продавец указать не удосужился, но это и не важно. Резистор на 6,8 КОм. Это тоже не принципиально и номинал резистора можно смело менять в довольно широких пределах. Во всяком случае, до тех пор, пока речь о использовании датчика с ардуино-подобными платами. Итак, запаиваем резистор прямо на плату контроллера между землёй и аналоговым входом. Пусть будет А0. Фоторезистор между +3,3 (или +5) и тем же А0. Лучше на проводках, чтобы вывести на корпус рядом с дисплеем. Пишем ОЧЕНЬ СЛОЖНЫЙ СКЕТЧ
- void setup() {
- Serial.begin(9600);
- }
- void loop() {
- Serial.println (analogread (A0));
- delay(500);
- }
Загружаем в ардуинку и смотрим на циферки в мониторе порта, создавая различные условия освещения для фоторезистора.
В моём случае данные колебались от 27 (фоторезистор закрыт пальцем, темнота) до 1000 с мелочью (фоторезистор освещён самым ярким фонариком, что попался под руку). Сразу хочу заметить, что цифры полученные таким методом являются итогом измерения освещённости "в попугаях" и никакого отношения к каким-либо общепринятым единицам измерения освещённости отношения не имеют. Можно конечно раздобыть люксметр и откалибровать датчик, но точность используемого фоторезистора не известна и конечный результат всё равно будет "плюс, минус лапоть". И самое главное, в рамках поставленной задачи, подобная деятельность будет явно избыточной.
Далее. В моём случае, дисплей управляется ТМ1637. Очень распространённый контроллер с кучей библиотек. Кроме всего прочего позволяет управлять яркостью дисплея. От 1 до 7. Вполне достаточно.
Пишем ещё одну программку.
- void light_sens()
- {
- int light = analogRead(A0);
- int i = 7;
- if (light <= 600) i=6;
- if (light <= 500) i=5;
- if (light <= 400) i=4;
- if (light <= 300) i=3;
- if (light <= 200) i=2;
- if (light <= 100) i=1;
- disp.brightness(i); // эта строчка устанавливает яркость. синтаксис ///зависит от используемой библиотеки ТМ1637.
- }
Добавляем в скетч и периодически обращаемся к функции light_sens(); Чем чаще обращаемся, тем меньше задержка в изменении яркости дисплея. Пороги переключения можно подобрать на свой вкус эмпирическим методом, подставляя в функцию свои числа и оценивая результат. Главное, чтобы они оставались в порядке уменьшения. Если вы сторонник математического подхода, можно полученный в первом скетче диапазон разделить на 7 и получившуюся цифру использовать в качестве шага градации яркости.
Собственно и всё, что можно сказать о датчике освещённости. О самих часах, которые не совсем и часы, расскажу как-нибудь в другой раз. Подписывайтесь.
Ну, и "минутка рекламы" - ссылки на фоторезисторы по 3 рубля и дисплей на ТМ1637 с белым свечением. Кстати сам довольно долго искал именно белый. Может кому интересно.