Ардуино: датчик света на фоторезисторе

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

Еще одно применение датчиков света — это детектирование препятствия роботом, путешествующем по лабиринту. Либо детектирование линии роботом следопытом (LineFollower). Но в этих двух случаях, в паре с датчиком света используют специальный источник света.

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

Ардуино: датчик света на фоторезисторе

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

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

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

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

SFH229

Список необходимых компонентов

Для выполнения простого примера с фоторезистором, потребуется Ардуино-совместимый контроллер, резисторы, макетная плата и немного проводов вилка-вилка. Необходимые компоненты можно добавить в корзину прямо здесь, и затем оформить заказ в нашем интернет-магазине.

В корзину
В корзину
В корзину
В корзину
В корзину
В корзину

Подключение

Для того, чтобы подключить наш фоторезистор к Ардуино Уно, необходимо будет вспомнить урок, посвященный аналого-цифровому преобразованию (АЦП). Ведь на выходе цепи фоторезистора мы получим некое напряжение, в диапазоне от 0 до 5 Вольт, которое нам потребуется превратить во вполне себе конкретное число, с которым уже будет работать программа микроконтроллера. Держа в уме, что в Ардуино Уно есть 6 аналоговых входов на ногах A0-A5, подключаем фоторезистор по следующей схеме:

photox1_схема

Внешний вид макета

photox1_bb

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

DSC_0006

Программа

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

const int pinPhoto = A0;
int raw = 0;

void setup() {
  Serial.begin(9600);
  pinMode( pinPhoto, INPUT );
}

void loop() {
  raw = analogRead( pinPhoto );
  Serial.println( raw );
  delay(200);
}

Запустив эту программу у нас в хакспейсе, мы получили следующие значения с датчика:

photo_1

А теперь прикроем датчик рукой:

photo_2

Видно, что значение сильно меняется. От 830 при прямом попадании света, до 500 в случае затенения (появление преграды на пути света). Зная такое поведение, мы можем численно определить порог срабатывания. Пусть он будет равен, скажем, 600. Не ровно 500, потому что мы хотим обезопасить себя от случайного срабатывания. Вдруг над датчиком пролетит муха — он слегка затенится, и покажет 530.

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

const int pinPhoto = A0;
const int led = 13;
int raw = 0;

void setup() {
  pinMode( pinPhoto, INPUT );
  pinMode( led, OUTPUT );
}

void loop() {
  raw = analogRead( pinPhoto );
  if( raw < 600)
    digitalWrite( led, HIGH );
  else
    digitalWrite( led, LOW );
  delay(200);
}

Накрываем датчик рукой (или выключаем свет в комнате) — светодиод зажигается. Убираем руку — гаснет. Работает, однако. А теперь представьте, что вы зажигаете не светодиод, а подаете сигнал на реле, которое включает лампу в подъезде вашего дома. Получаеся готовый прибор для экономии электроэнергии. Или ставите такой датчик на робота, и он при наступлении ночи ложится спать вместе с вами 🙂 В общем, как говорил профессор Фарнсворт, у датчика света тысяча и одно применение!

К размышлению

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

Датчик света на фоторезисторе

Такой модуль удобен, если требуется создать прототип устройства или школьный мини-проект, который не должен сбоить от любого прикосновения к проводам.

Во-вторых, чтобы измерять освещенность в люксах, инженеры-осветители используют более сложные датчики — люксметры. Задача такого датчик — чувствовать свет, также, как глаз человека. Модуль люксметра тоже легко подключается к Ардуино, но об этом на другом уроке.


Изменено:

Ардуино: датчик света на фоторезисторе: Один комментарий

    • Не совсем понял, зачем поменять? Задача скетча зажигать светодиод, если в помещении становится темно.

      • Походу там ищо функция Serial.println( raw );
        не работает… может только у меня или ищо у кого?
        Нету такого окна как на сайте с числами.

        • Называется, учите матчасть. Окошко это называется монитор серийного порта. В программе arduino-ide открывается по клавишам ctrl+shift+m
          еще можно читать порт и самостоятельно с помощью питона (модуль pyserial , в гугле туча примеров)
          и очень важно чтобы и монитор порта и плата работали на одной скорости передачи данных

          • и кстати код рабочий, скопировал — вставил в эмулятор и работает !

  1. Из Вашого скетча (кода) переделал для своего проекта: два светодиода загораются pin -13 & pin — 8. Поправил ошибку Вашу — из затуханием и загоранием светодиода. Спасибо за столь хороший проект, Я как начинающий в Arduino говорю спасибо Вам.
    Мой скетч:

    const int pinPhoto = A0; // аналоговый порт для датчика
    const int led = 13; //задействуем 13 порт ардуино.
    const int led2 = 8; //задействуем 8 порт ардуино.
    int raw = 0; // начальная переменная, тоисть для начала 0.
    void setup() {
    pinMode( pinPhoto, INPUT ); // присваюваем перемеенную pinPhoto на вход сигнала.
    pinMode( led, OUTPUT ); // присваюваем переменную (светодиод led на плате ардуино) на выход сигнала- тоисть что б засветился.
    pinMode( led2, OUTPUT ); // присваюваем переменную (светодиод второй led2 — на моем борде) на выход сигнала — тоисть что б засветился.
    }
    void loop() {
    raw = analogRead( pinPhoto ); // считуем с аналогового входа А0 сигнал датчика.
    if( raw < 900) { // если уровень света не превышает 900, то
    digitalWrite( led2, LOW ); // то лед 2 — тоисть 8 порт светодиода — гаснет.
    }
    else // иначе лед 2 — тоисть 8 порт светодиода — загорается.
    digitalWrite( led2, HIGH );
    // digitalWrite( led2, HIGH );
    delay(500); // задержка на включение светодиода. если б біл 1000 delay — то ето 1 секунда.

    // всё то самое только с портом (led) 13, что находится на плате ардуино.
    raw = analogRead( pinPhoto );
    if( raw < 900) {
    digitalWrite( led, LOW );
    }
    else
    digitalWrite( led, HIGH );
    // digitalWrite( led2, HIGH );
    delay(500);
    }

  2. Всем привет! Подскажите как подключить с помощью фоторезистора, через ардуино — эл.двигатель (5v) Что бы в светлоее время суток эл.двигатель вращался в одну сторону, а в тёмное время суток, вращался в другую сторону.

    • для этого можно задействовать драйвер двигателя, например такой l298n, там полярность подаваемую на моторы можно менять как хочешь, плюс и скорость так же можно регулировать

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

  3. Что-то хрень какая-то у вас. Если Вы освещаете датчик, то , отталкиваясь от вашего описания, сопротивление датчика увеличивается, следовательно, напряжение на постоянном резисторе должно падать, которое считывается контроллером. У вас же оно увеличивается, судя по скрину значений с ком-порта. Это как так?

    • Да, действительно, в тексте была ошибка! При попадании света на фоторезистор, его сопротивление конечно же падает. 12 кОм — при свете 10люкс и 100кОм в темноте.

  4. Всех приветствую!Как данные с фоторезистора передать в excel и построить график — отношение сопротивление ко времени?

  5. Помогите с решением задачи.
    Постройте модель с использование RGB- светодиода, фоторезистора и термистора, в которой светодиод светится различным цветом в зависимости от времени суток и температуры.

    День, >0 : красный

    День, 0 : зелёный

    Ночь, <0 : синий

  6. А как так, снимается напряжение с GRND, с нижнего резистора? Судя по схеме, снимаем же с +5 вольт…

  7. >>
    Снимаемое с нижнего плеча напряжение, мы подаем на аналоговый вход, который преобразует его в число от 0 до 1024
    От 0 до 1023, т.к. всего 1024 значения.

  8. Помогите пожалуйста с написанием кода на ардуино нано опроса четырех аналоговых входов A0 — A3 и включением соответствующего светодиода. Пробовал писать коды для Atiny13A, Atmega 328P. Не понятно когда менять ADMUXS для смены аналогового входа. Заранее спасибо. Можно высылать на почту.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.