Подключение фоторезистора к arduino uno. Ардуино подключение фоторезистора. Датчик освещенности для arduino. Фотодиоды в схемах на МК

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

Внешний вид и обозначение на схеме

В основном фоторезисторы выглядят вот так



На схемах могут обозначаться так

или так

Как работает фоторезистор

Давайте рассмотрим одного из представителя семейства фоторезисторов


На нем, как и во всех фотоэлементах, есть окошко, с помощью которого он “ловит” свет.



Главным параметром фоторезистора является его темновое сопротивление. Темновое сопротивление фоторезистора - это его сопротивление при полном отсутствии падения света на него. Судя по справочнику, темновое сопротивление нашего подопечного 15х10 8 Ом или словами - 1,5 ГОм. Можно даже сказать - полнейший обрыв. Так ли это? Давайте глянем. Для этого я использую свою записную книжку и прячу там фоторезистор:


Даже в диапазоне 200 МОм мультиметр показал единичку. Это означает, что сопротивление фоторезистора далеко за 200 МОм.

Убираем нашего подопытного из книжки и включаем в комнате свет. Результат сразу же на лицо:


106,7 КОм.

Теперь включаю свою настольную лампу. В комнате стало еще светлее. Смотрим на показания мультиметра:


76,2 КОм.

Подношу фоторезистор вплотную к настольной лампе:


18,6 КОм

Делаем вывод: чем больше поток света попадает на фоторезистор, тем меньше его сопротивление.

Новые статьи

● Проект 13: Фоторезистор. Обрабатываем освещённость, зажигая или гася светодиоды

В этом эксперименте мы познакомимся с аналоговым датчиком для измерения освещенности - фоторезистором (рис. 13.1).

Необходимые компоненты:

Распространённое использование фоторезистора - измерение освещённости. В темноте его сопротивление довольно велико. Когда на фоторезистор попадает свет, сопротивление падает пропорционально освещенности. Схема подключения фоторезистора к Arduino показана на рис. 13.2. Для измерения освещённости необходимо собрать делитель напряжения, в котором верхнее плечо будет представлено фоторезистором, нижнее - обычным резистором достаточно большого номинала. Будем использовать резистор 10 кОм. Среднее плечо делителя подключаем к аналоговому входу A0 Arduino.

Рис. 13.2. Схема подключения фоторезистора к Arduino

Напишем скетч чтения аналоговых данных и отправки их в последовательный порт. Содержимое скетча показано в листинге 13.1.

Int light; // переменная для хранения данных фоторезистора void setup () { Serial.begin(9600 ); } void loop () { light = analogRead(0 ); Serial.println(light); delay(100 ); }
Порядок подключения:

1. Подключаем фоторезистор по схеме на рис. 13.2.
2. Загружаем в плату Arduino скетч из листинга 13.1.
3. Регулируем рукой освещенность фоторезистора и наблюдаем вывод в последовательный порт изменяющихся значений, запоминаем показания при полной освещенности помещения и при полном перекрывании светового потока.

Теперь создадим индикатор освещенности с помощью светодиодного ряда из 8 светодиодов. Количество горящих светодиодов пропорционально текущей освещенности. Собираем светодиоды по схеме на рис. 13.3, используя ограничительные резисторы номиналом 220 Ом.

Рис. 13.3. Схема подключения фоторезистора и светодиодов к Arduino


Содержимое скетча для отображения текущей освещенности на линейке светодиодов показано в листинге 13.2.

// Контакт подключения светодиодов const int leds={3 ,4 ,5 ,6 ,7 ,8 ,9 ,10 }; const int LIGHT=A0; // Контакт A0 для входа фоторезистора const int MIN_LIGHT=200 ; // Нижний порог освещенности const int MAX_LIGHT=900 ; // верхний порог освещенности // Переменная для хранения данных фоторезистора int val = 0 ; void setup () { // Сконфигурировать контакты светодиодов как выход for (int i=0 ;i<8 ;i++) pinMode(leds[i],OUTPUT); } void loop () { val = analogRead(LIGHT); // Чтение показаний фоторезистора // Применение функции map() val = map (val, MIN_LIGHT, MAX_LIGHT, 8 , 0 ); // ограничиваем, чтобы не превысило границ val = constrain(val, 0 , 8 ); // зажечь кол-во светодиодов, пропорциональное освещенности, // остальные потушить for (int i=1 ;i<9 ;i++) { if (i>=val) // зажечь светодиоды digitalWrite(leds,HIGH); else // потушить светодиоды digitalWrite(leds,LOW); } delay(1000 ); // пауза перед следующим измерением }
Порядок подключения:

1. Подключаем фоторезистор и светодиоды по схеме на рис. 13.3.
2. Загружаем в плату Arduino скетч из листинга 13.2.
3. Регулируем рукой освещенность фоторезистора и по количеству горящих светодиодов определяем текущий уровень освещенности (рис. 13.3).

Нижний и верхний пределы освещенности мы берем из запомненных значений при проведении эксперимента по предыдущему скетчу (листинг 13.1). Промежуточное значение освещенности мы масштабируем на 8 значений (8 светодиодов) и зажигаем количество светодиодов пропорциональное значению между нижней и верхней границами.

Листинги программ

Сегодня сделаем скетч и прототип схемы на 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, 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, HIGH); } else { digitalWrite(ledPins,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, HIGH); } else { digitalWrite(ledPins,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, HIGH); } else { digitalWrite(ledPins,LOW); } } }

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


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


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


Рассмотренный в предыдущей части обзора встроенный АЦП микроконтроллера позволяет легко подключать к плате Arduino различные аналоговые датчики, которые преобразуют измеряемые физические параметры в электрическое напряжение.

Примером простейшего аналогового датчика может служить переменный резистор, подключённый к плате, как показано на рис. 1. Он может быть любого типа, например СП3-33-32 (рис. 2). Номинал резистора на схеме указан ориентировочно и может быть как меньше, так и больше. Однако следует помнить, что чем меньше сопротивление переменного резистора, тем больший ток он потребляет от источника питания микроконтроллера. А при сопротивлении источника сигнала (в данном случае переменного резистора) более 10 кОм АЦП микроконтроллера работает с большими ошибками. Учтите, что сопротивление переменного резистора как источника сигнала зависит от положения его движка. Оно равно нулю в его крайних положениях и максимально (равно четверти номинального сопротивления) в среднем положении.

Рис. 1. Схема подключения переменного резистора к плате

Рис. 2. СП3-33-32

Удобно использовать переменный резистор, когда требуется изменять параметр плавно, а не ступенями (дискретно). В качестве примера рассмотрим работу приведённой в табл. 1 программы, которая изменяет яркость свечения светодиода в зависимости от положения движка переменного резистора. Строка U = U/4 необходима в программе для того, чтобы преобразовать возвращаемое АЦП десятиразрядное двоичное число в восьмиразрядное, принимаемое в качестве второго операнда функцией analogWrite(). В рассматриваемом случае это делается делением исходного числа на четыре, что эквивалентно отбрасыванию двух младших двоичных разрядов.

Таблица 1.

Переменный резистор соответствующей конструкции может служить датчиком угла поворота или линейного перемещения. Аналогично ему можно подключать многие радиоэлементы: фоторезисторы, терморезисторы, фотодиоды, фототранзисторы. Одним словом, приборы, электрическое сопротивление которых зависит от тех или иных факторов окружающей среды.

На рис. 3 изображена схема подключения к Arduino фоторезистора. При изменении освещённости меняется его электрическое сопротивление и соответственно напряжение на аналоговом входе платы Arduino. Указанный на схеме фоторезистор ФСК-1 можно заменить любым другим, например СФ2-1.

Рис. 3. Схема подключения к Arduino фоторезистора

В табл. 2 приведена программа, превращающая плату Arduino с подключённым к ней фоторезистором в простейший измеритель освещённости. Работая, она периодически измеряет падение напряжения на резисторе, включённом последовательно с фоторезистором, и передаёт результат в условных единицах через последовательный порт на компьютер. На экране отладочного терминала Arduino они будут отображены, как показано на рис. 4. Как видим, в определённый момент измеренное напряжение резко уменьшилось. Это произошло, когда ярко освещённый фотодиод был затенён непрозрачным экраном.

Таблица 2.

Рис. 4. Изображение на экране отладочного терминала Arduino

Чтобы получать значения освещённости в люксах (стандартных единицах системы СИ), нужно умножать полученные результаты на поправочный коэффициент, но подобрать его придётся экспериментально, причём индивидуально для каждого фоторезистора. Для этого потребуется образцовый люксметр.

Фототранзистор или фотодиод (рис. 5) подключают к Arduino подобным образом. Используя несколько светочувствительных приборов, можно сконструировать простейшую систему зрения для робота . Можно и на новом техническом уровне реализовать многие известные широкому кругу радиолюбителей классические конструкции - кибернетическую модель ночной бабочки или модель танка, который движется на свет .

Рис. 5. Схема подключения фотодиода к Arduino

Аналогично фоторезистору подключают к Arduino терморезистор (рис. 6), который меняет своё электрическое сопротивление в зависимости от температуры. Вместо указанного на схеме терморезистора ММТ-4, основное достоинство которого - герметичный корпус, можно использовать практически любой другой, например, ММТ-1 или импортный.

Рис. 6. Схема подключения терморезистора к Arduino

После соответствующей калибровки подобный прибор можно применять для измерения температуры во всевозможных домашних метеостанциях, термостатах и тому подобных конструкциях .

Известно, что почти все светодиоды могут служить не только источниками света, но и его приёмниками - фотодиодами. Дело в том, что кристалл светодиода находится в прозрачном корпусе и поэтому его p-n переход доступен для света от внешних источников. К тому же корпус светодиода, как правило, имеет форму линзы, которая фокусирует внешнее излучение на этом переходе. Под его влиянием изменяется, например, обратное сопротивление p-n перехода.

Подключив светодиод к плате Arduino по схеме, изображённой на рис. 7, можно использовать один и тот же светодиод и по прямому назначению, и как фотодатчик . Программа, иллюстрирующая такой режим, приведена в табл. 3. Её идея состоит в том, что сначала на p-n переход светодиода подают обратное напряжение, заряжая его ёмкость. Затем катод светодиода изолируют, конфигурируя как вход вывод Arduino, к которому он подключён. После этого программа измеряет зависящую от внешней освещённости продолжительность разрядки ёмкости p-n перехода светодиода его собственным обратным током до уровня логического нуля.

Рис. 7. Схема подключения светодиода к плате Arduino

Таблица 3

В приведённой программе переменная t описана как unsigned int - целое число без знака. Переменная такого типа, в отличие от обычной int, принимающей значения от -32768 до +32767, не использует свой старший двоичный разряд для хранения знака и может принимать значения от 0 до 65535.

Подсчёт времени разрядки программа выполняет в цикле while(digitalRead (K)!=0)t++. Этот цикл выполняется, всякий раз увеличивая значение t на единицу, пока истинно заключённое в скобки условие, т. е. пока напряжение на катоде светодиода не опустилось до низкого логического уровня.

Иногда требуется, чтобы робот не просто получал информацию об освещённости поверхности, по которой движется, но и мог определить её цвет. Реализуют датчик цвета подстилающей поверхности, освещая её поочерёдно светодиодами разного цвета свечения и сравнивая с помощью фотодиода уровни отражённых от неё при разном освещении сигналов . Схема соединения элементов датчика цвета с платой Arduino показана на рис. 8, а обслуживающая его программа - в табл. 4.

Рис. 8. Схема соединения элементов датчика цвета с платой Arduino

Таблица 4

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

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

Рис. 9. Пример конструкции датчика цвета из четырёх светодиодов и фотодиода

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

Основным элементом датчика являются фоторезисторы, фототранзисторы и фотодиоды.

Обозначение фоторезистора
Обозначение фоторезистора


Фоторезистор - полупроводниковый прибор, изменяющий величину своего сопротивления при облучении светом. В нем, как и во всех фотоэлементах, есть окошечко, с помощью которого он «ловит» свет, чем больше падает света на фоторезистор, тем меньше его сопротивление

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

Когда свет попадает на фоторезистор, он меняет сопротивление, чем больше света тем меньше сопротивление и больше падение напряжения на нем. При увеличении падения напряжения транзистор открывается, срабатывает реле. Порог срабатывания реле можно отрегулировать при помощи переменного резистора 50 кОм.

Различаются фоторезисторы по диапазону сопротивления. Например:

  • VT83N1 - 12-100кОм;
  • VT93N2 - 48-500кОм.

Это значит, что в темноте сопротивления фоторезистора равно 12кОм, а при определенной тестовой засветке - 100кОм. Конкретно в случае этих светодиодов, тестовая засветка имела параметры: освещенность -10 Люкс, и цветовая теплота - 2856К.

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





Пример подключения фоторезистора к Ардуино

На выходе цепи фоторезистора мы получим некое напряжение, в диапазоне от 0 до 5 Вольт, которое нам потребуется превратить в конкретное число, с которым уже будет работать программа микроконтроллера.


Ардуино подключение фоторезистора — схема
Так выглядит собранная модель Arduino с фоторезистором:

Необходимые компоненты для подключения фоторезистора на Arduino

Так выглядит собранная модель Arduino с фоторезистором:

Самое простое, что мы можем сделать - это зажигать на Ардуино штатный светодиод #13. Получается скетч:

const int pinPhoto = A0;

const int led = 13;

pinMode(pinPhoto, INPUT);

pinMode(led, OUTPUT);

raw = analogRead(pinPhoto);

if(raw < 600)

digitalWrite(led, HIGH);

digitalWrite(led, LOW);

Датчик освещенности — ардуино подключение





BH1750FVI цифровой модуль освещенности для Arduino

Для измерения освещенности отлично подходят на базе сенсора BH1750 датчики Gy-30 и Gy-302.

Характеристики BH1750FVI цифровой модуль освещенности для Arduino:

  • Цифровой 16-битный цифровой датчик освещённости
  • Чувствителен к видимому свету и практически не подвержен влиянию инфракрасного излучения
  • Построен на микросхеме BH1750FVI
  • Напряжение питания: +3..+5 В постоянного тока.
  • Интерфейс: I2C.
  • Диапазон измеряемой освещенности: (1 — 65535 лк).
  • Размеры: 3,3 см х 1,5 см х 1,1 см
  • Вес: 5 г

// подключаем библиотеку I2C:

#include

// подключаем библиотеку датчика BH1750:

#include

// объявляем объект lightMeter:

BH1750 lightMeter;

void setup () {

Serial.begin(9600); //инициализация послед. порта

lightMeter.begin(); //инициализация датчика BH1750

void loop () {

//считываем показания с BH1750:

uint16_t lux = lightMeter.readLightLevel();

//выводим показания в послед. порт:

Serial.println(String(lux) + » lx»);

delay(100); //задержка 100 мсек

В скетче мы каждые 100 мсек считываем с датчика BH1750 показания освещённости в люксах и выводим эти данные в последовательный порт.

Проверяем работу. Для этого подключаем Ардуино к ПК. Запускаем среду разработки Arduino IDE и открываем монитор последовательного через меню Инструменты (Ctrl+Shift+M). Смотрим как меняются показания, если направить свет на датчик или если его затенить.

Похожие публикации