želimo li našim projektima dodati mogućnost upravljanja nekim daljinskim upravljačem jedan od izbora može biti i ir komunikacija

Upravljanje klimom, pametnom rasvjetom ili televizijom, nezamislivo je bez daljinskog upravljača. Prijenos između navedenih uređaja i samog upravljača ostvarena je IR (infra-crvenom) komunikacijom. Iako je taj oblik komunikacije nevidljiv našem oku možemo si pomoći da pogledamo u naš daljinski upravljač dok ga koristimo preko kamere na mobitelu. Ono što tamo možemo vidjeti je kratki svjetlosni impuls koji putuje od daljinskog do samog uređaja. Ovakav oblik komunikacije, poprilično je osjetljiv na greške u prijenosu te nam omogućuje prijenos ograničene količine podataka u jedinici vremena ali se je zadržao do danas u području upravljanja uređajima.
Kako bi što lakše radili s IR prijemnikom moramo u Arduino IDE okruženje učitati biblioteku IRRemote. Prvi korak kojeg moramo napraviti ako želimo da nekim daljincem upravljamo nekim od svojstava našeg projekta je da “snimimo” kodove koje proizvodi pritisak na svaku tipku daljinskog upravljača. Te kodove moramo si zapisati jer će nam oni poslužiti u sljedećem programu.
/*
* Copyright 2009 Ken Shirriff, http://arcfn.com
* Copyright 2017-2019 David Conran
*/
#include "BaseOTA.h"
#include <Arduino.h>
#include <assert.h>
#include <IRrecv.h>
#include <IRremoteESP8266.h>
#include <IRac.h>
#include <IRtext.h>
#include <IRutils.h>
#ifdef ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 10;
#else // ARDUINO_ESP32C3_DEV
const uint16_t kRecvPin = 14;
#endif // ARDUINO_ESP32C3_DEV
const uint32_t kBaudRate = 115200;
const uint16_t kCaptureBufferSize = 1024;
#if DECODE_AC
const uint8_t kTimeout = 50;
#else // DECODE_AC
const uint8_t kTimeout = 15;
#endif // DECODE_AC
const uint16_t kMinUnknownSize = 12;
const uint8_t kTolerancePercentage = kTolerance; // kTolerance is normally 25%
#define LEGACY_TIMING_INFO false
IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
decode_results results; // Somewhere to store the results
void setup() {
OTAwifi(); // start default wifi (previously saved on the ESP) for OTA
#if defined(ESP8266)
Serial.begin(kBaudRate, SERIAL_8N1, SERIAL_TX_ONLY);
#else // ESP8266
Serial.begin(kBaudRate, SERIAL_8N1);
#endif // ESP8266
while (!Serial) // Wait for the serial connection to be establised.
delay(50);
assert(irutils::lowLevelSanityCheck() == 0);
Serial.printf("\n" D_STR_IRRECVDUMP_STARTUP "\n", kRecvPin);
OTAinit(); // setup OTA handlers and show IP
#if DECODE_HASH
irrecv.setUnknownThreshold(kMinUnknownSize);
#endif // DECODE_HASH
irrecv.setTolerance(kTolerancePercentage); // Override the default tolerance.
irrecv.enableIRIn(); // Start the receiver
}
void loop() {
if (irrecv.decode(&results)) {
uint32_t now = millis();
Serial.printf(D_STR_TIMESTAMP " : %06u.%03u\n", now / 1000, now % 1000);
if (results.overflow)
Serial.printf(D_WARN_BUFFERFULL "\n", kCaptureBufferSize);
Serial.println(D_STR_LIBRARY " : v" _IRREMOTEESP8266_VERSION_STR "\n");
if (kTolerancePercentage != kTolerance)
Serial.printf(D_STR_TOLERANCE " : %d%%\n", kTolerancePercentage);
Serial.print(resultToHumanReadableBasic(&results));
String description = IRAcUtils::resultAcToString(&results);
if (description.length()) Serial.println(D_STR_MESGDESC ": " + description);
yield(); // Feed the WDT as the text output can take a while to print.
#if LEGACY_TIMING_INFO
Serial.println(resultToTimingInfo(&results));
yield(); // Feed the WDT (again)
#endif // LEGACY_TIMING_INFO
Serial.println(resultToSourceCode(&results));
Serial.println(); // Blank line between entries
yield(); // Feed the WDT (again)
}
OTAloopHandler();
}
Rezultat rada ovog programa će biti prikazan u serijskom monitoru svaki puta kada pritisnemo neku tipku na daljinskom upravljaču, svaka tipka generira jedinstven kod, npr. 0x122444BB.
U nastavku želimo daljinski upravljač iskoristiti za kontrolu dvije LED diode, tako će jedan gumb daljinskog uključivati zelenu a drugi žutu LED diodu.
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>
const uint16_t kRecvPin = 14;
unsigned long key_value = 0;
const int zuta = 13; //connected to GPIO pin 0 (D3 on a NodeMCU board).
const int zelena= 12; //connected to GPIO pin 2 (D4 on a NodeMCU board).
IRrecv irrecv(kRecvPin);
decode_results results;
void setup() {
Serial.begin(115200);
irrecv.enableIRIn(); // Start the receiver
while (!Serial) // Wait for the serial connection to be establised.
delay(50);
Serial.println();
Serial.print("IRrecvDemo is now running and waiting for IR message on Pin ");
Serial.println(kRecvPin);
pinMode(zelena, OUTPUT);
pinMode(zuta, OUTPUT);
}
void loop() {
if (irrecv.decode(&results)) {
// print() & println() can't handle printing long longs. (uint64_t)
serialPrintUint64(results.value, HEX);
Serial.println("");
switch(results.value){
case 0x1224847B :
Serial.println("Zelena ON, Žuta OFF");
digitalWrite(zelena,HIGH); //uključen
digitalWrite(zuta,LOW); //isključen
break;
case 0x122444BB :
Serial.println("Zelena OFF, Žuta ON");
digitalWrite(zelena,LOW); //uključen
digitalWrite(zuta,HIGH); //isključen
break;
}
key_value = results.value;
irrecv.resume(); // Receive the next value
}
delay(100);
}