Сегодня сделаем скетч и прототип схемы на Arduino с пользованием фоторезистора. Вот фоторезистор, находится здесь, я собралась такой макет, он похож на новогоднюю светодиодную гирлянду из предыдущих статей.

новогодняя гирлянда на светодиодах

У нас 8 светодиодов, они установлены так, что слева короткая ножка это минус, справа длинная ножка это плюс. Так они все установлены, в схеме использован один резистор на 10 килоом, я его брал из набора Arduino Kit, и используется 8 подключенных к плюсовому контакту светодиода сопротивлений на 220ом, так оно подключено.

светодиоды и фоторезистор

Использовано 8 чёрных проводов это минусовые, и зелёные 8 штук – пины управления от двенадцатого до пятого. В процессе отладки крайний черный заменил на зеленый, но об этом позже.

Фоторезистор здесь, рядом с ним резистор на 10килоом, синяя перемычка идёт к минусу, оранжевый подключается одним концом в среднюю точку, между резистором и фоторезистором, другим концом в плату Arduino, в А0(аналоговый пин).

Красный это 5 Вольт, и вот через этот делитель напряжения будет работать схема, будут загораться светодиоды, в зависимости от уровня освещенности. Я поправлю светодиоды, достаточно шаткая получилось конструкция. К модели ещё вернемся, а сейчас займемся написанием скетча.

Создадим новый проект, и приступим к написанию, объявим константы, несколько штук, пусть будет тип int, это будет количество выводов, поскольку светодиодов в схеме 8 штук. Так будет указано, сколько светодиодов использовали в схеме.

const int NbrLEDs = 8;

Сделаем массив с номерами пинов, задействуем 5 6 7 8 9 10 11 12 цифровые разъёмы, укажем номер пина на котором снимается уровень освещённости, объявим переменную для фоторезистора, значение сенсора и также объявим уровень освещённости, чтобы можно было делать разбивку их по пинам.

const int ledPins[] = { 5, 6, 7, 8, 9, 10, 11, 12};
const int photocellPin = A0;
int sensorValue = 0;
int ledLevel = 0;

В подпрограмме setup напишем цикл, в котором чтобы не присваивать каждому значению исходящего через pinMode, пройдём в цикле по всем пинам присвоим им значения в pinmode из массива и каждому пину присвоим значение OUTPUT.

void setup() {
  for (int led = 0; led < NbrLEDs; led++)
  {
    pinMode(ledPins[led], OUTPUT);
  }
}

В принципе можно было этого не делать, можно было указать pinmode и дальше писать пять, потом 6, и так далее, но это очень долго и это дикий варварский метод. Поэтому в цикле за один проход пройдем все пины.

pinMode(5, OUTPUT);
pinMode(6, OUTPUT);

В loop получим значение сенсора, считав через analogRead из пина A0.

Далее, сделаем разбивку значение сенсор, используя функцию map получаем значение сенсора, и исходя из уровня освещенности, при чувствительности от 300 до максимального значения 1023, будет распределяться по 8 пинам, которая объявлены выше.


Смотрите так же видео Фоторезистор и светодиоды на Arduino - (видео), ссылка откроется в новой вкладке.


Далее в цикле пройдем все пины, так добавил скобки, начиная с первого светодиода, если счетчик не больше 8 будем прибавлять, и дальше проверим по условию, что если номер светодиода меньше уровня освещения, подадим на этот светодиод и все предыдущие напряжение через константу HIGH.

Если же нет, запишем в него отсутствие напряжения, и светодиод не будет гореть.

void loop() {
sensorValue = analogRead(photocellPin);
ledLevel = map(sensorValue, 300, 1023, 0, NbrLEDs); 
for (int led = 0; led < NbrLEDs; led++)
  {
    if (led < ledLevel ) {
      digitalWrite(ledPins[led], HIGH);
}
    else
 {
      digitalWrite(ledPins[led],LOW); 
}
}
}

Выравниваем код через комбинацию клавиш ctrl+T и давайте теперь посмотрим, что получится, запустим на проверку, сохраним скетч.

Так компиляция скетча, теперь его загрузим на Arduino. Вернемся к схеме, на данный момент один светодиод при изменении освещение не горит из-за плохого контакта.

плохой контакт

Сейчас исправлю, не будем его трогать, если я выключу освещение, то погаснут все светодиоды. Если же я буду подсвечивать фоторезистор фонариком, плавно добавляя освещения, то будут гореть практически все светодиоды, ну и соответственно убираю, уменьшая уровень освещённости, меняется число горящих светодиодов.

частичная освещенность фоторезистора

Если же я включу полностью освещение, горят почти все, в чём проблема с этим светодиодом. Достаточно много потратил на него времени, здесь всё правильно собрано, даже минус пробросил заведомо исправным зеленым проводом, но почему-то он капризничает и не горит.

глючит светодиод

Давайте теперь вернемся к скетчу и посмотрим что не так. Пример был взят с официального источника, на диске к Arduino есть такой же код.

В скетче получается распределение освещенности от 300 до 1023(максимального значения), попытка изменить начальный порог на 0 - никакого результатов не даёт.

Но если распределяем на 8 частей вот это вот всё значение, то тут пригодится калькулятор, получается, либо сопротивление на 10килоом даёт погрешность какую-то, нужно 1023 разделить на 8, получаем практически 128, если брать правильно, то 1024 разделить на 8, это и есть 128.

Теперь нужно от 1023 вычесть 128, поставить сюда значение 895, тогда по логике вещей должно быть всё нормально. Загрузим и посмотрим, что изменится.

void loop() {
sensorValue = analogRead(photocellPin);
ledLevel = map(sensorValue, 0, 895, 0, NbrLEDs); 
for (int led = 0; led < NbrLEDs; led++)
  {
    if (led < ledLevel ) {
      digitalWrite(ledPins[led], HIGH);
}
    else
 {
      digitalWrite(ledPins[led],LOW); 
}
}
}

Сейчас горят все светодиоды, попробуем перекрыть освещенность, или давайте отключим…

Стартовое значение всё равно надо вернуть 300, поскольку подается на эти три первых светодиода питания. Давайте изменим в скетче 0 на 300, как было, было это сделано не просто так, перезалью скетч и посмотрим, что изменится на этот раз…

void loop() {
sensorValue = analogRead(photocellPin);
ledLevel = map(sensorValue, 300, 895, 0, NbrLEDs);
for (int led = 0; led < NbrLEDs; led++)
  {
    if (led < ledLevel ) {
      digitalWrite(ledPins[led], HIGH);
}
    else
 {
      digitalWrite(ledPins[led],LOW); 
}
}
}

Теперь горит первый светодиод, при минимальном освещении, если включить все, а там у меня 1800 люксов, из двух метров светодиодной ленты, горят все, как и должно.

фоторезистор ловит остаточное освещение

При выключении фоторезистор ловит остаточное освещение в помещении, горит люстра, не полная тьма, и он срабатывает. Но если подсвечивать фонариком, подавая плавно свет на фоторезистор, схема работает правильно.

тьма и фоторезистор

Если вырубить свет полностью, посмотрим, что получится в полной темноте. Как видите, при полном отсутствии света, фоторезистор реагирует правильно, светодиоды загораются постепенно, по мере увеличения освещенности. При включенном свете горят все. Такой вот получился скетч, с лайфхаком – подгонка чувствительности фоторезистора, под свои нужды.

Правильная работа схемы фоторезистора

Смотрите видео: Фоторезистор и светодиоды на Arduino


Понравилась статья? Поделитесь ею с друзьями и напишите отзыв в комментариях!




Cookies make it easier for us to provide you with our services. With the usage of our services you permit us to use cookies.
Ok