В настоящее время все больше людей интересуются технологиями умного дома, в которой домашние устройства включаются и выключаются автоматически. На нашем сайте подобные проекты можно найти по тэгу автоматизация дома.
В этой статье мы рассмотрим проект, который будет управлять светом в доме – когда на улице темно он будет включать свет, а когда на улице светло – он будет выключать свет. Для измерения интенсивности света на улице необходим какой-нибудь датчик освещенности – в этом проекте его роль будет выполнять фоторезистор, поэтому в данном проекте мы рассмотрим подключение фоторезистора к плате Arduino и управление с его помощью светом в доме.
Аналогичный проект на основе микроконтроллера AVR мы уже рассматривали на нашем сайте – автоматический свет на лестнице.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- Фоторезистор (LDR - Light Dependent Resistor) (купить на AliExpress).
- Резистор 100 кОм (купить на AliExpress).
- Резистор 330 Ом (купить на AliExpress).
- Светодиод (купить на AliExpress).
- Модуль реле на 5 В.
- Электрическая лампочка (Bulb/CFL).
- Соединительные провода.
- Макетная плата.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Что такое фоторезистор
Фоторезистор – это резистор, сопротивление которого зависит от количества падающего на него света. Фоторезисторы изготавливаются из полупроводниковых материалов, благодаря этому они и приобретают чувствительные к свету свойства. Наиболее популярный материал для изготовления фоторезисторов – это сульфид кадмия. Фоторезисторы работают по так называемому принципу "фотопроводимости", то есть когда свет начинает падать на фоторезистор его проводимость увеличивается, соответственно, его сопротивление уменьшается. А когда количество света, падающего на фоторезистор, уменьшается, его сопротивление увеличивается.
Все проекты на нашем сайте, использующие фоторезистор, вы можете посмотреть по этой ссылке.
Работа схемы
Схема подключения фоторезистора к плате Arduino представлена на следующем рисунке.
Как видно из схемы, мы использовали делитель напряжения, состоящий из фоторезистора и резистора на 100 кОм. Выход делителя напряжения подключается к аналоговому контакту A0 платы Arduino, который считывает это значение напряжения и преобразует его в цифровое значение. То есть если интенсивность света увеличивается, то сопротивление фоторезистора уменьшается, следовательно, напряжение на выходе делителя напряжения увеличивается. И, наоборот, интенсивность света ↓ - сопротивление фоторезистора↑ - напряжение на аналоговом контакте↓ - свет включается.
В коде программы для Arduino мы смотрим, если значение на выходе АЦП контакта A0 упало ниже 700, мы считаем что это темно и поэтому включаем свет. Если же значение больше 700, то мы считаем это светло и поэтому выключаем свет.
Дальнейшим усложнением представленной схемы является использование лампочки вместо светодиода, в этом случае для управления цепью лампочки нам уже понадобится реле. Доработанная таким образом схема представлена на следующем рисунке.
И собранная конструкция нашего проекта в этом случае будет выглядеть следующим образом:
Объяснение программы для Arduino
Полный код программы приведен в конце статьи, здесь же рассмотрим его наиболее важные фрагменты.
Сначала мы инициализируем контакты для подключения реле, светодиода и фоторезистора.
1 2 3 |
#define relay 10 int LED = 9; int LDR = A0; |
Контакты, к которым подключены светодиод и реле, установим в режим вывода данных, а контакт, к которому подключен фоторезистор – в режим ввода данных.
1 2 3 |
pinMode(LED, OUTPUT); pinMode(relay, OUTPUT); pinMode(LDR, INPUT); |
Далее в программе мы считываем значение напряжения на входе контакта A0 платы Arduino – оно может уменьшаться и увеличиваться в зависимости от сопротивления фоторезистора.
1 |
int LDRValue = analogRead(LDR); |
Далее записываем условия для наступления темноты и когда вокруг достаточно светло. Если значение с выхода АЦП контакта A0 платы Arduino меньше 700, мы включаем светодиод (лампочку), если же больше 700 – то выключаем светодиод (лампочку).
1 2 3 4 5 6 7 8 9 10 11 12 |
if (LDRValue <=700) { digitalWrite(LED, HIGH); digitalWrite(relay, HIGH); Serial.println("It's Dark Outside; Lights status: ON"); } else { digitalWrite(LED, LOW); digitalWrite(relay, LOW); Serial.println("It's Bright Outside; Lights status: OFF"); } |
Исходный код программы
Код программы достаточно простой, поэтому комментариев к нему нет. Но если у кого возникнут какие либо вопросы по тексту программы, то вы можете задать их в комментариях к данной статье.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#define relay 10 int LED = 9; int LDR = A0; void setup() { Serial.begin(9600); pinMode(LED, OUTPUT); pinMode(relay, OUTPUT); pinMode(LDR, INPUT); } void loop() { int LDRValue = analogRead(LDR); Serial.print("sensor = "); Serial.print(LDRValue); if (LDRValue <=700) { digitalWrite(LED, HIGH); digitalWrite(relay, HIGH); Serial.println("It's Dark Outside; Lights status: ON"); } else { digitalWrite(LED, LOW); digitalWrite(relay, LOW); Serial.println("It's Bright Outside; Lights status: OFF"); } } |
Почему-то при сборке схемы лампочка постоянно мигает, вместо того, чтобы светить, в чём может быть проблема?
Возможно, неисправно реле. Вы пробовали вариант схемы со светодиодом вместо лампочки? Также можете попробовать подать постоянный уровень на контакт Ардуино, с которого управляется лампочка - так вы проверите не кроется ли ваша проблема в фоторезисторе