? как подключить ик приемник к ардуино

Содержание

Basic Usage

Receiving

IRrecv

Create the receiver object, using a name of your choice.

enableIRIn

Begin the receiving process. This will enable the timer interrupt
which consumes a small amount of CPU every 50 µs.

decode

Attempt to receive a IR code. Returns true if a code was received,
or false if nothing received yet. When a code is received, information
is stored into «results».

results.decode_type: Will be one of the following:
NEC,
SONY,
RC5,
RC6, or
UNKNOWN.
results.value: The actual IR code (0 if type is UNKNOWN)
results.bits: The number of bits used by this code
results.rawbuf: An array of IR pulse times
results.rawlen: The number of items stored in the array

resume

After receiving, this must be called to reset the receiver and prepare it to receive another code.

blink13true

Enable blinking the LED when during reception. Because you can’t see infrared light,
blinking the LED can be useful while troubleshooting, or just to give visual feedback.

Transmitting

IRsend

Create the transmit object. A fixed pin number is always used, depending on which timer the
library is utilizing.

sendNEC

Send a code in NEC format.

sendSony

Send a code in Sony format.

sendRC5

Send a code in RC5 format.

sendRC6

Send a code in RC6

sendRaw

Send a raw code. Normally you would obtain the contents of rawbuf and rawlen
by using the receiver many times and averaging the results. Some adjustments
may be necessary for best performance. The frequency is the expected bandpass
filter frequency at the receiver, where 38 is the most commonly used.

IR транскодер на Arduino

Устройства с управлением от инфракрасного пульта тесно вошли в нашу жизнь. Иногда пульт от телевизора или древней аудиосистемы теряется, а купить новый за давностью лет уже невозможно. Заказать новый пульт не всегда возможно, изготовить клон тоже, но обладая донором или информацией о нём можно изготовить конвертер.

Такой транскодер будет принимать команды одного пульта и транслировать их в формат другого.

Для Arduino существует прекрасная библиотека IRemote которая делает построение разнообразных ИК систем управления очень простым.

Но при решении даже такой простой задачи как транскодер обязательно находятся проблемы которые интересно решать. Итак для начала нам необходим интегральный ИК приёмник типа TSOP312 или соответствующий шилд для Arduino. Не стоит забывать что ИК приёмников существует очень много и цоколёвка у них меняется случайным образом.

Собранная схема нужна нам для получения кодов команд от обеих пультов, к несчастью снять команды с устройства для которого пульт утерян несколько сложнее. Вы можете всё-таки найти пульт донор, воспользоваться универсальным пультом подобрав код (а зачем тогда вам тогда транскодер, раз уж пульт подошёл?) или попытавшись воспользоваться данными из интернет баз по IR кодам.

Самым простым для меня оказалось воспользоваться приложением под андроид, эмулирующий нужный мне пульт.

Для чтения данных используем пример IRrecvDumpV2 из поставки IRremote, если ваш пульт относится к распознаваемым библиотекой то сырой результат сканирования вам не понадобится, хотя например пульт от LG у меня ложно распознавался как Samsung и не заработал при попытке отправлять команды через sendLG.

Пример полученных данных под спойлером:Encoding: SAMSUNG Code: 34346897 (32 bits) Timing: +4450, -4350 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500 + 600, — 500 + 550, -1650 + 550, — 550 + 550, — 550 + 550, -1650 + 550, — 550 + 550, -1650 + 550, -1600 + 600, -1600 + 600 unsigned int rawData = {4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 550,1650, 550,550, 550,550, 550,1650, 550,550, 550,1650, 550,1600, 600,1600, 600}; // SAMSUNG 34346897

unsigned int data = 0x34346897;

В случае если захват выдаёт сообщение “IR code too long. Edit IRremoteInt.h and increase RAWLEN” библиотеку придётся немного исправить — увеличив размер буфера для команд.

В ту же таблицу сохраняем коды для пульта донора в сыром виде. Подключаем к Arduino инфракрасный светодиод и пишем простейшую программу которая получает инфракрасный сигнал с заданным кодом и отправляет другой код через светодиод. Резистор на 82 выбран из соображений того что валялось под рукой.

Для встраиваемого устройства его можно смело увеличивать до 200 Ом а если передатчик должен быть дальнобойным то придётся дополнить его нехитрым транзисторным каскадом, иначе тока от Arduino обязательно не хватит.

При наличии кодов команд от обеих пультов код транскодера приобретает следующий видvoid loop() {
if (irrecv.decode(&results)) { switch(results.value){ case(0x845E5420):{ irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal), khz); }break; } } irrecv.resume(); irrecv.enableIRIn();
}

Запускаем скетч, заливаем в Arduino. Как ни странно после запуска одна команда проходит, после чего все последующие устройством игнорируются. Чтобы не связываться с отладкой добавляем в цикл мигалку на 13 пине и видим что после первой попытки отправить команду плата зависает.

Можно эмпирически добавить задержку в пол секунды (delay(500) )и всё будет работать, но зная что сырые данные у нас представляют собой отсчёты времени в миллисекундах то можно просто добавить функцию отправки с задержкой.

В модуле Irsend есть даже подходящая функция custom_delay_usec, которой я изначально воспользовался неправильно, забыв домножить величину задержки на множитель USECPERTICK из библиотеки (50 мс).

void sendDelayed(unsigned int array[]){ irsend.sendRaw(array, sizeof(array) / sizeof(array), khz); int array_size = sizeof(array) / sizeof(array); for(int i=0;i

This is a short comparison and may not be complete or correct

I created this comparison matrix for myself in order to choose a small IR lib for my project and to have a quick overview, when to choose which library.
It is dated from 03.02.2021. If you have complains about the data or request for extensions, please send a PM or open a discussion.

Subject IRMP IRLremote IRLib2
**mostly unmaintained**
IRremote Minimal NEC
Number of protocols 50 Nec + Panasonic + Hash * 12 + Hash * 17 + Hash * NEC
3.Party libs needed % PinChangeInterrupt if not pin 2 or 3 % % %
Timing method receive Timer2 or interrupt for pin 2 or 3 Interrupt Timer2 or interrupt for pin 2 or 3 Timer2 or interrupt for NEC Interrupt
Timing method send PWM and timing with Timer2 interrupts Timer2 interrupts Timer2 and blocking wait PWM with Timer2 and blocking wait with delayMicroseconds() %
Send pins All All All ? Timer dependent %
Decode method OnTheFly OnTheFly RAM RAM OnTheFly
Encode method OnTheFly OnTheFly OnTheFly OnTheFly or RAM %
Callback suppport x % % % x
Repeat handling Receive + Send (partially) % ? Receive + Send x
LED feedback x % x x x
FLASH usage (simple NEC example with 5 prints) 1820
(4300 for 15 main / 8000 for all 40 protocols)
(+200 for callback)
(+80 for interrupt at pin 2+3)
1270
(1400 for pin 2+3)
4830 1770 900
RAM usage 52
(73 / 100 for 15 (main) / 40 protocols)
62 334 227 19
Supported platforms avr, megaAVR, attiny, Digispark (Pro), esp8266, ESP32, STM32, SAMD 21, Apollo3
(plus arm and pic for non Arduino IDE)
avr, esp8266 avr, SAMD 21, SAMD 51 avr, attiny, esp8266, esp32, SAM, SAMD All platforms with attachInterrupt()
Last library update 2/2021 4/2018 9/2019 2/2021 2/2021
Remarks Decodes 40 protocols concurrently.
39 Protocols to send.
Work in progress.
Only one protocol at a time. Consists of 5 libraries. Project containing bugs — 45 issues, no reaction for at least one year. Decoding and sending are easy to extend.
Supports Pronto codes.
Requires no timer.

The Hash protocol gives you a hash as code, which may be sufficient to distinguish your keys on the remote, but may not work with some protocols like Mitsubishi

Contributing

If you want to contribute to this project:

  • Report bugs and errors
  • Ask for enhancements
  • Create issues and pull requests
  • Tell other people about this library
  • Contribute new protocols

Check here for some guidelines.

Инструкция по изготовлению лодки с пультом

Проверку работы ИК-приемника и сервомотора на Ардуино лучше проводить с отключенным электромоторчиком, поскольку он будет создавать сильные вибрации при работе. На этом этапе тестирования проекта следует лишь оценить подвижность киля и отцентровать рычаг привода на сервомоторе. Необходимо сделать так, чтобы при нажатии кнопки «вперед» или «стоп» на пульте, киль вставал по центру.

1. Изготовление корпуса лодки из пеноплекса

Изготовление корпуса лодки на Ардуино своими руками

Размеры и форма лодки могут быть абсолютно разными — все зависит лишь от фантазии. Что касается прорезей, то они должны соответствовать размерам деталей. На трафарете (слева-направо) размечены прорези для: платы Ардуино UNO, сервомотора, привода киля и микромоторчика. Учтите, что привод от сервомотора к килю должен свободно ходить в прорези, для этого надо точно рассчитать радиус.

2. Изготовление деталей для привода и управления

Изготовление деталей для привода и управления лодкой

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

Сборка деталей для привода радиоуправляемой лодки

3. Сборка лодки на Ардуино с управлением

Для начала следует установить плату, сервопривод и двигатель

В этом проекте мы обошлись без использования макетной платы. Если вспомнить схему подключения ИК приемника к Ардуино, то она очень проста (слева-направо): A0 — GND — 5V  и не требует расходов на приобретение макетной платы. Транзистор мы использовали в этой схеме для включения советского электромоторчика от 3,3 V.

Сборка электрической схемы лодки на ИК управлении

Транзистор размещен на пинах 12, 11 и 10. На Pin11 (средняя ножка транзистора — это база) мы подаем напряжение для включения электродвигателя. Pin12 и Pin10 в скетче не используются, поэтому служат нам эмиттером и коллектором. К Pin12 подключен выход 3,3 V, а к Pin10 подключен электромоторчик (красный плюсовой провод).

4. Крепление привода винта на валу двигателя

Разогрейте стержень от ручки над паяльником и он зайдет на вал двигателя

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

Скетч для лодки на Ардуино с ИК пультом

#include <IRremote.h> // библиотека для IR-приемника
#include <Servo.h>      // библиотека для сервомотора

// Замените коды команд от пульта ДУ на свои значения
#define forward 16736925
#define left 16769565
#define right 16754775
#define turm_left 16712445
#define turm_right 16711935
#define stope 16755285

Servo servo; // присваиваем имя сервомотору

int RECV_PIN = A0;
IRrecv irrecv(RECV_PIN);
decode_results results;

void setup() {
  Serial.begin(9600); // подключаем монитор, чтобы узнать коды кнопок пульта
  irrecv.enableIRIn();
  pinMode(11, OUTPUT);
  pinMode(13, OUTPUT);
  pinMode(A0, INPUT);
  servo.attach (7);
}

void loop() {
  
    if (irrecv.decode(&results)) {
    
    Serial.println(results.value); // выводим на монитор порта коды с пульта ДУ

    if (results.value == left) {
    servo.write(60);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == right) {
    servo.write(120);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == turm_left) {
    servo.write(10);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == turm_right) {
    servo.write(170);
    digitalWrite(11, HIGH);  
   }
   
    if (results.value == forward) {
    servo.write(90);
    digitalWrite(11, HIGH);
   }
   
    if (results.value == stope) {
    servo.write(90);
    digitalWrite(11, LOW);
   }
   
    irrecv.resume(); // Ждем следующий сигнал от пульта
  }  
}

В случае успешного тестирования ИК-управления сервомотором, можно приступать к испытанию проекта на Ардуино для начинающих в реальных условиях. Но перед этим обязательно позаботьтесь о защите электрических схем и микроконтроллера от возможных брызг воды и влаги. Для этого можно использовать пищевую пленку (пленка свободно пропустит ИК сигнал от пульта дистанционного управления).

Радиоуправление на Arduino

Соберем радиоуправление на основе Arduino Uno и радиомодуля MX-05v. Этот модуль работает на частоте 443 МГц, что позволяет использовать его под водой (волны в диапазоне 2.4 ГГц не проникают под воду). Потом поставим его на модель Радиоуправляемой Подводной Лодки.

Радиомодуль MX-05V + MX-FS-03V подкупает своей низкой ценой – около 60 рублей за пару. Заявленной дальности связи 20-200 метров хватает для небольших моделей машин или лодок.

Сделаем одноканальную аппаратуду. Для этого нам понадобятся:

  • 2 платы Ардуино для приемника и передатчика
  • комплект радиомодуля MX-05V + MX-FS-03V
  • переменный резистор или джойстик для передатчика
  • рулевая машинка (серва) для приемника

Суть работы программы заключается в следующем:

  • считываем значение с переменного резистора (число от 0 до 1023)
  • переводим это число в 2 байта (16 бит, т.к. 1023 занимает 10 бит и не поместится в один байт)
  • передаем по радио-каналу
  • приемник принимает 2 байта по радио каналу
  • переводит их обратно в число от 0 до 1023
  • передает команду серво-машинке

Принцип работы Arduino доступно описан на разных веб-ресурсах. Мне понравился бесплатный обучающий онлайн курс «Строим роботов и другие устройства на Arduino». Рекомендую.

https://youtube.com/watch?v=VcrG3KMn6o4

Загружаем текс программы (скетч) для передатчика и приемников. Кстати, программы надо хранить в разных папках, иначе во время компиляции они будут сливаться в один файл и конфликтовать из-за дублирования функций setup и loop. Как подключить сторонние библиотеки к Arduino описано например тут.

Передатчик

// Библиотека передатчика
#include void setup() { // Запуск передатчика vw_set_ptt_inverted(true); vw_setup(1000); // Bits per sec } void loop() { // чтение показаний с переменного резистора int sensorValue = analogRead(A0); // отправляем значение send(sensorValue); } void send(int param) { // конвертируем int в массив из 2 байт uint8_t msg; int len = 2; msg = highByte(param); msg = lowByte(param); // отправляем непосредственно в радиоканал vw_send(msg, len); // ждем пока сообщение не уйдет целиком vw_wait_tx(); }

Приемник

// Библиотека для приемника
#include // Библиотека для серво машинки. В отличии от обычной Servo.h не конфликтует с VirtualWire.h
// Скачать библиотеку можно тут. // http://en.osdn.jp/projects/sfnet_pgahtow/downloads/Arduino%20(v1.0)%20libaries/ServoTimer2.zip/
// Надо закомментировать 41 строчку в файле ServoTimer2.

h в случае ошибки компиляции
// ‘typedef uint8_t boolean;’
#include // Создаем объект серво-машинки
ServoTimer2 myservo; void setup() { // для отладки // Serial.begin(9600); // Запуск приемника vw_set_ptt_inverted(true); vw_setup(1000); // бит в секунду vw_rx_start(); // запуск приемника // подключаем серво к 6 пину myservo.

attach(6);
} void loop() { uint8_t msg; uint8_t len = 2; if (vw_get_message(msg, &len)) { // переводим байты в int int value = word(msg, msg); // подгоняем под диапазон входных данных сервы int sValue = map(value, 0, 1023, 600, 2400); myservo.write(sValue); // Serial.

println(sValue); }
}

И в итоге – ничего не работает! Почему?

Питание

Радиомодуль MX-05V очень простой, из-за этого он очень восприимчив к внешним помехам. И даже такой маленький мотор как в серво-машинке способен нарушить его работу.

Для того, чтобы минимизировать влияние электромотора (это касается только колекторных моторов), нужно разделить питание силовой части от приемника. При этом «минус» у них должен быть общий.

Итоговая схема подключения приемника выглядит так.

Результат

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

Мерцающий светодиод

Всем моим читателям привет. Сегодня мы продолжим изучение
ардуино. В этом уроке мы постараемся разобраться как заставить светодиод
мерцать. До этого он просто мигал, то есть иными словами на него приходили
периодические импульсы тока, заставляя его зажигаться, и затем некоторое время
на светодиод не поступало напряжение – он гас. А можно сделать так, чтобы
светодиод зажигался по нарастающей яркостью и так же гас? Оказывается да! Вам
интересно? Тогда читаем дальше…

Все что нам нужно будет сделать – только написать скетч. Да
разобраться как работает одна команда, которая будет отправлять на пин разное
напряжение, тем самым заставляя светиться светодиод по разному. Схема остается
та же: светодиод подключен к резистору на 220-240 Ом, оставшиеся выводы светодиода
подключим к 7 пину, а вывод резистора на землю.

Теперь давайте выясним с помощью какой команды можно на пин
подавать разное напряжение. В нашем случае мы будем использовать аналоговый
сигнал (который может менять свои параметры, например напряжение) командой analogWrite (пин, 0-255).
Тогда выбранный нами пин будет выдавать напряжение от 0 до 5 вольт в
зависимости от значения (которое можно изменять от 0 до 255).

Скетч привожу ниже

Но обратите внимание что этот скетч я
написал для платы WEMOS D1. Если у вас плата Arduino Uno то замените в скетче
имя пина с D7 на 7 и у
вас все обязательно заработает

Я пока временно использую плату WEMOS D1, но
как появиться у меня Arduino Uno то скетчи буду писать именно для нее. Но пока
что давайте попробуем разобраться со скетчем.

int LED
= D7;

int x=5;

void setup()

{

  // пин со
светодиодом — выход, как и раньше…

  pinMode(LED, OUTPUT);

}

 void loop()

{

    // цикл
управления яркостью 0 до 255

  x=x+x;

 if (x >
255)x=-10;    // плавное нарастание

if (x < 20)x=10;   
// плавное угасание

  // выдаём
результат на светодиод

 // delay (200);

  analogWrite(D7, x);

   delay (200);

}

У нас задействованы два оператора if. Именно они и заставляют светодиод
мерцать. Достигается это двумя циклами с условиями. Первый цикл с условием
проверяет чтобы величина х не стала больше 255 (как только это произойдет, то х
станет равным «минус 10» и величина х пойдет на убыль. Второй цикл
контролирует, чтобы во время работы «на убыль» величина х не стала меньше 20
(когда это произойдет то х будет присвоено значение «плюс 10» и величина х
снова начнет увеличиваться, пока не достигнет верхнего порога, контролируемого
первым циклом. И так будет крутиться до бесконечности. 

https://youtube.com/watch?v=y4Axw_Q8UlE

Надеюсь что у вас все тоже получиться, тем более что это все элементарно просто. Пожелаю моим читателям успеха, и увидимся очень скоро в следующем уроке по набору ардуино. А пока давайте посмотрим как мигает светодиод (или даже несколько — включим их параллельно) уже в реале, а не на симуляторе. 

https://youtube.com/watch?v=lw1DyEK2vtE

Библиотеки в Arduino IDE

Среди всего разнообразия библиотек можно выделить 3 основных группы:

  • Встроенные – это библиотеки, изначально установленные в среде Arduino IDE. Их не нужно скачивать и устанавливать дополнительно, они доступны для использования в программе сразу после запуска среды разработки.
  • Дополнительные – это библиотеки, которые нужно самостоятельно скачивать устанавливать. Обычно такой вид библиотек разрабатывает производитель датчиков, сенсоров и других компонентов для облегчения работы с ардуино.
  • Зависимые библиотеки – устанавливаются как помощник дополнительной библиотеки, отдельно от нее не работает.

Самым простым способом работы с библиотеками в ардуино является использование встроенных возможностей среды разработки Arduino IDE. Об этом мы поговорим в отдельной статье.

Исходный код программы

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

Затем необходимо подключить библиотеку для работы с ЖК дисплеем и инициализировать контакты для работы с ЖК дисплеем и управления домашними электронными устройствами.

После этого необходимо инициализировать последовательный порт, ЖК дисплей и задать направление работы инициализированных контактов.

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

Далее приведен полный текст программы.

Arduino

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

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>

constintRECV_PIN=14;

IRrecvirrecv(RECV_PIN);

decode_resultsresults;

LiquidCrystallcd(6,7,8,9,10,11);

#define Fan 3
#define Light 4
#define TV 5

inti=,j=,k=,n=;

voidsetup()

{

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(,1);

lcd.print(«Home Automation»);

delay(2000);

lcd.clear();

lcd.print(«Circuit Digest»);

lcd.setCursor(,1);

delay(1000);

lcd.print(«System Ready…»);

delay(1000);

irrecv.enableIRIn();// Start the receiver

irrecv.blink13(true);

lcd.clear();

lcd.setCursor(,);

lcd.print(«Fan   Light  TV «);

lcd.setCursor(,1);

lcd.print(«OFF    OFF   OFF»);

}

voidloop()

{

if(irrecv.decode(&results))

{

Serial.println(results.value,HEX);

delay(100);

lcd.setCursor(,);

lcd.print(«Fan   Light  TV»);

if(results.value==0x1FE00FF)

{

i++;

intx=i%2;// вычисление остатка от деления на 2

digitalWrite(Fan,x);

lcd.setCursor(,1);

if(x)

lcd.print(«ON  «);

else

lcd.print(«OFF «);

// delay(200);

}

elseif(results.value==0x1FEF00F)//  key 1

{

j++;

intx=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++;

intx=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++;

intx=n%2;

digitalWrite(TV,x);

digitalWrite(Fan,x);

digitalWrite(Light,x);

lcd.setCursor(,1);

if(x)

lcd.print(«ON     ON    ON «);

else

lcd.print(«OFF    OFF   OFF»);

//delay(200);

}

irrecv.resume();// Receive the next value

//delay(100);

}

}