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

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

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

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

vt93n2

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

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

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

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

SFH203FA,SFH313FA SFH229

1. Подключение

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

photox1_схема

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

photox1_bb

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

DSC_0006

2. Программа

Подключив фоторезистор по нехитрой схеме, начинаем писать программу. Первое что мы сделаем, это выведем необработанный сигнал с аналогового входа в последовательный порт, для того чтобы просто понять, как меняется значение на входе 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);
}

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

 


Изменено:

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

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

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

  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, там полярность подаваемую на моторы можно менять как хочешь, плюс и скорость так же можно регулировать

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

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