mirror of
https://github.com/Theaninova/Arduino-IRremote.git
synced 2026-01-18 15:22:48 +00:00
Compare commits
79 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e1957629d3 | ||
|
|
9293d2fcba | ||
|
|
c41f506cc1 | ||
|
|
3c4fc7bf37 | ||
|
|
26560e5755 | ||
|
|
d7a4c4e0c8 | ||
|
|
9a57b2aead | ||
|
|
c90d6788a1 | ||
|
|
2da6aeaf27 | ||
|
|
2fd83bbb00 | ||
|
|
702a064251 | ||
|
|
f5071daac8 | ||
|
|
5b82539954 | ||
|
|
55f3e27866 | ||
|
|
f985c4b318 | ||
|
|
cdd783ce7e | ||
|
|
a237a0e393 | ||
|
|
27777e89b2 | ||
|
|
0ef30ed227 | ||
|
|
d87707d0ec | ||
|
|
d8bdbb1a44 | ||
|
|
3fcb071d36 | ||
|
|
b4c8e6b22c | ||
|
|
e6bcf89664 | ||
|
|
df34396969 | ||
|
|
bce86bf8ed | ||
|
|
0bf5993a5b | ||
|
|
77fd51e891 | ||
|
|
22e64f144c | ||
|
|
61f00b8dc5 | ||
|
|
bd72084b7f | ||
|
|
cd02daf27c | ||
|
|
339a7969c9 | ||
|
|
0abc9f0908 | ||
|
|
61d0263c5b | ||
|
|
e9d43f7751 | ||
|
|
79d951896d | ||
|
|
d433744ec7 | ||
|
|
ec371483ac | ||
|
|
072ab7f048 | ||
|
|
f83fe2b70f | ||
|
|
1fd88cd308 | ||
|
|
028cc2e649 | ||
|
|
9b21a7fdbd | ||
|
|
f1dc505249 | ||
|
|
1e72064557 | ||
|
|
24d20e3231 | ||
|
|
7aee7fcf89 | ||
|
|
11cb3fe442 | ||
|
|
c058f3f336 | ||
|
|
879b06b1c4 | ||
|
|
cd9fb53520 | ||
|
|
5c920bd31d | ||
|
|
c9e8ab555e | ||
|
|
a1a4538200 | ||
|
|
2efeef446e | ||
|
|
f1e1fd0a59 | ||
|
|
114fe2ccd6 | ||
|
|
295cdf2e15 | ||
|
|
6a10861a44 | ||
|
|
b6c04cde1a | ||
|
|
197ff26f68 | ||
|
|
e794c747db | ||
|
|
86a1e93b23 | ||
|
|
9fe9551705 | ||
|
|
b473429939 | ||
|
|
0c298aaf39 | ||
|
|
29826d01f4 | ||
|
|
e23aa5eb32 | ||
|
|
3cc9956f97 | ||
|
|
107b8c249c | ||
|
|
1e519b1bf3 | ||
|
|
dcd06fa0ef | ||
|
|
ee1b44de3f | ||
|
|
2280c963a7 | ||
|
|
b79c04f11c | ||
|
|
df6f2003ef | ||
|
|
66395a5daa | ||
|
|
8e043b5bb4 |
21
.travis.yml
Normal file
21
.travis.yml
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
language: python
|
||||||
|
python:
|
||||||
|
- "2.7"
|
||||||
|
|
||||||
|
env:
|
||||||
|
- PLATFORMIO_CI_SRC=examples/AiwaRCT501SendDemo PLATFORMIO_BUILD_FLAGS="-DSEND_AIWA_RC_T501"
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRrecord PLATFORMIO_BUILD_FLAGS="-DSEND_NEC -DSEND_SONY -DSEND_RC5 -DSEND_RC6"
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRrecvDemo
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRrecvDump
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRrecvDumpV2
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRrelay
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRsendDemo PLATFORMIO_BUILD_FLAGS="-DSEND_SONY"
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRtest PLATFORMIO_BUILD_FLAGS="-DSEND_NEC -DSEND_SONY -DSEND_RC5 -DSEND_RC6"
|
||||||
|
- PLATFORMIO_CI_SRC=examples/IRtest2 PLATFORMIO_BUILD_FLAGS="-DSEND_NEC -DSEND_SONY -DSEND_RC5 -DSEND_RC6"
|
||||||
|
- PLATFORMIO_CI_SRC=examples/JVCPanasonicSendDemo PLATFORMIO_BUILD_FLAGS="-DSEND_JVC -DSEND_PANASONIC"
|
||||||
|
|
||||||
|
install:
|
||||||
|
- python -c "$(curl -fsSL https://raw.githubusercontent.com/platformio/platformio/master/scripts/get-platformio.py)"
|
||||||
|
|
||||||
|
script:
|
||||||
|
- platformio ci --lib="." --board=uno --board=leonardo --board=pro16MHzatmega168
|
||||||
@@ -4,14 +4,14 @@ These are the active contributors of this project that you may contact if there
|
|||||||
- [z3t0](https://github.com/z3t0) : Active Contributor and currently also the main contributor.
|
- [z3t0](https://github.com/z3t0) : Active Contributor and currently also the main contributor.
|
||||||
* Email: zetoslab@gmail.com
|
* Email: zetoslab@gmail.com
|
||||||
* Skype: polarised16
|
* Skype: polarised16
|
||||||
- [shirriff](https://github.com/shirriff) : Owner of repository and creator of library.
|
- [shirriff](https://github.com/shirriff) : An amazing person who worked to create this awesome library and provide unending support
|
||||||
- [Informatic](https://github.com/Informatic) : Active contributor
|
- [Informatic](https://github.com/Informatic) : Active contributor
|
||||||
- [fmeschia](https://github.com/fmeschia) : Active contributor
|
- [fmeschia](https://github.com/fmeschia) : Active contributor
|
||||||
- [PaulStoffregen](https://github.com/paulstroffregen) : Active contributor
|
- [PaulStoffregen](https://github.com/paulstroffregen) : Active contributor
|
||||||
- [crash7](https://github.com/crash7) : Active contributor
|
- [crash7](https://github.com/crash7) : Active contributor
|
||||||
- [Neco777](https://github.com/neco777) : Active contributor
|
- [Neco777](https://github.com/neco777) : Active contributor
|
||||||
- [Lauszus](https://github.com/lauszus) : Active contributor
|
- [Lauszus](https://github.com/lauszus) : Active contributor
|
||||||
- [csBlueChip](https://github.com/csbluechip) : Active contributor
|
- [csBlueChip](https://github.com/csbluechip) : Active contributor, who contributed major and vital changes to the code base.
|
||||||
|
|
||||||
Note: This list is being updated constantly so please let [z3t0](https://github.com/z3t0) know if you have been missed.
|
Note: This list is being updated constantly so please let [z3t0](https://github.com/z3t0) know if you have been missed.
|
||||||
|
|
||||||
|
|||||||
88
IRremote.cpp
88
IRremote.cpp
@@ -1,6 +1,6 @@
|
|||||||
//******************************************************************************
|
//******************************************************************************
|
||||||
// IRremote
|
// IRremote
|
||||||
// Version 0.11 August, 2009
|
// Version 2.0.1 June, 2015
|
||||||
// Copyright 2009 Ken Shirriff
|
// Copyright 2009 Ken Shirriff
|
||||||
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
||||||
//
|
//
|
||||||
@@ -18,6 +18,8 @@
|
|||||||
// Whynter A/C ARC-110WD added by Francesco Meschia
|
// Whynter A/C ARC-110WD added by Francesco Meschia
|
||||||
//******************************************************************************
|
//******************************************************************************
|
||||||
|
|
||||||
|
#include <avr/interrupt.h>
|
||||||
|
|
||||||
// Defining IR_GLOBAL here allows us to declare the instantiation of global variables
|
// Defining IR_GLOBAL here allows us to declare the instantiation of global variables
|
||||||
#define IR_GLOBAL
|
#define IR_GLOBAL
|
||||||
# include "IRremote.h"
|
# include "IRremote.h"
|
||||||
@@ -88,3 +90,87 @@ int MATCH_SPACE (int measured_ticks, int desired_us)
|
|||||||
return ((measured_ticks >= TICKS_LOW (desired_us - MARK_EXCESS))
|
return ((measured_ticks >= TICKS_LOW (desired_us - MARK_EXCESS))
|
||||||
&& (measured_ticks <= TICKS_HIGH(desired_us - MARK_EXCESS)));
|
&& (measured_ticks <= TICKS_HIGH(desired_us - MARK_EXCESS)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//+=============================================================================
|
||||||
|
// Interrupt Service Routine - Fires every 50uS
|
||||||
|
// TIMER2 interrupt code to collect raw data.
|
||||||
|
// Widths of alternating SPACE, MARK are recorded in rawbuf.
|
||||||
|
// Recorded in ticks of 50uS [microseconds, 0.000050 seconds]
|
||||||
|
// 'rawlen' counts the number of entries recorded so far.
|
||||||
|
// First entry is the SPACE between transmissions.
|
||||||
|
// As soon as a the first [SPACE] entry gets long:
|
||||||
|
// Ready is set; State switches to IDLE; Timing of SPACE continues.
|
||||||
|
// As soon as first MARK arrives:
|
||||||
|
// Gap width is recorded; Ready is cleared; New logging starts
|
||||||
|
//
|
||||||
|
ISR (TIMER_INTR_NAME)
|
||||||
|
{
|
||||||
|
TIMER_RESET;
|
||||||
|
|
||||||
|
// Read if IR Receiver -> SPACE [xmt LED off] or a MARK [xmt LED on]
|
||||||
|
// digitalRead() is very slow. Optimisation is possible, but makes the code unportable
|
||||||
|
uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
|
||||||
|
|
||||||
|
irparams.timer++; // One more 50uS tick
|
||||||
|
if (irparams.rawlen >= RAWBUF) irparams.rcvstate = STATE_OVERFLOW ; // Buffer overflow
|
||||||
|
|
||||||
|
switch(irparams.rcvstate) {
|
||||||
|
//......................................................................
|
||||||
|
case STATE_IDLE: // In the middle of a gap
|
||||||
|
if (irdata == MARK) {
|
||||||
|
if (irparams.timer < GAP_TICKS) { // Not big enough to be a gap.
|
||||||
|
irparams.timer = 0;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// Gap just ended; Record duration; Start recording transmission
|
||||||
|
irparams.overflow = false;
|
||||||
|
irparams.rawlen = 0;
|
||||||
|
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
||||||
|
irparams.timer = 0;
|
||||||
|
irparams.rcvstate = STATE_MARK;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//......................................................................
|
||||||
|
case STATE_MARK: // Timing Mark
|
||||||
|
if (irdata == SPACE) { // Mark ended; Record time
|
||||||
|
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
||||||
|
irparams.timer = 0;
|
||||||
|
irparams.rcvstate = STATE_SPACE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//......................................................................
|
||||||
|
case STATE_SPACE: // Timing Space
|
||||||
|
if (irdata == MARK) { // Space just ended; Record time
|
||||||
|
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
||||||
|
irparams.timer = 0;
|
||||||
|
irparams.rcvstate = STATE_MARK;
|
||||||
|
|
||||||
|
} else if (irparams.timer > GAP_TICKS) { // Space
|
||||||
|
// A long Space, indicates gap between codes
|
||||||
|
// Flag the current code as ready for processing
|
||||||
|
// Switch to STOP
|
||||||
|
// Don't reset timer; keep counting Space width
|
||||||
|
irparams.rcvstate = STATE_STOP;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
//......................................................................
|
||||||
|
case STATE_STOP: // Waiting; Measuring Gap
|
||||||
|
if (irdata == MARK) irparams.timer = 0 ; // Reset gap timer
|
||||||
|
break;
|
||||||
|
//......................................................................
|
||||||
|
case STATE_OVERFLOW: // Flag up a read overflow; Stop the State Machine
|
||||||
|
irparams.overflow = true;
|
||||||
|
irparams.rcvstate = STATE_STOP;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If requested, flash LED while receiving IR data
|
||||||
|
if (irparams.blinkflag) {
|
||||||
|
if (irdata == MARK)
|
||||||
|
if (irparams.blinkpin) digitalWrite(irparams.blinkpin, HIGH); // Turn user defined pin LED on
|
||||||
|
else BLINKLED_ON() ; // if no user defined LED pin, turn default LED pin for the hardware on
|
||||||
|
else if (irparams.blinkpin) digitalWrite(irparams.blinkpin, LOW); // Turn user defined pin LED on
|
||||||
|
else BLINKLED_OFF() ; // if no user defined LED pin, turn default LED pin for the hardware on
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
19
IRremote.h
19
IRremote.h
@@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
//******************************************************************************
|
//******************************************************************************
|
||||||
// IRremote
|
// IRremote
|
||||||
// Version 0.1 July, 2009
|
// Version 2.0.1 June, 2015
|
||||||
// Copyright 2009 Ken Shirriff
|
// Copyright 2009 Ken Shirriff
|
||||||
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
||||||
// Edited by Mitra to add new controller SANYO
|
// Edited by Mitra to add new controller SANYO
|
||||||
@@ -56,7 +56,7 @@
|
|||||||
#define SEND_AIWA_RC_T501 1
|
#define SEND_AIWA_RC_T501 1
|
||||||
|
|
||||||
#define DECODE_LG 1
|
#define DECODE_LG 1
|
||||||
#define SEND_LG 0 // NOT WRITTEN
|
#define SEND_LG 1
|
||||||
|
|
||||||
#define DECODE_SANYO 1
|
#define DECODE_SANYO 1
|
||||||
#define SEND_SANYO 0 // NOT WRITTEN
|
#define SEND_SANYO 0 // NOT WRITTEN
|
||||||
@@ -168,10 +168,12 @@ class IRrecv
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
IRrecv (int recvpin) ;
|
IRrecv (int recvpin) ;
|
||||||
|
IRrecv (int recvpin, int blinkpin);
|
||||||
|
|
||||||
void blink13 (int blinkflag) ;
|
void blink13 (int blinkflag) ;
|
||||||
int decode (decode_results *results) ;
|
int decode (decode_results *results) ;
|
||||||
void enableIRIn ( ) ;
|
void enableIRIn ( ) ;
|
||||||
|
bool isIdle ( ) ;
|
||||||
void resume ( ) ;
|
void resume ( ) ;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -251,10 +253,11 @@ class IRsend
|
|||||||
public:
|
public:
|
||||||
IRsend () { }
|
IRsend () { }
|
||||||
|
|
||||||
void enableIROut (int khz) ;
|
void custom_delay_usec (unsigned long uSecs);
|
||||||
void mark (int usec) ;
|
void enableIROut (int khz) ;
|
||||||
void space (int usec) ;
|
void mark (unsigned int usec) ;
|
||||||
void sendRaw (unsigned int buf[], int len, int hz) ;
|
void space (unsigned int usec) ;
|
||||||
|
void sendRaw (unsigned int buf[], unsigned int len, unsigned int hz) ;
|
||||||
|
|
||||||
//......................................................................
|
//......................................................................
|
||||||
# if SEND_RC5
|
# if SEND_RC5
|
||||||
@@ -297,7 +300,7 @@ class IRsend
|
|||||||
# endif
|
# endif
|
||||||
//......................................................................
|
//......................................................................
|
||||||
# if SEND_LG
|
# if SEND_LG
|
||||||
void sendLG ( ) ; // NOT WRITTEN
|
void sendLG (unsigned long data, int nbits) ;
|
||||||
# endif
|
# endif
|
||||||
//......................................................................
|
//......................................................................
|
||||||
# if SEND_SANYO
|
# if SEND_SANYO
|
||||||
@@ -321,7 +324,7 @@ class IRsend
|
|||||||
void sendDenon (unsigned long data, int nbits) ;
|
void sendDenon (unsigned long data, int nbits) ;
|
||||||
# endif
|
# endif
|
||||||
//......................................................................
|
//......................................................................
|
||||||
# if SEND_Pronto
|
# if SEND_PRONTO
|
||||||
void sendPronto (char* code, bool repeat, bool fallback) ;
|
void sendPronto (char* code, bool repeat, bool fallback) ;
|
||||||
# endif
|
# endif
|
||||||
} ;
|
} ;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//******************************************************************************
|
//******************************************************************************
|
||||||
// IRremote
|
// IRremote
|
||||||
// Version 0.1 July, 2009
|
// Version 2.0.1 June, 2015
|
||||||
// Copyright 2009 Ken Shirriff
|
// Copyright 2009 Ken Shirriff
|
||||||
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
|
||||||
//
|
//
|
||||||
@@ -47,7 +47,8 @@ typedef
|
|||||||
// The fields are ordered to reduce memory over caused by struct-padding
|
// The fields are ordered to reduce memory over caused by struct-padding
|
||||||
uint8_t rcvstate; // State Machine state
|
uint8_t rcvstate; // State Machine state
|
||||||
uint8_t recvpin; // Pin connected to IR data from detector
|
uint8_t recvpin; // Pin connected to IR data from detector
|
||||||
uint8_t blinkflag; // true -> enable blinking of pin 13 on IR processing
|
uint8_t blinkpin;
|
||||||
|
uint8_t blinkflag; // true -> enable blinking of pin on IR processing
|
||||||
uint8_t rawlen; // counter of entries in rawbuf
|
uint8_t rawlen; // counter of entries in rawbuf
|
||||||
unsigned int timer; // State timer, counts 50uS ticks.
|
unsigned int timer; // State timer, counts 50uS ticks.
|
||||||
unsigned int rawbuf[RAWBUF]; // raw data
|
unsigned int rawbuf[RAWBUF]; // raw data
|
||||||
@@ -70,6 +71,7 @@ EXTERN volatile irparams_t irparams;
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Defines for blinking the LED
|
// Defines for blinking the LED
|
||||||
//
|
//
|
||||||
|
|
||||||
#if defined(CORE_LED0_PIN)
|
#if defined(CORE_LED0_PIN)
|
||||||
# define BLINKLED CORE_LED0_PIN
|
# define BLINKLED CORE_LED0_PIN
|
||||||
# define BLINKLED_ON() (digitalWrite(CORE_LED0_PIN, HIGH))
|
# define BLINKLED_ON() (digitalWrite(CORE_LED0_PIN, HIGH))
|
||||||
@@ -168,7 +170,7 @@ EXTERN volatile irparams_t irparams;
|
|||||||
//#define IR_USE_TIMER3 // tx = pin 9
|
//#define IR_USE_TIMER3 // tx = pin 9
|
||||||
#define IR_USE_TIMER4_HS // tx = pin 10
|
#define IR_USE_TIMER4_HS // tx = pin 10
|
||||||
|
|
||||||
// Teensy 3.0
|
// Teensy 3.0 / Teensy 3.1
|
||||||
#elif defined(__MK20DX128__) || defined(__MK20DX256__)
|
#elif defined(__MK20DX128__) || defined(__MK20DX256__)
|
||||||
#define IR_USE_TIMER_CMT // tx = pin 5
|
#define IR_USE_TIMER_CMT // tx = pin 5
|
||||||
|
|
||||||
@@ -191,6 +193,14 @@ EXTERN volatile irparams_t irparams;
|
|||||||
#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
|
#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
|
||||||
#define IR_USE_TIMER1 // tx = pin 9
|
#define IR_USE_TIMER1 // tx = pin 9
|
||||||
|
|
||||||
|
// ATtiny84
|
||||||
|
#elif defined(__AVR_ATtiny84__)
|
||||||
|
#define IR_USE_TIMER1 // tx = pin 6
|
||||||
|
|
||||||
|
//ATtiny85
|
||||||
|
#elif defined(__AVR_ATtiny85__)
|
||||||
|
#define IR_USE_TIMER_TINY0 // tx = pin 1
|
||||||
|
|
||||||
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
|
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, Nano, etc
|
||||||
#else
|
#else
|
||||||
//#define IR_USE_TIMER1 // tx = pin 9
|
//#define IR_USE_TIMER1 // tx = pin 9
|
||||||
@@ -294,6 +304,8 @@ EXTERN volatile irparams_t irparams;
|
|||||||
# define TIMER_PWM_PIN 11 // Arduino Mega
|
# define TIMER_PWM_PIN 11 // Arduino Mega
|
||||||
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
|
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
|
||||||
# define TIMER_PWM_PIN 13 // Sanguino
|
# define TIMER_PWM_PIN 13 // Sanguino
|
||||||
|
#elif defined(__AVR_ATtiny84__)
|
||||||
|
# define TIMER_PWM_PIN 6
|
||||||
#else
|
#else
|
||||||
# define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
# define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
|
||||||
#endif
|
#endif
|
||||||
@@ -547,7 +559,39 @@ EXTERN volatile irparams_t irparams;
|
|||||||
})
|
})
|
||||||
#define TIMER_PWM_PIN 16
|
#define TIMER_PWM_PIN 16
|
||||||
|
|
||||||
|
// defines for timer_tiny0 (8 bits)
|
||||||
|
#elif defined(IR_USE_TIMER_TINY0)
|
||||||
|
#define TIMER_RESET
|
||||||
|
#define TIMER_ENABLE_PWM (TCCR0A |= _BV(COM0B1))
|
||||||
|
#define TIMER_DISABLE_PWM (TCCR0A &= ~(_BV(COM0B1)))
|
||||||
|
#define TIMER_ENABLE_INTR (TIMSK |= _BV(OCIE0A))
|
||||||
|
#define TIMER_DISABLE_INTR (TIMSK &= ~(_BV(OCIE0A)))
|
||||||
|
#define TIMER_INTR_NAME TIMER0_COMPA_vect
|
||||||
|
#define TIMER_CONFIG_KHZ(val) ({ \
|
||||||
|
const uint8_t pwmval = SYSCLOCK / 2000 / (val); \
|
||||||
|
TCCR0A = _BV(WGM00); \
|
||||||
|
TCCR0B = _BV(WGM02) | _BV(CS00); \
|
||||||
|
OCR0A = pwmval; \
|
||||||
|
OCR0B = pwmval / 3; \
|
||||||
|
})
|
||||||
|
#define TIMER_COUNT_TOP (SYSCLOCK * USECPERTICK / 1000000)
|
||||||
|
#if (TIMER_COUNT_TOP < 256)
|
||||||
|
#define TIMER_CONFIG_NORMAL() ({ \
|
||||||
|
TCCR0A = _BV(WGM01); \
|
||||||
|
TCCR0B = _BV(CS00); \
|
||||||
|
OCR0A = TIMER_COUNT_TOP; \
|
||||||
|
TCNT0 = 0; \
|
||||||
|
})
|
||||||
|
#else
|
||||||
|
#define TIMER_CONFIG_NORMAL() ({ \
|
||||||
|
TCCR0A = _BV(WGM01); \
|
||||||
|
TCCR0B = _BV(CS01); \
|
||||||
|
OCR0A = TIMER_COUNT_TOP / 8; \
|
||||||
|
TCNT0 = 0; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define TIMER_PWM_PIN 1 /* ATtiny85 */
|
||||||
|
|
||||||
//---------------------------------------------------------
|
//---------------------------------------------------------
|
||||||
// Unknown Timer
|
// Unknown Timer
|
||||||
|
|||||||
19
README.md
19
README.md
@@ -1,18 +1,21 @@
|
|||||||
# IRremote Arduino Library
|
# IRremote Arduino Library
|
||||||
|
|
||||||
[](https://gitter.im/shirriff/Arduino-IRremote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://travis-ci.org/z3t0/Arduino-IRremote)
|
||||||
|
|
||||||
This library enables you to send and receive using infra-red signals on an arduino.
|
[](https://gitter.im/z3t0/Arduino-IRremote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
|
||||||
Check [here](http://shirriff.github.io/Arduino-IRremote/) for tutorials and more information.
|
This library enables you to send and receive using infra-red signals on an Arduino.
|
||||||
|
|
||||||
## Version - 22.00
|
Check [here](http://z3t0.github.io/Arduino-IRremote/) for tutorials and more information.
|
||||||
|
|
||||||
|
## Version - 2.01
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
1. Navigate to the [Releases](https://github.com/shirriff/Arduino-IRremote/releases) page.
|
1. Navigate to the [Releases](https://github.com/z3t0/Arduino-IRremote/releases) page.
|
||||||
2. Download the latest release.
|
2. Download the latest release.
|
||||||
3. Extract the zip file
|
3. Extract the zip file
|
||||||
4. Move the "IRremote" folder that has been extracted to your libraries directory.
|
4. Move the "IRremote" folder that has been extracted to your libraries directory.
|
||||||
|
5. Make sure to delete Arduino_Root/libraries/RobotIRremote. Where Arduino_Root refers to the install directory of Arduino. The library RobotIRremote has similar definitions to IRremote and causes errors.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
- TODO (Check examples for now)
|
- TODO (Check examples for now)
|
||||||
@@ -23,6 +26,12 @@ If you want to contribute to this project:
|
|||||||
- Ask for enhancements
|
- Ask for enhancements
|
||||||
- Create issues and pull requests
|
- Create issues and pull requests
|
||||||
- Tell other people about this library
|
- Tell other people about this library
|
||||||
|
- Contribute new protocols
|
||||||
|
-
|
||||||
|
|
||||||
|
## Contact
|
||||||
|
The only way to contact me at the moment is by email: zetoslab@gmail.com
|
||||||
|
I am not currently monitoring any PRs or Issues due to other issues but will respond to all emails. If anyone wants contributor access, feel free to email me. Or if you find any Issues/PRs to be of importance that my attention is needed please email me.
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
Check [here](Contributors.md)
|
Check [here](Contributors.md)
|
||||||
|
|||||||
39
changelog.md
39
changelog.md
@@ -1,5 +1,36 @@
|
|||||||
## 2.0.1 - 2015/06/26 - [Release](https://github.com/shirriff/Arduino-IRremote/releases/tag/BETA)
|
## 2.0.1 - 2015/07/26 - [Release](https://github.com/shirriff/Arduino-IRremote/releases/tag/BETA)
|
||||||
- Separated protocols into individual files
|
### Changes
|
||||||
- Lots of code clean up
|
- Updated README
|
||||||
- Possible bug fixes
|
- Updated Contributors
|
||||||
|
- Fixed #110 Mess
|
||||||
|
- Created Gitter Room
|
||||||
|
- Added Gitter Badge
|
||||||
|
- Standardised Code Base
|
||||||
|
- Clean Debug Output
|
||||||
|
- Optimized Send Loops
|
||||||
|
- Modularized Design
|
||||||
|
- Optimized and Updated Examples
|
||||||
|
- Improved Documentation
|
||||||
|
- Fixed and Improved many coding errors
|
||||||
|
- Fixed Aiwa RC-T501 Decoding
|
||||||
|
- Fixed Interrupt on ATmega8
|
||||||
|
- Switched to Stable Release of @PlatformIO
|
||||||
|
|
||||||
|
### Additions
|
||||||
|
- Added Aiwa RC-T501 Protocol
|
||||||
|
- Added Denon Protocol
|
||||||
|
- Added Pronto Support
|
||||||
|
- Added Library Properties
|
||||||
|
- Added Template For New Protocols
|
||||||
|
- Added this changelog
|
||||||
|
- Added Teensy LC Support
|
||||||
|
- Added ATtiny84 Support
|
||||||
|
- Added ATtiny85 Support
|
||||||
|
- Added isIdle method
|
||||||
|
|
||||||
|
### Deletions
|
||||||
|
- Removed (Fixed) #110
|
||||||
|
- Broke Teensy 3 / 3.1 Support
|
||||||
|
|
||||||
|
### Not Working
|
||||||
|
- Teensy 3 / 3.1 Support is in Development
|
||||||
|
|||||||
@@ -10,6 +10,11 @@
|
|||||||
|
|
||||||
#include <IRremote.h>
|
#include <IRremote.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Default is Arduino pin D11.
|
||||||
|
* You can change this to another available Arduino Pin.
|
||||||
|
* Your IR receiver should be connected to the pin defined here
|
||||||
|
*/
|
||||||
int RECV_PIN = 11;
|
int RECV_PIN = 11;
|
||||||
|
|
||||||
IRrecv irrecv(RECV_PIN);
|
IRrecv irrecv(RECV_PIN);
|
||||||
@@ -22,18 +27,17 @@ void setup()
|
|||||||
irrecv.enableIRIn(); // Start the receiver
|
irrecv.enableIRIn(); // Start the receiver
|
||||||
}
|
}
|
||||||
|
|
||||||
// Dumps out the decode_results structure.
|
|
||||||
// Call this after IRrecv::decode()
|
|
||||||
// void * to work around compiler issue
|
|
||||||
//void dump(void *v) {
|
|
||||||
// decode_results *results = (decode_results *)v
|
|
||||||
void dump(decode_results *results) {
|
void dump(decode_results *results) {
|
||||||
|
// Dumps out the decode_results structure.
|
||||||
|
// Call this after IRrecv::decode()
|
||||||
int count = results->rawlen;
|
int count = results->rawlen;
|
||||||
if (results->decode_type == UNKNOWN) {
|
if (results->decode_type == UNKNOWN) {
|
||||||
Serial.print("Unknown encoding: ");
|
Serial.print("Unknown encoding: ");
|
||||||
}
|
}
|
||||||
else if (results->decode_type == NEC) {
|
else if (results->decode_type == NEC) {
|
||||||
Serial.print("Decoded NEC: ");
|
Serial.print("Decoded NEC: ");
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (results->decode_type == SONY) {
|
else if (results->decode_type == SONY) {
|
||||||
Serial.print("Decoded SONY: ");
|
Serial.print("Decoded SONY: ");
|
||||||
@@ -46,21 +50,20 @@ void dump(decode_results *results) {
|
|||||||
}
|
}
|
||||||
else if (results->decode_type == PANASONIC) {
|
else if (results->decode_type == PANASONIC) {
|
||||||
Serial.print("Decoded PANASONIC - Address: ");
|
Serial.print("Decoded PANASONIC - Address: ");
|
||||||
Serial.print(results->address,HEX);
|
Serial.print(results->address, HEX);
|
||||||
Serial.print(" Value: ");
|
Serial.print(" Value: ");
|
||||||
}
|
}
|
||||||
else if (results->decode_type == LG) {
|
else if (results->decode_type == LG) {
|
||||||
Serial.print("Decoded LG: ");
|
Serial.print("Decoded LG: ");
|
||||||
}
|
}
|
||||||
else if (results->decode_type == JVC) {
|
else if (results->decode_type == JVC) {
|
||||||
Serial.print("Decoded JVC: ");
|
Serial.print("Decoded JVC: ");
|
||||||
|
|
||||||
}
|
}
|
||||||
else if (results->decode_type == AIWA_RC_T501) {
|
else if (results->decode_type == AIWA_RC_T501) {
|
||||||
Serial.print("Decoded AIWA RC T501: ");
|
Serial.print("Decoded AIWA RC T501: ");
|
||||||
}
|
}
|
||||||
else if (results->decode_type == WHYNTER) {
|
else if (results->decode_type == WHYNTER) {
|
||||||
Serial.print("Decoded Whynter: ");
|
Serial.print("Decoded Whynter: ");
|
||||||
}
|
}
|
||||||
Serial.print(results->value, HEX);
|
Serial.print(results->value, HEX);
|
||||||
Serial.print(" (");
|
Serial.print(" (");
|
||||||
@@ -70,19 +73,19 @@ void dump(decode_results *results) {
|
|||||||
Serial.print(count, DEC);
|
Serial.print(count, DEC);
|
||||||
Serial.print("): ");
|
Serial.print("): ");
|
||||||
|
|
||||||
for (int i = 0; i < count; i++) {
|
for (int i = 1; i < count; i++) {
|
||||||
if ((i % 2) == 1) {
|
if (i & 1) {
|
||||||
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
|
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
|
Serial.write('-');
|
||||||
|
Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
|
||||||
}
|
}
|
||||||
Serial.print(" ");
|
Serial.print(" ");
|
||||||
}
|
}
|
||||||
Serial.println("");
|
Serial.println();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
if (irrecv.decode(&results)) {
|
if (irrecv.decode(&results)) {
|
||||||
Serial.println(results.value, HEX);
|
Serial.println(results.value, HEX);
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// Tell IRremote which Arduino pin is connected to the IR Receiver (TSOP4838)
|
// Tell IRremote which Arduino pin is connected to the IR Receiver (TSOP4838)
|
||||||
//
|
//
|
||||||
int recvPin = 6;
|
int recvPin = 11;
|
||||||
IRrecv irrecv(recvPin);
|
IRrecv irrecv(recvPin);
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
@@ -90,12 +90,11 @@ void dumpRaw (decode_results *results)
|
|||||||
{
|
{
|
||||||
// Print Raw data
|
// Print Raw data
|
||||||
Serial.print("Timing[");
|
Serial.print("Timing[");
|
||||||
Serial.print(results->rawlen, DEC);
|
Serial.print(results->rawlen-1, DEC);
|
||||||
Serial.println("]: ");
|
Serial.println("]: ");
|
||||||
Serial.print(" -");
|
|
||||||
Serial.println(results->rawbuf[0] * USECPERTICK, DEC);
|
|
||||||
for (int i = 1; i < results->rawlen; i++) {
|
for (int i = 1; i < results->rawlen; i++) {
|
||||||
int x = results->rawbuf[i] * USECPERTICK;
|
unsigned long x = results->rawbuf[i] * USECPERTICK;
|
||||||
if (!(i & 1)) { // even
|
if (!(i & 1)) { // even
|
||||||
Serial.print("-");
|
Serial.print("-");
|
||||||
if (x < 1000) Serial.print(" ") ;
|
if (x < 1000) Serial.print(" ") ;
|
||||||
@@ -107,9 +106,9 @@ void dumpRaw (decode_results *results)
|
|||||||
if (x < 1000) Serial.print(" ") ;
|
if (x < 1000) Serial.print(" ") ;
|
||||||
if (x < 100) Serial.print(" ") ;
|
if (x < 100) Serial.print(" ") ;
|
||||||
Serial.print(x, DEC);
|
Serial.print(x, DEC);
|
||||||
Serial.print(", ");
|
if (i < results->rawlen-1) Serial.print(", "); //',' not needed for last one
|
||||||
}
|
}
|
||||||
if (!(i%8)) Serial.println("");
|
if (!(i % 8)) Serial.println("");
|
||||||
}
|
}
|
||||||
Serial.println(""); // Newline
|
Serial.println(""); // Newline
|
||||||
}
|
}
|
||||||
@@ -122,18 +121,18 @@ void dumpCode (decode_results *results)
|
|||||||
// Start declaration
|
// Start declaration
|
||||||
Serial.print("unsigned int "); // variable type
|
Serial.print("unsigned int "); // variable type
|
||||||
Serial.print("rawData["); // array name
|
Serial.print("rawData["); // array name
|
||||||
Serial.print(results->rawlen + 1, DEC); // array size
|
Serial.print(results->rawlen - 1, DEC); // array size
|
||||||
Serial.print("] = {"); // Start declaration
|
Serial.print("] = {"); // Start declaration
|
||||||
|
|
||||||
// Dump data
|
// Dump data
|
||||||
for (int i = 0; i < results->rawlen; i++) {
|
for (int i = 1; i < results->rawlen; i++) {
|
||||||
Serial.print(results->rawbuf[i], DEC);
|
Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
|
||||||
Serial.print(",");
|
if ( i < results->rawlen-1 ) Serial.print(","); // ',' not needed on last one
|
||||||
if (!(i&1)) Serial.print(" ");
|
if (!(i & 1)) Serial.print(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
// End declaration
|
// End declaration
|
||||||
Serial.print("0};"); // Turn LED off at the end
|
Serial.print("};"); //
|
||||||
|
|
||||||
// Comment
|
// Comment
|
||||||
Serial.print(" // ");
|
Serial.print(" // ");
|
||||||
@@ -166,14 +165,13 @@ void dumpCode (decode_results *results)
|
|||||||
//
|
//
|
||||||
void loop ( )
|
void loop ( )
|
||||||
{
|
{
|
||||||
decode_results results; // Somewhere to store the results
|
decode_results results; // Somewhere to store the results
|
||||||
|
|
||||||
if (irrecv.decode(&results)) { // Grab an IR code
|
if (irrecv.decode(&results)) { // Grab an IR code
|
||||||
dumpInfo(&results); // Output the results
|
dumpInfo(&results); // Output the results
|
||||||
dumpRaw(&results); // Output the results in RAW format
|
dumpRaw(&results); // Output the results in RAW format
|
||||||
dumpCode(&results); // Output the results as source code
|
dumpCode(&results); // Output the results as source code
|
||||||
Serial.println(""); // Blank line between entries
|
Serial.println(""); // Blank line between entries
|
||||||
irrecv.resume(); // Prepare for the next value
|
irrecv.resume(); // Prepare for the next value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,20 +6,19 @@
|
|||||||
* http://arcfn.com
|
* http://arcfn.com
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#include <IRremote.h>
|
#include <IRremote.h>
|
||||||
|
|
||||||
IRsend irsend;
|
IRsend irsend;
|
||||||
|
|
||||||
void setup()
|
void setup()
|
||||||
{
|
{
|
||||||
Serial.begin(9600);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void loop() {
|
void loop() {
|
||||||
if (Serial.read() != -1) {
|
for (int i = 0; i < 3; i++) {
|
||||||
for (int i = 0; i < 3; i++) {
|
irsend.sendSony(0xa90, 12);
|
||||||
irsend.sendSony(0xa90, 12); // Sony TV power code
|
delay(40);
|
||||||
delay(40);
|
}
|
||||||
}
|
delay(5000); //5 second delay between each signal burst
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
37
examples/IRsendRawDemo/IRsendRawDemo.ino
Normal file
37
examples/IRsendRawDemo/IRsendRawDemo.ino
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
/*
|
||||||
|
* IRremote: IRsendRawDemo - demonstrates sending IR codes with sendRaw
|
||||||
|
* An IR LED must be connected to Arduino PWM pin 3.
|
||||||
|
* Version 0.1 July, 2009
|
||||||
|
* Copyright 2009 Ken Shirriff
|
||||||
|
* http://arcfn.com
|
||||||
|
*
|
||||||
|
* IRsendRawDemo - added by AnalysIR (via www.AnalysIR.com), 24 August 2015
|
||||||
|
*
|
||||||
|
* This example shows how to send a RAW signal using the IRremote library.
|
||||||
|
* The example signal is actually a 32 bit NEC signal.
|
||||||
|
* Remote Control button: LGTV Power On/Off.
|
||||||
|
* Hex Value: 0x20DF10EF, 32 bits
|
||||||
|
*
|
||||||
|
* It is more efficient to use the sendNEC function to send NEC signals.
|
||||||
|
* Use of sendRaw here, serves only as an example of using the function.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include <IRremote.h>
|
||||||
|
|
||||||
|
IRsend irsend;
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop() {
|
||||||
|
int khz = 38; // 38kHz carrier frequency for the NEC protocol
|
||||||
|
unsigned int irSignal[] = {9000, 4500, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 560, 560, 560, 560, 560, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 560, 560, 1690, 560, 1690, 560, 1690, 560, 1690, 560, 39416, 9000, 2210, 560}; //AnalysIR Batch Export (IRremote) - RAW
|
||||||
|
|
||||||
|
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz); //Note the approach used to automatically calculate the size of the array.
|
||||||
|
|
||||||
|
delay(5000); //In this example, the signal will be repeated every 5 seconds, approximately.
|
||||||
|
}
|
||||||
263
examples/LGACSendDemo/LGACSendDemo.ino
Normal file
263
examples/LGACSendDemo/LGACSendDemo.ino
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
#include <IRremote.h>
|
||||||
|
#include <Wire.h>
|
||||||
|
|
||||||
|
|
||||||
|
IRsend irsend;
|
||||||
|
// not used
|
||||||
|
int RECV_PIN = 11;
|
||||||
|
IRrecv irrecv (RECV_PIN);
|
||||||
|
|
||||||
|
const int AC_TYPE = 0;
|
||||||
|
// 0 : TOWER
|
||||||
|
// 1 : WALL
|
||||||
|
//
|
||||||
|
|
||||||
|
int AC_HEAT = 0;
|
||||||
|
// 0 : cooling
|
||||||
|
// 1 : heating
|
||||||
|
|
||||||
|
int AC_POWER_ON = 0;
|
||||||
|
// 0 : off
|
||||||
|
// 1 : on
|
||||||
|
|
||||||
|
int AC_AIR_ACLEAN = 0;
|
||||||
|
// 0 : off
|
||||||
|
// 1 : on --> power on
|
||||||
|
|
||||||
|
int AC_TEMPERATURE = 27;
|
||||||
|
// temperature : 18 ~ 30
|
||||||
|
|
||||||
|
int AC_FLOW = 1;
|
||||||
|
// 0 : low
|
||||||
|
// 1 : mid
|
||||||
|
// 2 : high
|
||||||
|
// if AC_TYPE =1, 3 : change
|
||||||
|
//
|
||||||
|
|
||||||
|
|
||||||
|
const int AC_FLOW_TOWER[3] = {0, 4, 6};
|
||||||
|
const int AC_FLOW_WALL[4] = {0, 2, 4, 5};
|
||||||
|
|
||||||
|
unsigned long AC_CODE_TO_SEND;
|
||||||
|
|
||||||
|
int r = LOW;
|
||||||
|
int o_r = LOW;
|
||||||
|
|
||||||
|
byte a, b;
|
||||||
|
|
||||||
|
void ac_send_code(unsigned long code)
|
||||||
|
{
|
||||||
|
Serial.print("code to send : ");
|
||||||
|
Serial.print(code, BIN);
|
||||||
|
Serial.print(" : ");
|
||||||
|
Serial.println(code, HEX);
|
||||||
|
|
||||||
|
irsend.sendLG(code, 28);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ac_activate(int temperature, int air_flow)
|
||||||
|
{
|
||||||
|
|
||||||
|
int AC_MSBITS1 = 8;
|
||||||
|
int AC_MSBITS2 = 8;
|
||||||
|
int AC_MSBITS3 = 0;
|
||||||
|
int AC_MSBITS4 ;
|
||||||
|
if ( AC_HEAT == 1 ) {
|
||||||
|
// heating
|
||||||
|
AC_MSBITS4 = 4;
|
||||||
|
} else {
|
||||||
|
// cooling
|
||||||
|
AC_MSBITS4 = 0;
|
||||||
|
}
|
||||||
|
int AC_MSBITS5 = temperature - 15;
|
||||||
|
int AC_MSBITS6 ;
|
||||||
|
|
||||||
|
if ( AC_TYPE == 0) {
|
||||||
|
AC_MSBITS6 = AC_FLOW_TOWER[air_flow];
|
||||||
|
} else {
|
||||||
|
AC_MSBITS6 = AC_FLOW_WALL[air_flow];
|
||||||
|
}
|
||||||
|
|
||||||
|
int AC_MSBITS7 = (AC_MSBITS3 + AC_MSBITS4 + AC_MSBITS5 + AC_MSBITS6) & B00001111;
|
||||||
|
|
||||||
|
AC_CODE_TO_SEND = AC_MSBITS1 << 4 ;
|
||||||
|
AC_CODE_TO_SEND = (AC_CODE_TO_SEND + AC_MSBITS2) << 4;
|
||||||
|
AC_CODE_TO_SEND = (AC_CODE_TO_SEND + AC_MSBITS3) << 4;
|
||||||
|
AC_CODE_TO_SEND = (AC_CODE_TO_SEND + AC_MSBITS4) << 4;
|
||||||
|
AC_CODE_TO_SEND = (AC_CODE_TO_SEND + AC_MSBITS5) << 4;
|
||||||
|
AC_CODE_TO_SEND = (AC_CODE_TO_SEND + AC_MSBITS6) << 4;
|
||||||
|
AC_CODE_TO_SEND = (AC_CODE_TO_SEND + AC_MSBITS7);
|
||||||
|
|
||||||
|
ac_send_code(AC_CODE_TO_SEND);
|
||||||
|
|
||||||
|
AC_POWER_ON = 1;
|
||||||
|
AC_TEMPERATURE = temperature;
|
||||||
|
AC_FLOW = air_flow;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ac_change_air_swing(int air_swing)
|
||||||
|
{
|
||||||
|
if ( AC_TYPE == 0) {
|
||||||
|
if ( air_swing == 1) {
|
||||||
|
AC_CODE_TO_SEND = 0x881316B;
|
||||||
|
} else {
|
||||||
|
AC_CODE_TO_SEND = 0x881317C;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if ( air_swing == 1) {
|
||||||
|
AC_CODE_TO_SEND = 0x8813149;
|
||||||
|
} else {
|
||||||
|
AC_CODE_TO_SEND = 0x881315A;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ac_send_code(AC_CODE_TO_SEND);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ac_power_down()
|
||||||
|
{
|
||||||
|
AC_CODE_TO_SEND = 0x88C0051;
|
||||||
|
|
||||||
|
ac_send_code(AC_CODE_TO_SEND);
|
||||||
|
|
||||||
|
AC_POWER_ON = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ac_air_clean(int air_clean)
|
||||||
|
{
|
||||||
|
if ( air_clean == 1) {
|
||||||
|
AC_CODE_TO_SEND = 0x88C000C;
|
||||||
|
} else {
|
||||||
|
AC_CODE_TO_SEND = 0x88C0084;
|
||||||
|
}
|
||||||
|
|
||||||
|
ac_send_code(AC_CODE_TO_SEND);
|
||||||
|
|
||||||
|
AC_AIR_ACLEAN = air_clean;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setup()
|
||||||
|
{
|
||||||
|
Serial.begin(38400);
|
||||||
|
delay(1000);
|
||||||
|
Wire.begin(7);
|
||||||
|
Wire.onReceive(receiveEvent);
|
||||||
|
|
||||||
|
Serial.println(" - - - T E S T - - - ");
|
||||||
|
|
||||||
|
/* test
|
||||||
|
ac_activate(25, 1);
|
||||||
|
delay(5000);
|
||||||
|
ac_activate(27, 2);
|
||||||
|
delay(5000);
|
||||||
|
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
void loop()
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
ac_activate(25, 1);
|
||||||
|
delay(5000);
|
||||||
|
ac_activate(27, 0);
|
||||||
|
delay(5000);
|
||||||
|
|
||||||
|
|
||||||
|
if ( r != o_r) {
|
||||||
|
|
||||||
|
/*
|
||||||
|
# a : mode or temp b : air_flow, temp, swing, clean, cooling/heating
|
||||||
|
# 18 ~ 30 : temp 0 ~ 2 : flow // on
|
||||||
|
# 0 : off 0
|
||||||
|
# 1 : on 0
|
||||||
|
# 2 : air_swing 0 or 1
|
||||||
|
# 3 : air_clean 0 or 1
|
||||||
|
# 4 : air_flow 0 ~ 2 : flow
|
||||||
|
# 5 : temp 18 ~ 30
|
||||||
|
# + : temp + 1
|
||||||
|
# - : temp - 1
|
||||||
|
# m : change cooling to air clean, air clean to cooling
|
||||||
|
*/
|
||||||
|
Serial.print("a : ");
|
||||||
|
Serial.print(a);
|
||||||
|
Serial.print(" b : ");
|
||||||
|
Serial.println(b);
|
||||||
|
|
||||||
|
switch (a) {
|
||||||
|
case 0: // off
|
||||||
|
ac_power_down();
|
||||||
|
break;
|
||||||
|
case 1: // on
|
||||||
|
ac_activate(AC_TEMPERATURE, AC_FLOW);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
if ( b == 0 | b == 1 ) {
|
||||||
|
ac_change_air_swing(b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 3: // 1 : clean on, power on
|
||||||
|
if ( b == 0 | b == 1 ) {
|
||||||
|
ac_air_clean(b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
if ( 0 <= b && b <= 2 ) {
|
||||||
|
ac_activate(AC_TEMPERATURE, b);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
if (18 <= b && b <= 30 ) {
|
||||||
|
ac_activate(b, AC_FLOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '+':
|
||||||
|
if ( 18 <= AC_TEMPERATURE && AC_TEMPERATURE <= 29 ) {
|
||||||
|
ac_activate((AC_TEMPERATURE + 1), AC_FLOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case '-':
|
||||||
|
if ( 19 <= AC_TEMPERATURE && AC_TEMPERATURE <= 30 ) {
|
||||||
|
ac_activate((AC_TEMPERATURE - 1), AC_FLOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 'm':
|
||||||
|
/*
|
||||||
|
if ac is on, 1) turn off, 2) turn on ac_air_clean(1)
|
||||||
|
if ac is off, 1) turn on, 2) turn off ac_air_clean(0)
|
||||||
|
*/
|
||||||
|
if ( AC_POWER_ON == 1 ) {
|
||||||
|
ac_power_down();
|
||||||
|
delay(100);
|
||||||
|
ac_air_clean(1);
|
||||||
|
} else {
|
||||||
|
if ( AC_AIR_ACLEAN == 1) {
|
||||||
|
ac_air_clean(0);
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
ac_activate(AC_TEMPERATURE, AC_FLOW);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
if ( 18 <= a && a <= 30 ) {
|
||||||
|
if ( 0 <= b && b <= 2 ) {
|
||||||
|
ac_activate(a, b);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
o_r = r ;
|
||||||
|
}
|
||||||
|
delay(100);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void receiveEvent(int howMany)
|
||||||
|
{
|
||||||
|
a = Wire.read();
|
||||||
|
b = Wire.read();
|
||||||
|
r = !r ;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
93
examples/LGACSendDemo/LGACSendDemo.md
Normal file
93
examples/LGACSendDemo/LGACSendDemo.md
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
=== decoding for LG A/C ====
|
||||||
|
- 1) remote of LG AC has two type of HDR mark/space, 8000/4000 and 3100/10000
|
||||||
|
- 2) HDR 8000/4000 is decoded using decodeLG(IRrecvDumpV2) without problem
|
||||||
|
- 3) for HDR 3100/10000, use AnalysIR's code : http://www.analysir.com/blog/2014/03/19/air-conditioners-problems-recording-long-infrared-remote-control-signals-arduino/
|
||||||
|
- 4) for bin output based on AnalysIR's code : https://gist.github.com/chaeplin/a3a4b4b6b887c663bfe8
|
||||||
|
- 5) remove first two byte(11)
|
||||||
|
- 6) sample rawcode with bin output : https://gist.github.com/chaeplin/134d232e0b8cfb898860
|
||||||
|
|
||||||
|
|
||||||
|
=== *** ===
|
||||||
|
- 1) Sample raw code : https://gist.github.com/chaeplin/ab2a7ad1533c41260f0d
|
||||||
|
- 2) send raw code : https://gist.github.com/chaeplin/7c800d3166463bb51be4
|
||||||
|
|
||||||
|
|
||||||
|
=== *** ===
|
||||||
|
- (0) : Cooling or Heating
|
||||||
|
- (1) : fixed
|
||||||
|
- (2) : fixed
|
||||||
|
- (3) : special(power, swing, air clean)
|
||||||
|
- (4) : change air flow, temperature, cooling(0)/heating(4)
|
||||||
|
- (5) : temperature ( 15 + (5) = )
|
||||||
|
- (6) : air flow
|
||||||
|
- (7) : crc ( 3 + 4 + 5 + 6 ) & B00001111
|
||||||
|
|
||||||
|
|
||||||
|
°F = °C × 1.8 + 32
|
||||||
|
°C = (°F − 32) / 1.8
|
||||||
|
|
||||||
|
|
||||||
|
=== *** ===
|
||||||
|
* remote / Korea / without heating
|
||||||
|
|
||||||
|
| status |(0)| (1)| (2)| (3)| (4)| (5)| (6)| (7)
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| on / 25 / mid | C |1000|1000|0000|0000|1010|0010|1100
|
||||||
|
| on / 26 / mid | C |1000|1000|0000|0000|1011|0010|1101
|
||||||
|
| on / 27 / mid | C |1000|1000|0000|0000|1100|0010|1110
|
||||||
|
| on / 28 / mid | C |1000|1000|0000|0000|1101|0010|1111
|
||||||
|
| on / 25 / high | C |1000|1000|0000|0000|1010|0100|1110
|
||||||
|
| on / 26 / high | C |1000|1000|0000|0000|1011|0100|1111
|
||||||
|
| on / 27 / high | C |1000|1000|0000|0000|1100|0100|0000
|
||||||
|
| on / 28 / high | C |1000|1000|0000|0000|1101|0100|0001
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| 1 up | C |1000|1000|0000|1000|1101|0100|1001
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| Cool power | C |1000|1000|0001|0000|0000|1100|1101
|
||||||
|
| energy saving | C |1000|1000|0001|0000|0000|0100|0101
|
||||||
|
| power | C |1000|1000|0001|0000|0000|1000|1001
|
||||||
|
| flow/up/down | C |1000|1000|0001|0011|0001|0100|1001
|
||||||
|
| up/down off | C |1000|1000|0001|0011|0001|0101|1010
|
||||||
|
| flow/left/right| C |1000|1000|0001|0011|0001|0110|1011
|
||||||
|
| left/right off | C |1000|1000|0001|0011|0001|0111|1100
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| Air clean | C |1000|1000|1100|0000|0000|0000|1100
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| off | C |1000|1000|1100|0000|0000|0101|0001
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* remote / with heating
|
||||||
|
* converted using raw code at https://github.com/chaeplin/RaspAC/blob/master/lircd.conf
|
||||||
|
|
||||||
|
| status |(0)| (1)| (2)| (3)| (4)| (5)| (6)| (7)
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| on | C |1000|1000|0000|0000|1011|0010|1101
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| off | C |1000|1000|1100|0000|0000|0101|0001
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| 64 / 18 | C |1000|1000|0000|0000|0011|0100|0111
|
||||||
|
| 66 / 19 | C |1000|1000|0000|0000|0100|0100|1000
|
||||||
|
| 68 / 20 | C |1000|1000|0000|0000|0101|0100|1001
|
||||||
|
| 70 / 21 | C |1000|1000|0000|0000|0110|0100|1010
|
||||||
|
| 72 / 22 | C |1000|1000|0000|0000|0111|0100|1011
|
||||||
|
| 74 / 23 | C |1000|1000|0000|0000|1000|0100|1100
|
||||||
|
| 76 / 25 | C |1000|1000|0000|0000|1010|0100|1110
|
||||||
|
| 78 / 26 | C |1000|1000|0000|0000|1011|0100|1111
|
||||||
|
| 80 / 27 | C |1000|1000|0000|0000|1100|0100|0000
|
||||||
|
| 82 / 28 | C |1000|1000|0000|0000|1101|0100|0001
|
||||||
|
| 84 / 29 | C |1000|1000|0000|0000|1110|0100|0010
|
||||||
|
| 86 / 30 | C |1000|1000|0000|0000|1111|0100|0011
|
||||||
|
|----------------|---|----|----|----|----|----|----|----
|
||||||
|
| heat64 | H |1000|1000|0000|0100|0011|0100|1011
|
||||||
|
| heat66 | H |1000|1000|0000|0100|0100|0100|1100
|
||||||
|
| heat68 | H |1000|1000|0000|0100|0101|0100|1101
|
||||||
|
| heat70 | H |1000|1000|0000|0100|0110|0100|1110
|
||||||
|
| heat72 | H |1000|1000|0000|0100|0111|0100|1111
|
||||||
|
| heat74 | H |1000|1000|0000|0100|1000|0100|0000
|
||||||
|
| heat76 | H |1000|1000|0000|0100|1001|0100|0001
|
||||||
|
| heat78 | H |1000|1000|0000|0100|1011|0100|0011
|
||||||
|
| heat80 | H |1000|1000|0000|0100|1100|0100|0100
|
||||||
|
| heat82 | H |1000|1000|0000|0100|1101|0100|0101
|
||||||
|
| heat84 | H |1000|1000|0000|0100|1110|0100|0110
|
||||||
|
| heat86 | H |1000|1000|0000|0100|1111|0100|0111
|
||||||
85
irISR.cpp
85
irISR.cpp
@@ -1,85 +0,0 @@
|
|||||||
#include <avr/interrupt.h>
|
|
||||||
|
|
||||||
#include "IRremote.h"
|
|
||||||
#include "IRremoteInt.h"
|
|
||||||
|
|
||||||
//+=============================================================================
|
|
||||||
// Interrupt Service Routine - Fires every 50uS
|
|
||||||
// TIMER2 interrupt code to collect raw data.
|
|
||||||
// Widths of alternating SPACE, MARK are recorded in rawbuf.
|
|
||||||
// Recorded in ticks of 50uS [microseconds, 0.000050 seconds]
|
|
||||||
// 'rawlen' counts the number of entries recorded so far.
|
|
||||||
// First entry is the SPACE between transmissions.
|
|
||||||
// As soon as a the first [SPACE] entry gets long:
|
|
||||||
// Ready is set; State switches to IDLE; Timing of SPACE continues.
|
|
||||||
// As soon as first MARK arrives:
|
|
||||||
// Gap width is recorded; Ready is cleared; New logging starts
|
|
||||||
//
|
|
||||||
ISR (TIMER_INTR_NAME)
|
|
||||||
{
|
|
||||||
TIMER_RESET;
|
|
||||||
|
|
||||||
// Read if IR Receiver -> SPACE [xmt LED off] or a MARK [xmt LED on]
|
|
||||||
// digitalRead() is very slow. Optimisation is possible, but makes the code unportable
|
|
||||||
uint8_t irdata = (uint8_t)digitalRead(irparams.recvpin);
|
|
||||||
|
|
||||||
irparams.timer++; // One more 50uS tick
|
|
||||||
if (irparams.rawlen >= RAWBUF) irparams.rcvstate = STATE_OVERFLOW ; // Buffer overflow
|
|
||||||
|
|
||||||
switch(irparams.rcvstate) {
|
|
||||||
//......................................................................
|
|
||||||
case STATE_IDLE: // In the middle of a gap
|
|
||||||
if (irdata == MARK) {
|
|
||||||
if (irparams.timer < GAP_TICKS) { // Not big enough to be a gap.
|
|
||||||
irparams.timer = 0;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
// Gap just ended; Record duration; Start recording transmission
|
|
||||||
irparams.overflow = false;
|
|
||||||
irparams.rawlen = 0;
|
|
||||||
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
|
||||||
irparams.timer = 0;
|
|
||||||
irparams.rcvstate = STATE_MARK;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
//......................................................................
|
|
||||||
case STATE_MARK: // Timing Mark
|
|
||||||
if (irdata == SPACE) { // Mark ended; Record time
|
|
||||||
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
|
||||||
irparams.timer = 0;
|
|
||||||
irparams.rcvstate = STATE_SPACE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
//......................................................................
|
|
||||||
case STATE_SPACE: // Timing Space
|
|
||||||
if (irdata == MARK) { // Space just ended; Record time
|
|
||||||
irparams.rawbuf[irparams.rawlen++] = irparams.timer;
|
|
||||||
irparams.timer = 0;
|
|
||||||
irparams.rcvstate = STATE_MARK;
|
|
||||||
|
|
||||||
} else if (irparams.timer > GAP_TICKS) { // Space
|
|
||||||
// A long Space, indicates gap between codes
|
|
||||||
// Flag the current code as ready for processing
|
|
||||||
// Switch to STOP
|
|
||||||
// Don't reset timer; keep counting Space width
|
|
||||||
irparams.rcvstate = STATE_STOP;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
//......................................................................
|
|
||||||
case STATE_STOP: // Waiting; Measuring Gap
|
|
||||||
if (irdata == MARK) irparams.timer = 0 ; // Reset gap timer
|
|
||||||
break;
|
|
||||||
//......................................................................
|
|
||||||
case STATE_OVERFLOW: // Flag up a read overflow; Stop the State Machine
|
|
||||||
irparams.overflow = true;
|
|
||||||
irparams.rcvstate = STATE_STOP;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If requested, flash LED L (D13) while receiving IR data
|
|
||||||
if (irparams.blinkflag) {
|
|
||||||
if (irdata == MARK) BLINKLED_ON() ; // turn pin 13 LED on
|
|
||||||
else BLINKLED_OFF() ; // turn pin 13 LED off
|
|
||||||
}
|
|
||||||
}
|
|
||||||
43
irRecv.cpp
43
irRecv.cpp
@@ -15,67 +15,67 @@ int IRrecv::decode (decode_results *results)
|
|||||||
|
|
||||||
if (irparams.rcvstate != STATE_STOP) return false ;
|
if (irparams.rcvstate != STATE_STOP) return false ;
|
||||||
|
|
||||||
#ifdef DECODE_NEC
|
#if DECODE_NEC
|
||||||
DBG_PRINTLN("Attempting NEC decode");
|
DBG_PRINTLN("Attempting NEC decode");
|
||||||
if (decodeNEC(results)) return true ;
|
if (decodeNEC(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_SONY
|
#if DECODE_SONY
|
||||||
DBG_PRINTLN("Attempting Sony decode");
|
DBG_PRINTLN("Attempting Sony decode");
|
||||||
if (decodeSony(results)) return true ;
|
if (decodeSony(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_SANYO
|
#if DECODE_SANYO
|
||||||
DBG_PRINTLN("Attempting Sanyo decode");
|
DBG_PRINTLN("Attempting Sanyo decode");
|
||||||
if (decodeSanyo(results)) return true ;
|
if (decodeSanyo(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_MITSUBISHI
|
#if DECODE_MITSUBISHI
|
||||||
DBG_PRINTLN("Attempting Mitsubishi decode");
|
DBG_PRINTLN("Attempting Mitsubishi decode");
|
||||||
if (decodeMitsubishi(results)) return true ;
|
if (decodeMitsubishi(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_RC5
|
#if DECODE_RC5
|
||||||
DBG_PRINTLN("Attempting RC5 decode");
|
DBG_PRINTLN("Attempting RC5 decode");
|
||||||
if (decodeRC5(results)) return true ;
|
if (decodeRC5(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_RC6
|
#if DECODE_RC6
|
||||||
DBG_PRINTLN("Attempting RC6 decode");
|
DBG_PRINTLN("Attempting RC6 decode");
|
||||||
if (decodeRC6(results)) return true ;
|
if (decodeRC6(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_PANASONIC
|
#if DECODE_PANASONIC
|
||||||
DBG_PRINTLN("Attempting Panasonic decode");
|
DBG_PRINTLN("Attempting Panasonic decode");
|
||||||
if (decodePanasonic(results)) return true ;
|
if (decodePanasonic(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_LG
|
#if DECODE_LG
|
||||||
DBG_PRINTLN("Attempting LG decode");
|
DBG_PRINTLN("Attempting LG decode");
|
||||||
if (decodeLG(results)) return true ;
|
if (decodeLG(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_JVC
|
#if DECODE_JVC
|
||||||
DBG_PRINTLN("Attempting JVC decode");
|
DBG_PRINTLN("Attempting JVC decode");
|
||||||
if (decodeJVC(results)) return true ;
|
if (decodeJVC(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_SAMSUNG
|
#if DECODE_SAMSUNG
|
||||||
DBG_PRINTLN("Attempting SAMSUNG decode");
|
DBG_PRINTLN("Attempting SAMSUNG decode");
|
||||||
if (decodeSAMSUNG(results)) return true ;
|
if (decodeSAMSUNG(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_WHYNTER
|
#if DECODE_WHYNTER
|
||||||
DBG_PRINTLN("Attempting Whynter decode");
|
DBG_PRINTLN("Attempting Whynter decode");
|
||||||
if (decodeWhynter(results)) return true ;
|
if (decodeWhynter(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_AIWA_RC_T501
|
#if DECODE_AIWA_RC_T501
|
||||||
DBG_PRINTLN("Attempting Aiwa RC-T501 decode");
|
DBG_PRINTLN("Attempting Aiwa RC-T501 decode");
|
||||||
if (decodeAiwaRCT501(results)) return true ;
|
if (decodeAiwaRCT501(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DECODE_DENON
|
#if DECODE_DENON
|
||||||
DBG_PRINTLN("Attempting Denon decode");
|
DBG_PRINTLN("Attempting Denon decode");
|
||||||
if (decodeDenon(results)) return true ;
|
if (decodeDenon(results)) return true ;
|
||||||
#endif
|
#endif
|
||||||
@@ -97,6 +97,16 @@ IRrecv::IRrecv (int recvpin)
|
|||||||
irparams.blinkflag = 0;
|
irparams.blinkflag = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
IRrecv::IRrecv (int recvpin, int blinkpin)
|
||||||
|
{
|
||||||
|
irparams.recvpin = recvpin;
|
||||||
|
irparams.blinkpin = blinkpin;
|
||||||
|
pinMode(blinkpin, OUTPUT);
|
||||||
|
irparams.blinkflag = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
// initialization
|
// initialization
|
||||||
//
|
//
|
||||||
@@ -133,6 +143,13 @@ void IRrecv::blink13 (int blinkflag)
|
|||||||
if (blinkflag) pinMode(BLINKLED, OUTPUT) ;
|
if (blinkflag) pinMode(BLINKLED, OUTPUT) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//+=============================================================================
|
||||||
|
// Return if receiving new IR signals
|
||||||
|
//
|
||||||
|
bool IRrecv::isIdle ( )
|
||||||
|
{
|
||||||
|
return (irparams.rcvstate == STATE_IDLE || irparams.rcvstate == STATE_STOP) ? true : false;
|
||||||
|
}
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
// Restart the ISR state machine
|
// Restart the ISR state machine
|
||||||
//
|
//
|
||||||
|
|||||||
33
irSend.cpp
33
irSend.cpp
@@ -2,12 +2,12 @@
|
|||||||
#include "IRremoteInt.h"
|
#include "IRremoteInt.h"
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
void IRsend::sendRaw (unsigned int buf[], int len, int hz)
|
void IRsend::sendRaw (unsigned int buf[], unsigned int len, unsigned int hz)
|
||||||
{
|
{
|
||||||
// Set IR carrier frequency
|
// Set IR carrier frequency
|
||||||
enableIROut(hz);
|
enableIROut(hz);
|
||||||
|
|
||||||
for (int i = 0; i < len; i++) {
|
for (unsigned int i = 0; i < len; i++) {
|
||||||
if (i & 1) space(buf[i]) ;
|
if (i & 1) space(buf[i]) ;
|
||||||
else mark (buf[i]) ;
|
else mark (buf[i]) ;
|
||||||
}
|
}
|
||||||
@@ -19,10 +19,10 @@ void IRsend::sendRaw (unsigned int buf[], int len, int hz)
|
|||||||
// Sends an IR mark for the specified number of microseconds.
|
// Sends an IR mark for the specified number of microseconds.
|
||||||
// The mark output is modulated at the PWM frequency.
|
// The mark output is modulated at the PWM frequency.
|
||||||
//
|
//
|
||||||
void IRsend::mark (int time)
|
void IRsend::mark (unsigned int time)
|
||||||
{
|
{
|
||||||
TIMER_ENABLE_PWM; // Enable pin 3 PWM output
|
TIMER_ENABLE_PWM; // Enable pin 3 PWM output
|
||||||
if (time > 0) delayMicroseconds(time);
|
if (time > 0) custom_delay_usec(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
@@ -30,12 +30,16 @@ void IRsend::mark (int time)
|
|||||||
// Sends an IR space for the specified number of microseconds.
|
// Sends an IR space for the specified number of microseconds.
|
||||||
// A space is no output, so the PWM output is disabled.
|
// A space is no output, so the PWM output is disabled.
|
||||||
//
|
//
|
||||||
void IRsend::space (int time)
|
void IRsend::space (unsigned int time)
|
||||||
{
|
{
|
||||||
TIMER_DISABLE_PWM; // Disable pin 3 PWM output
|
TIMER_DISABLE_PWM; // Disable pin 3 PWM output
|
||||||
if (time > 0) delayMicroseconds(time);
|
if (time > 0) IRsend::custom_delay_usec(time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//+=============================================================================
|
//+=============================================================================
|
||||||
// Enables IR output. The khz value controls the modulation frequency in kilohertz.
|
// Enables IR output. The khz value controls the modulation frequency in kilohertz.
|
||||||
// The IR output will be on pin 3 (OC2B).
|
// The IR output will be on pin 3 (OC2B).
|
||||||
@@ -64,3 +68,20 @@ void IRsend::enableIROut (int khz)
|
|||||||
TIMER_CONFIG_KHZ(khz);
|
TIMER_CONFIG_KHZ(khz);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//+=============================================================================
|
||||||
|
// Custom delay function that circumvents Arduino's delayMicroseconds limit
|
||||||
|
|
||||||
|
void IRsend::custom_delay_usec(unsigned long uSecs) {
|
||||||
|
if (uSecs > 4) {
|
||||||
|
unsigned long start = micros();
|
||||||
|
unsigned long endMicros = start + uSecs - 4;
|
||||||
|
if (endMicros < start) { // Check if overflow
|
||||||
|
while ( micros() > start ) {} // wait until overflow
|
||||||
|
}
|
||||||
|
while ( micros() < endMicros ) {} // normal wait
|
||||||
|
}
|
||||||
|
//else {
|
||||||
|
// __asm__("nop\n\t"); // must have or compiler optimizes out
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@
|
|||||||
// A A IIIII WWW A A
|
// A A IIIII WWW A A
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
|
|
||||||
// Baszed off the RC-T501 RCU
|
// Based off the RC-T501 RCU
|
||||||
// Lirc file http://lirc.sourceforge.net/remotes/aiwa/RC-T501
|
// Lirc file http://lirc.sourceforge.net/remotes/aiwa/RC-T501
|
||||||
|
|
||||||
#define AIWA_RC_T501_HZ 38
|
#define AIWA_RC_T501_HZ 38
|
||||||
@@ -28,7 +28,6 @@
|
|||||||
void IRsend::sendAiwaRCT501 (int code)
|
void IRsend::sendAiwaRCT501 (int code)
|
||||||
{
|
{
|
||||||
unsigned long pre = 0x0227EEC0; // 26-bits
|
unsigned long pre = 0x0227EEC0; // 26-bits
|
||||||
int mask;
|
|
||||||
|
|
||||||
// Set IR carrier frequency
|
// Set IR carrier frequency
|
||||||
enableIROut(AIWA_RC_T501_HZ);
|
enableIROut(AIWA_RC_T501_HZ);
|
||||||
|
|||||||
26
ir_LG.cpp
26
ir_LG.cpp
@@ -52,3 +52,29 @@ bool IRrecv::decodeLG (decode_results *results)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//+=============================================================================
|
||||||
|
#if SEND_LG
|
||||||
|
void IRsend::sendLG (unsigned long data, int nbits)
|
||||||
|
{
|
||||||
|
// Set IR carrier frequency
|
||||||
|
enableIROut(38);
|
||||||
|
|
||||||
|
// Header
|
||||||
|
mark(LG_HDR_MARK);
|
||||||
|
space(LG_HDR_SPACE);
|
||||||
|
mark(LG_BIT_MARK);
|
||||||
|
|
||||||
|
// Data
|
||||||
|
for (unsigned long mask = 1UL << (nbits - 1); mask; mask >>= 1) {
|
||||||
|
if (data & mask) {
|
||||||
|
space(LG_ONE_SPACE);
|
||||||
|
mark(LG_BIT_MARK);
|
||||||
|
} else {
|
||||||
|
space(LG_ZERO_SPACE);
|
||||||
|
mark(LG_BIT_MARK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
space(0); // Always end with the LED off
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@
|
|||||||
// t1 is the time interval for a single bit in microseconds.
|
// t1 is the time interval for a single bit in microseconds.
|
||||||
// Returns -1 for error (measured time interval is not a multiple of t1).
|
// Returns -1 for error (measured time interval is not a multiple of t1).
|
||||||
//
|
//
|
||||||
|
#if (DECODE_RC5 || DECODE_RC6)
|
||||||
int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int t1)
|
int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int t1)
|
||||||
{
|
{
|
||||||
int width;
|
int width;
|
||||||
@@ -37,6 +38,7 @@ int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int
|
|||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
//==============================================================================
|
//==============================================================================
|
||||||
// RRRR CCCC 55555
|
// RRRR CCCC 55555
|
||||||
|
|||||||
@@ -32,7 +32,6 @@ sendSharpRaw KEYWORD2
|
|||||||
sendPanasonic KEYWORD2
|
sendPanasonic KEYWORD2
|
||||||
sendJVC KEYWORD2
|
sendJVC KEYWORD2
|
||||||
|
|
||||||
#
|
|
||||||
#######################################
|
#######################################
|
||||||
# Constants (LITERAL1)
|
# Constants (LITERAL1)
|
||||||
#######################################
|
#######################################
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
name=IRremote
|
name=IRremote
|
||||||
version=1.0
|
version=2.0.1
|
||||||
author=shirriff
|
author=shirriff
|
||||||
maintainer=shirriff
|
maintainer=shirriff
|
||||||
sentence=Send and receive infrared signals with multiple protocols
|
sentence=Send and receive infrared signals with multiple protocols
|
||||||
|
|||||||
Reference in New Issue
Block a user