Ранее на нашем сайте уже рассматривался проект управления электронными домашними устройствами с помощью Arduino и персонального компьютера, в этой статье мы рассмотрим аналогичный проект, но управление электронными домашними устройствами будет осуществляться с помощью инфракрасной связи (IR – infrared). Для этой цели подойдет практически любой пульт от одного из домашних устройств - TV/DVD/MP3. В этом случае после получения команды по инфракрасному порту наше устройство на основе Arduino будет передавать соответствующие команды на реле, которые будут включать и выключать нужные нам электронные устройства.
Общие принципы работы устройства
Принцип работы проектируемого устройства управления домашними электронными устройствами с помощью пульта с инфракрасной связью достаточно прост – когда вы нажимаете кнопку на пульте он передает управляющий код команды в форме последовательности закодированных импульсов с частотой модуляции 38 кГц. Эти импульсы принимаются датчиком TSOP1738 и с этого датчика считываются платой Arduino. Плата Arduino декодирует эту последовательность импульсов и преобразует ее в шестнадцатеричное значение и сравнивает это значение с заранее определенными шестнадцатеричными кодами клавиш на пульте. Если значения совпадают, то Arduino выполняет соответствующую команду по включению/выключению заданного устройства и результат операции высвечивает на ЖК дисплее. В этом проекте мы для демонстрации использовали 3 электрические лампочки различных цветов, которые будут условно выполнять роль таких домашних устройств как вентилятор, свет и телевизор.
Существует достаточно много пультов дистанционного управления (ДУ) домашними электронными устройствами, но большинство из них используют частоту 38 кГц. В нашем проекте мы использовали пульт ДУ от телевизора. Для приема инфракрасных сигналов мы применили инфракрасный приемник TSOP1738, который способен принимать сигналы на частоте 38 кГц. Внешний вид этого приемника показан на следующем рисунке.
Необходимые компоненты
- Плата Arduino Uno (купить на AliExpress).
- ЖК дисплей 16х2 (купить на AliExpress).
- Модуль драйвера двигателя ULN2003 (купить на AliExpress).
- Датчик TSOP1738 (купить на AliExpress).
- Пульт ДУ.
- Реле на 5 В (3 шт.).
- Источник питания.
- Электрические лампочки с держателями (патронами).
- Соединительные провода.
- Макетная плата.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
В этом проекте мы использовали 7,8 и 9 кнопки пульта ДУ для управления вентилятором, светом и телевизором соответственно и кнопку включения/выключения питания (Power button), которая будет общей для всех этих 3-х устройств.
Мы применили метод переключения (проверки на четность) метод для включения и выключения электронных устройств. Смысл его состоит в том, что находится остаток от деления числа (идентифицирующего состояние устройства) на 2. Если остаток есть, то устройство включается, а если остаток равен нулю, то устройство выключается.
Предположим, что на пульте ДУ нажата кнопка 7. Пульт ДУ передает это число с помощью инфракрасной связи в закодированном виде. Arduino с помощью приемника TSOP1738 принимает его, декодирует и сохраняет в соответствующей переменной. Для кнопки 7 шестнадцатеричное значение будет равно 0x1FE00FF. Если принятое значение и хранящееся в памяти совпадают, то Arduino включает вентилятор. Теперь если нажать кнопку 7 второй раз, то пульт ДУ передаст то же самое число. Arduino принимает его и снова сравнивает с хранящимся в памяти, поскольку значения совпадают, то в этот раз Arduino уже выключает вентилятор, потому что проверка на четность [EVEN ODD] (путем нахождения остатка от деления на 2) будет показывать что устройство уже включено.
Декодирование инфракрасных сигналов управления с помощью Arduino
На следующем рисунке представлен список шестнадцатеричных кодов клавиш пульта ДУ DVD NEC.
Если у вас нет опыта в декодировании с помощью Arduino команд управления, передаваемых по инфракрасному каналу связи, то вам необходимо выполнить следующую последовательность действий:
- Скачать библиотеку для работы с инфракрасным каналом связи для Arduino по адресу: https://github.com/z3t0/Arduino-IRremote.
- Распаковать ее и поместить в каталог Arduino на вашем компьютере. Переименовать папку с распакованной библиотекой в "IRremote".
- Запустить ниже представленную программу в Arduino и открыть окно последовательного канала связи (Serial Monitor window) в Arduino IDE. Нажать любую кнопку на пульте ДУ и наблюдать как шестнадцатеричный код этой кнопки появится в окне последовательного канала связи.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
* IRremote: IRrecvDemo - demonstrates receiving IR codes with IRrecv * An IR detector/demodulator must be connected to the input RECV_PIN. * Version 0.1 July, 2009 * Copyright 2009 Ken Shirriff * http://arcfn.com */ #include <IRremote.h> int RECV_PIN = 11; IRrecv irrecv(RECV_PIN); decode_results results; void setup() { Serial.begin(9600); irrecv.enableIRIn(); // старт работы приемника } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value, HEX); irrecv.resume(); // прием следующего значения } delay(100); } |
Представленную программу можно найти среди примеров в папке с библиотекой IRremote. При желании в этой папке вы можете посмотреть и другие примеры работы с этой библиотекой.
Представленную программу можно найти среди примеров в папке с библиотекой IRremote. При желании в этой папке вы можете посмотреть и другие примеры работы с этой библиотекой.
Работа схемы
Схема устройства представлена на следующем рисунке.
ЖК дисплей подключен к плате Arduino в 4-битном режиме. Его контакты данных RS, EN, D4, D5, D6, D7 подсоединены к цифровым контактам платы Arduino 6, 7, 8, 9, 10, 11. Выходной контакт датчика TSOP1738 непосредственно подключен к цифровому контакту 14 (A) платы Arduino. Контакт Vcc подсоединен к источнику питания +5 В, а контакт GND подключен к земле (корпусу) схемы. Микросхема драйвера реле ULN2003 используется для управления реле. Три 5-вольтовых реле типа SPDT используются для управления светом, вентилятором и телевизором (их роль в нашем проекте выполняют лампочки различных цветов). Реле подключены к контактам платы Arduino 3, 4 и 5 через драйвер реле ULN2003.
Исходный код программы
В программе мы первым делом должны подключить библиотеку для работы с инфракрасным каналом связи, инициализировать необходимые контакты и объявить переменные.
#include <IRremote.h>
const int RECV_PIN=14;
IRrecv irrecv(RECV_PIN);
decode_results results;
Затем необходимо подключить библиотеку для работы с ЖК дисплеем и инициализировать контакты для работы с ЖК дисплеем и управления домашними электронными устройствами.
#include<LiquidCrystal.h>
LiquidCrystal lcd(6,7,8,9,10,11);
#define Fan 3
#define Light 4
#define TV 5
После этого необходимо инициализировать последовательный порт, ЖК дисплей и задать направление работы инициализированных контактов.
void setup()
{
Serial.begin(9600);
lcd.begin(16,2);
pinMode(Fan, OUTPUT);
pinMode(Light, OUTPUT);
pinMode(TV, OUTPUT);
В следующей части программы, как уже обсуждалось ранее в данной статье, происходит сравнение принятого шестнадцатеричного значения и записанного в программе шестнадцатеричного значения для каждой кнопки. Если фиксируется совпадение этих значений, то происходит выполнение соответствующей команды по включению/выключению управляемого электронного устройства.
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value,HEX);
delay(100);
lcd.setCursor(0,0);
lcd.print("Fan Light TV");
if(results.value==0x1FE00FF)
{
i++;
int x=i%2;
digitalWrite(Fan, x);
Далее приведен полный текст программы.
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 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
#include <LiquidCrystal.h> #include <IRremote.h> const int RECV_PIN=14; IRrecv irrecv(RECV_PIN); decode_results results; LiquidCrystal lcd(6,7,8,9,10,11); #define Fan 3 #define Light 4 #define TV 5 int i=0,j=0,k=0,n=0; void setup() { Serial.begin(9600); lcd.begin(16,2); pinMode(Fan, OUTPUT); pinMode(Light, OUTPUT); pinMode(TV, OUTPUT); //digitalWrite(13,HIGH); lcd.print("Remote Controlled"); lcd.setCursor(0,1); lcd.print("Home Automation"); delay(2000); lcd.clear(); lcd.print("Circuit Digest"); lcd.setCursor(0,1); delay(1000); lcd.print("System Ready..."); delay(1000); irrecv.enableIRIn(); // Start the receiver irrecv.blink13(true); lcd.clear(); lcd.setCursor(0,0); lcd.print("Fan Light TV "); lcd.setCursor(0,1); lcd.print("OFF OFF OFF"); } void loop() { if (irrecv.decode(&results)) { Serial.println(results.value,HEX); delay(100); lcd.setCursor(0,0); lcd.print("Fan Light TV"); if(results.value==0x1FE00FF) { i++; int x=i%2; // вычисление остатка от деления на 2 digitalWrite(Fan, x); lcd.setCursor(0,1); if(x) lcd.print("ON "); else lcd.print("OFF "); // delay(200); } else if(results.value==0x1FEF00F) // key 1 { j++; int x=j%2; digitalWrite(Light, x); lcd.setCursor(6,1); if(x) lcd.print("ON "); else lcd.print("OFF "); // delay(200); } if(results.value==0x1FE9867) { k++; int x=k%2; digitalWrite(TV, x); lcd.setCursor(13,1); if(x) lcd.print("ON "); else lcd.print("OFF"); // delay(200); } if(results.value==0x1FE48B7) { n++; int x=n%2; digitalWrite(TV, x); digitalWrite(Fan,x); digitalWrite(Light,x); lcd.setCursor(0,1); if(x) lcd.print("ON ON ON "); else lcd.print("OFF OFF OFF"); //delay(200); } irrecv.resume(); // Receive the next value //delay(100); } } |