Урок 1.10. Фоторезистор. Реле. Автономное управление освещением через реле

Базовый курс "Программирование микроконтроллеров"
Модуль 1. Введение в Arduino. Работа с цифровым и аналоговым сигналом

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

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

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

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

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

VT83N1 — 12-100кОм;

VT93N2 — 48-500кОм.

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

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

Напишем следующую программу:

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);
}

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

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

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

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

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

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

void loop() {
  raw = analogRead(pinPhoto);
  Serial.println(raw);
  if (raw < 500)
    digitalWrite(led, HIGH);
  else
    digitalWrite(led, LOW);
  delay(100);
}

Можно изменить нашу программу так, что бы светодиод изменял свою яркость плавно:

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

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

void loop() {
  raw = analogRead(pinPhoto);
  Serial.println(raw);
  int x = constrain(raw,300,700);
  x = map(x,300,700,255,0);
  analogWrite(led,x);
}

Реле

Мы уже знаем как управлять слабым светодиодом и даже мощным двигателем с помощью Ардуино. Но как быть, если мы задумаем управлять устройствами, подключенными к бытовой сети? Напомню, что даже небольшая настольная лампа питается от источника переменного тока с напряжением 220 Вольт. Обычный полевой транзистор, который мы использовали в схеме с двигателем уже не подойдет.

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

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

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

На этом уроке мы будем работать не с отдельным реле, а с целым релейным модулем.

Эти модули бывают разного вида, но контакты, как правило, подписаны одинаково. С одной стороны располагаются контакты управления, а так же питания реле и его схемы управления:

VCC (DC+, +) – питание
GND (DC-, -) – “земля”
IN (S) – логический управляющий сигнал

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

COM (Common) – общий контакт
NO (Normal Open) – нормально разомкнутый относительно COM контакт
NC (Normal Close) – нормально замкнутый относительно COM контакт

Работает это следующим образом:

само реле (синяя коробочка на плате) питается от VCC и GND и подключается на питание схемы, так как реле потребляет около 60 мА при переключении. Но управляется реле логическим сигналом от микроконтроллера, который подаётся на пин IN. На выходе реле наблюдается следующая картина: у неактивного реле замкнуты контакты COM и NC. При активации реле контакт переключается и COM замыкается с NO.

Схема подключения и программа автоматического управление лампой

Для начала просто проверим работу реле, напишем следующий код:

const int pinPhoto = A0;
int raw = 0;
const int relay = 2;

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

void loop() {
  digitalWrite(relay, HIGH);
  delay(1000);
  digitalWrite(relay, LOW);
  delay(1000);
}

Мы должны услышать щелчок реле и увидеть как включилась лампа, она будет включаться и выключаться каждую секунду.

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

const int pinPhoto = A0;
int raw = 0;
const int relay = 2;

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

void loop() {
  raw = analogRead(pinPhoto);
  Serial.println(raw);
  if (raw < 800)
    digitalWrite(relay, HIGH);
  else
    digitalWrite(relay, LOW);
}

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