79 Commits

Author SHA1 Message Date
Rafi Khan
e1957629d3 Update ir_Aiwa.cpp
fixed typo in line 12
2015-11-10 15:02:32 -06:00
Rafi Khan
9293d2fcba Merge pull request #233 from ram-0000/patch-1
Update ir_Aiwa.cpp
2015-11-10 15:01:45 -06:00
ram-0000
c41f506cc1 Update ir_Aiwa.cpp
Remove unused mask variable line 31
2015-11-08 19:38:54 +01:00
Rafi Khan
3c4fc7bf37 Merge pull request #223 from PaoloP74/master
Update version to 2.0.1
2015-09-28 20:46:21 -06:00
Rafi Khan
26560e5755 Contact info @readme.md 2015-09-28 20:45:55 -06:00
Paolo Paolucci
d7a4c4e0c8 Update version to 2.0.1 2015-09-25 09:23:22 +02:00
Paolo Paolucci
9a57b2aead Errata corrige keyword file 2015-09-25 09:22:25 +02:00
Paolo P
c90d6788a1 Update version to 2.0.1
Update to version 2.0.1
2015-09-24 11:43:33 +02:00
Rafi Khan
2da6aeaf27 Merge pull request #215 from audetto/master
Merge back irISR.cpp into irRemote.cpp to avoid a linker issue
2015-09-10 15:52:44 -06:00
Rafi Khan
2fd83bbb00 Merge pull request #219 from bessl/master
Changed library name "RobotIRremote"
2015-09-09 09:00:35 -06:00
Bernhard Essl
702a064251 Merge pull request #1 from bessl/bessl-patch-1
Changed library name "RobotIRremote"
2015-09-09 10:49:16 +02:00
Bernhard Essl
f5071daac8 Changed library name "RobotIRremote" 2015-09-09 10:47:28 +02:00
Andrea Odetti
5b82539954 Merge back irISR.cpp into irRemote.cpp to avoid an issue due to the absence of exported symbols from irISR.cpp
see

https://github.com/z3t0/Arduino-IRremote/issues/214
https://github.com/sudar/Arduino-Makefile/issues/376

In some circumstances the linker skips irISR.cpp

irRemote.cpp is always included (by the linker).

Andrea
2015-09-02 20:19:03 +01:00
Rafi Khan
55f3e27866 Merge pull request #213 from AnalysIR/master
Update IRrecvDumpV2.ino
2015-08-28 16:43:43 -06:00
AnalysIR
f985c4b318 Update IRrecvDumpV2.ino
- Cleaned up layout of output, removed trailing commas
- buffer sizes are now correct
- no need to add 0 for space at end, as sendRAW takes care of this
2015-08-28 15:56:18 +01:00
Rafi Khan
cdd783ce7e Merge pull request #212 from chaeplin/master
LG_AC : heating option
2015-08-27 13:28:25 -06:00
chaeplin
a237a0e393 typo 86 / 30 2015-08-28 04:15:04 +09:00
chaeplin
27777e89b2 decoding for LG A/C 2015-08-28 04:02:47 +09:00
chaeplin
0ef30ed227 Fahrenheit 2015-08-28 03:36:26 +09:00
chaeplin
d87707d0ec add heating 2015-08-27 21:09:30 +09:00
chaeplin
d8bdbb1a44 typo 2015-08-27 21:04:34 +09:00
chaeplin
3fcb071d36 heating 2015-08-27 21:01:26 +09:00
chaeplin
b4c8e6b22c Revert "Revert "heating""
This reverts commit e6bcf89664.
2015-08-27 20:58:38 +09:00
chaeplin
e6bcf89664 Revert "heating"
This reverts commit df34396969.
2015-08-27 20:58:00 +09:00
chaeplin
df34396969 heating 2015-08-27 20:55:40 +09:00
Rafi Khan
bce86bf8ed corrected a typo 2015-08-26 16:16:26 -06:00
Rafi Khan
0bf5993a5b Update README.md 2015-08-26 16:14:26 -06:00
Rafi Khan
77fd51e891 Merge pull request #203 from chaeplin/LG_AC
adding SEND_LG
2015-08-26 16:10:11 -06:00
Rafi Khan
22e64f144c Merge pull request #207 from AnalysIR/master
Bug fixes as per Issue #167
2015-08-26 16:09:32 -06:00
AnalysIR
61f00b8dc5 Update IRrecvDumpV2.ino
Fixed presentation & 2 bugs.

Presentation: No longer display leading space in timings, as is confusing to users & essentially irrelevant.
Bug Fix 1: rawData was starting with a space & would not work with sendRaw
Bug Fix 2: chaned x from unsigned int to nsigend long to avoid potential overflow on integer multiplication.

very similar to recent changes to IRrecDump #167  #207
2015-08-25 01:00:56 +01:00
AnalysIR
bd72084b7f Bug fixes as per Issue #167
Have updated IRrecvDdump to fix bugs described in Issue: #167

In summary, removed bug where large space values were displayed incorrectly & confusing users. The output now always starts with a mark, instead of a space, which makes it easier to interpret and less confusing for users.

refer to #167 for more detials.

The update has been tested with several protocols (but not all) and verified as working.
2015-08-25 00:34:54 +01:00
Rafi Khan
cd02daf27c Merge pull request #206 from AnalysIR/master
Create IRsendRawDemo
2015-08-24 15:06:30 -06:00
AnalysIR
339a7969c9 Delete IRsendRawDemo.ino
moved to own folder to maintain consistency with other examples
2015-08-24 21:26:08 +01:00
AnalysIR
0abc9f0908 Create IRsendRawDemo.ino
New example should go into new fordel of same name...sorry
2015-08-24 21:25:22 +01:00
AnalysIR
61d0263c5b Rename IRsendRawDemo to IRsendRawDemo.ino
forgot to put .ino extension on file.

now corrected
2015-08-24 21:21:46 +01:00
AnalysIR
e9d43f7751 Create IRsendRawDemo
As sendRaw is a very popular methos of sending unknown or AC signals, I though it would be very useful to include and example of same with the library.

The code in this new example is tested and verified as working with the latest Master.
2015-08-24 21:17:23 +01:00
Rafi Khan
79d951896d Merge pull request #205 from AnalysIR/master
Update IRsendDemo.ino
2015-08-24 13:55:45 -06:00
AnalysIR
d433744ec7 Update IRsendDemo.ino
As written this example will cause issues with some IR receivers. On the face of it it sends teh sony signal burst 3 times with a 40ms gap. However, it really continues to send the sony signal forever with a 40ms gap.

There needs to be a reasonable gap between signals sent & I have added in a 5 sec gap as a reasonable figure.

Without a gap, many IR receivers will treat this signal as noise as it send continuous sony bursts with a 40 ms gap.
2015-08-24 20:37:41 +01:00
chaeplin
ec371483ac adding SEND_LG 2015-08-22 19:06:22 +09:00
Rafi Khan
072ab7f048 Merge pull request #202 from AnalysIR/master
change int to unsigned int in IRrecvDumpV2
2015-08-20 10:19:26 -06:00
AnalysIR
f83fe2b70f Update IRrecvDumpV2.ino
looks like this multiplier was omitted and needs to be include to make the output meaningful/useful???

Would also explain some weird output I have seen posted.
2015-08-20 15:53:50 +01:00
AnalysIR
1fd88cd308 change int to unsigned int in IRrecvDumpV2
some larger values could overflow to negative numbers, with unsigned int (vs int)
2015-08-20 15:46:23 +01:00
Rafi Khan
028cc2e649 Merge pull request #201 from AnalysIR/master
Updates to IRremote.h, irSend.cpp. by @AnalysIR
2015-08-19 17:07:35 -06:00
AnalysIR
9b21a7fdbd Update parameters for mark,space and sendraw
parameters changed from int to unsigned int to allow longer mark/space durations and signal length.
hz changed to allow for potential future use of 455kHz carrier frequency. (Ther may be existing modes to the library, using this frequency)
2015-08-19 23:24:59 +01:00
AnalysIR
f1dc505249 Merge pull request #1 from AnalysIR/AnalysIR-IRremote-patch-1-1
changes to  senRAW, mark,space,custom_delay_usec
2015-08-19 23:19:14 +01:00
AnalysIR
1e72064557 changes to senRAW, mark,space,custom_delay_usec
parameters changed from int to unsigned int to allow longer mark/space durations and signal length.hz changed to allow for potential future use of 455kHz carrier frequency. (Ther may be existing modes to the library, using this frequency)

removed "asm" workaround for compiler, because it was not need ed on my system.
Original autor should verify this again. It could be alternatice compiler optimization settings?
Alternatively, place the volatile keyword before the variables in the function to avoid the "optimization out"
2015-08-19 23:17:03 +01:00
Rafi Khan
24d20e3231 Merge pull request #198 from pcoughlin/master
update custom_delay function
2015-08-15 14:04:34 -06:00
Paul Coughlin
7aee7fcf89 update custom_delay function
Use micros() to delay based on "real-time" instead of approximation with
delay() or delayMicroseconds()

Changed name to _usec to correspond to MicroSeconds.
_ms is MilliSeconds.
2015-08-14 20:22:34 -06:00
Rafi Khan
11cb3fe442 Fixed delay method by replacing delayMicroseconds call with a loop if
it is too long.
2015-08-13 16:54:59 -06:00
Rafi Khan
c058f3f336 solves #195 2015-08-12 14:16:51 -06:00
Rafi Khan
879b06b1c4 Removed a windows encoding line in irISR.cpp, #192 2015-08-11 00:17:55 -06:00
Rafi Khan
cd9fb53520 Fixed README links. 2015-08-10 14:41:13 -06:00
Rafi Khan
5c920bd31d wrapped getRCLevel function with #if DECODE_RC5/6 2015-08-10 14:33:35 -06:00
Rafi Khan
c9e8ab555e changed ifdef to if in IRRecv 2015-08-10 14:31:27 -06:00
Rafi Khan
a1a4538200 fixed previous commit 2015-08-10 14:12:03 -06:00
Rafi Khan
2efeef446e Working on sendRaw Bug 2015-08-10 13:53:56 -06:00
Rafi Khan
f1e1fd0a59 Merge pull request #183 from madmalkav/master
Added suport for user defined IR reception feedback LED
2015-08-09 21:31:08 -06:00
madmalkav
114fe2ccd6 Added suport for user defined IR reception feedback LED 2015-07-31 20:58:04 +02:00
Rafi Khan
295cdf2e15 Merge pull request #182 from ivankravets/patch-1
Update Travis CI badge with @z3t0 account
2015-07-30 11:44:29 -06:00
Rafi Khan
6a10861a44 Update IRsendDemo.ino 2015-07-30 11:43:59 -06:00
Ivan Kravets
b6c04cde1a Update Travis CI badge with @z3t0 account 2015-07-30 19:24:12 +03:00
Rafi Khan
197ff26f68 Update Contributors.md 2015-07-30 00:14:55 -06:00
Rafi Khan
e794c747db Travis CI workingvim README.md ! added the badge 2015-07-30 00:03:15 -06:00
Rafi Khan
86a1e93b23 dummy commit to test travis ci 2015-07-30 00:01:37 -06:00
Rafi Khan
9fe9551705 Removed Travis Badge, will add when Travis is working 2015-07-26 23:03:39 -06:00
Rafi Khan
b473429939 Merge pull request #107 from shirriff/experimental
Merging 2.1 (#107 Experimental) to master where development will continue
2015-07-26 22:41:31 -06:00
Rafi Khan
0c298aaf39 Updated changelog 2015-07-26 22:38:20 -06:00
Rafi Khan
29826d01f4 Added pin comment for ATtiny84 2015-07-26 22:37:56 -06:00
Rafi Khan
e23aa5eb32 Updating Changelog - test 1 2015-07-26 22:13:24 -06:00
Rafi Khan
3cc9956f97 #176 2015-07-24 16:36:09 -06:00
Rafi Khan
107b8c249c 1e519b1bf 2015-07-24 16:35:28 -06:00
Rafi Khan
1e519b1bf3 added isIdle Method for receiving, #48 2015-07-23 19:39:46 -06:00
Rafi Khan
dcd06fa0ef Add support for ATtiny85 2015-07-23 19:12:23 -06:00
Rafi Khan
ee1b44de3f Add support for ATtiny84 2015-07-23 19:04:22 -06:00
Rafi Khan
2280c963a7 testing travis 2015-07-16 19:47:11 -06:00
Rafi Khan
b79c04f11c Merge branch 'ivankravets-master' into experimental
Conflicts:
	README.md
2015-07-16 19:41:40 -06:00
Rafi Khan
df6f2003ef Merge branch 'master' of git://github.com/ivankravets/Arduino-IRremote into ivankravets-master 2015-07-16 18:59:10 -06:00
Ivan Kravets
66395a5daa Switch to stable release of @PlatformIO 2015-05-27 17:18:01 +03:00
Ivan Kravets
8e043b5bb4 Continuous Integration with @travis-ci + @PlatformIO 2015-05-23 19:35:45 +03:00
21 changed files with 805 additions and 239 deletions

21
.travis.yml Normal file
View 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

View File

@@ -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.
* Email: zetoslab@gmail.com
* 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
- [fmeschia](https://github.com/fmeschia) : Active contributor
- [PaulStoffregen](https://github.com/paulstroffregen) : Active contributor
- [crash7](https://github.com/crash7) : Active contributor
- [Neco777](https://github.com/neco777) : 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.

View File

@@ -1,6 +1,6 @@
//******************************************************************************
// IRremote
// Version 0.11 August, 2009
// Version 2.0.1 June, 2015
// Copyright 2009 Ken Shirriff
// 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
//******************************************************************************
#include <avr/interrupt.h>
// Defining IR_GLOBAL here allows us to declare the instantiation of global variables
#define IR_GLOBAL
# 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))
&& (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
}
}

View File

@@ -1,7 +1,7 @@
//******************************************************************************
// IRremote
// Version 0.1 July, 2009
// Version 2.0.1 June, 2015
// Copyright 2009 Ken Shirriff
// For details, see http://arcfn.com/2009/08/multi-protocol-infrared-remote-library.html
// Edited by Mitra to add new controller SANYO
@@ -56,7 +56,7 @@
#define SEND_AIWA_RC_T501 1
#define DECODE_LG 1
#define SEND_LG 0 // NOT WRITTEN
#define SEND_LG 1
#define DECODE_SANYO 1
#define SEND_SANYO 0 // NOT WRITTEN
@@ -168,10 +168,12 @@ class IRrecv
{
public:
IRrecv (int recvpin) ;
IRrecv (int recvpin, int blinkpin);
void blink13 (int blinkflag) ;
int decode (decode_results *results) ;
void enableIRIn ( ) ;
bool isIdle ( ) ;
void resume ( ) ;
private:
@@ -251,10 +253,11 @@ class IRsend
public:
IRsend () { }
void enableIROut (int khz) ;
void mark (int usec) ;
void space (int usec) ;
void sendRaw (unsigned int buf[], int len, int hz) ;
void custom_delay_usec (unsigned long uSecs);
void enableIROut (int khz) ;
void mark (unsigned int usec) ;
void space (unsigned int usec) ;
void sendRaw (unsigned int buf[], unsigned int len, unsigned int hz) ;
//......................................................................
# if SEND_RC5
@@ -297,7 +300,7 @@ class IRsend
# endif
//......................................................................
# if SEND_LG
void sendLG ( ) ; // NOT WRITTEN
void sendLG (unsigned long data, int nbits) ;
# endif
//......................................................................
# if SEND_SANYO
@@ -321,7 +324,7 @@ class IRsend
void sendDenon (unsigned long data, int nbits) ;
# endif
//......................................................................
# if SEND_Pronto
# if SEND_PRONTO
void sendPronto (char* code, bool repeat, bool fallback) ;
# endif
} ;

View File

@@ -1,6 +1,6 @@
//******************************************************************************
// IRremote
// Version 0.1 July, 2009
// Version 2.0.1 June, 2015
// Copyright 2009 Ken Shirriff
// 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
uint8_t rcvstate; // State Machine state
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
unsigned int timer; // State timer, counts 50uS ticks.
unsigned int rawbuf[RAWBUF]; // raw data
@@ -70,6 +71,7 @@ EXTERN volatile irparams_t irparams;
//------------------------------------------------------------------------------
// Defines for blinking the LED
//
#if defined(CORE_LED0_PIN)
# define BLINKLED CORE_LED0_PIN
# 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_TIMER4_HS // tx = pin 10
// Teensy 3.0
// Teensy 3.0 / Teensy 3.1
#elif defined(__MK20DX128__) || defined(__MK20DX256__)
#define IR_USE_TIMER_CMT // tx = pin 5
@@ -191,6 +193,14 @@ EXTERN volatile irparams_t irparams;
#elif defined(__AVR_ATmega8P__) || defined(__AVR_ATmega8__)
#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
#else
//#define IR_USE_TIMER1 // tx = pin 9
@@ -294,6 +304,8 @@ EXTERN volatile irparams_t irparams;
# define TIMER_PWM_PIN 11 // Arduino Mega
#elif defined(__AVR_ATmega644P__) || defined(__AVR_ATmega644__)
# define TIMER_PWM_PIN 13 // Sanguino
#elif defined(__AVR_ATtiny84__)
# define TIMER_PWM_PIN 6
#else
# define TIMER_PWM_PIN 9 // Arduino Duemilanove, Diecimila, LilyPad, etc
#endif
@@ -547,7 +559,39 @@ EXTERN volatile irparams_t irparams;
})
#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

View File

@@ -1,18 +1,21 @@
# IRremote Arduino Library
[![Join the chat at https://gitter.im/shirriff/Arduino-IRremote](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/shirriff/Arduino-IRremote?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Build Status](https://travis-ci.org/z3t0/Arduino-IRremote.svg?branch=master)](https://travis-ci.org/z3t0/Arduino-IRremote)
This library enables you to send and receive using infra-red signals on an arduino.
[![Join the chat at https://gitter.im/z3t0/Arduino-IRremote](https://badges.gitter.im/Join%20Chat.svg)](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
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.
3. Extract the zip file
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
- TODO (Check examples for now)
@@ -23,6 +26,12 @@ If you want to contribute to this project:
- Ask for enhancements
- Create issues and pull requests
- 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
Check [here](Contributors.md)

View File

@@ -1,5 +1,36 @@
## 2.0.1 - 2015/06/26 - [Release](https://github.com/shirriff/Arduino-IRremote/releases/tag/BETA)
- Separated protocols into individual files
- Lots of code clean up
- Possible bug fixes
## 2.0.1 - 2015/07/26 - [Release](https://github.com/shirriff/Arduino-IRremote/releases/tag/BETA)
### Changes
- Updated README
- 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

View File

@@ -10,7 +10,12 @@
#include <IRremote.h>
int RECV_PIN = 11;
/*
* 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;
IRrecv irrecv(RECV_PIN);
@@ -22,18 +27,17 @@ void setup()
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) {
// Dumps out the decode_results structure.
// Call this after IRrecv::decode()
int count = results->rawlen;
if (results->decode_type == UNKNOWN) {
Serial.print("Unknown encoding: ");
}
else if (results->decode_type == NEC) {
Serial.print("Decoded NEC: ");
}
else if (results->decode_type == SONY) {
Serial.print("Decoded SONY: ");
@@ -46,21 +50,20 @@ void dump(decode_results *results) {
}
else if (results->decode_type == PANASONIC) {
Serial.print("Decoded PANASONIC - Address: ");
Serial.print(results->address,HEX);
Serial.print(results->address, HEX);
Serial.print(" Value: ");
}
else if (results->decode_type == LG) {
Serial.print("Decoded LG: ");
Serial.print("Decoded LG: ");
}
else if (results->decode_type == JVC) {
Serial.print("Decoded JVC: ");
Serial.print("Decoded JVC: ");
}
else if (results->decode_type == AIWA_RC_T501) {
Serial.print("Decoded AIWA RC T501: ");
}
else if (results->decode_type == WHYNTER) {
Serial.print("Decoded Whynter: ");
Serial.print("Decoded Whynter: ");
}
Serial.print(results->value, HEX);
Serial.print(" (");
@@ -70,19 +73,19 @@ void dump(decode_results *results) {
Serial.print(count, DEC);
Serial.print("): ");
for (int i = 0; i < count; i++) {
if ((i % 2) == 1) {
for (int i = 1; i < count; i++) {
if (i & 1) {
Serial.print(results->rawbuf[i]*USECPERTICK, DEC);
}
else {
Serial.print(-(int)results->rawbuf[i]*USECPERTICK, DEC);
Serial.write('-');
Serial.print((unsigned long) results->rawbuf[i]*USECPERTICK, DEC);
}
Serial.print(" ");
}
Serial.println("");
Serial.println();
}
void loop() {
if (irrecv.decode(&results)) {
Serial.println(results.value, HEX);

View File

@@ -6,7 +6,7 @@
//------------------------------------------------------------------------------
// Tell IRremote which Arduino pin is connected to the IR Receiver (TSOP4838)
//
int recvPin = 6;
int recvPin = 11;
IRrecv irrecv(recvPin);
//+=============================================================================
@@ -90,12 +90,11 @@ void dumpRaw (decode_results *results)
{
// Print Raw data
Serial.print("Timing[");
Serial.print(results->rawlen, DEC);
Serial.print(results->rawlen-1, DEC);
Serial.println("]: ");
Serial.print(" -");
Serial.println(results->rawbuf[0] * USECPERTICK, DEC);
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
Serial.print("-");
if (x < 1000) Serial.print(" ") ;
@@ -107,9 +106,9 @@ void dumpRaw (decode_results *results)
if (x < 1000) Serial.print(" ") ;
if (x < 100) Serial.print(" ") ;
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
}
@@ -122,18 +121,18 @@ void dumpCode (decode_results *results)
// Start declaration
Serial.print("unsigned int "); // variable type
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
// Dump data
for (int i = 0; i < results->rawlen; i++) {
Serial.print(results->rawbuf[i], DEC);
Serial.print(",");
if (!(i&1)) Serial.print(" ");
for (int i = 1; i < results->rawlen; i++) {
Serial.print(results->rawbuf[i] * USECPERTICK, DEC);
if ( i < results->rawlen-1 ) Serial.print(","); // ',' not needed on last one
if (!(i & 1)) Serial.print(" ");
}
// End declaration
Serial.print("0};"); // Turn LED off at the end
Serial.print("};"); //
// Comment
Serial.print(" // ");
@@ -143,17 +142,17 @@ void dumpCode (decode_results *results)
// Newline
Serial.println("");
// Now dump "known" codes
if (results->decode_type != UNKNOWN) {
// Some protocols have an address
if (results->decode_type == PANASONIC) {
Serial.print("unsigned int addr = 0x");
Serial.print(results->address, HEX);
Serial.println(";");
}
// All protocols have data
Serial.print("unsigned int data = 0x");
Serial.print(results->value, HEX);
@@ -166,14 +165,13 @@ void dumpCode (decode_results *results)
//
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
dumpInfo(&results); // Output the results
dumpRaw(&results); // Output the results in RAW format
dumpCode(&results); // Output the results as source code
Serial.println(""); // Blank line between entries
irrecv.resume(); // Prepare for the next value
}
if (irrecv.decode(&results)) { // Grab an IR code
dumpInfo(&results); // Output the results
dumpRaw(&results); // Output the results in RAW format
dumpCode(&results); // Output the results as source code
Serial.println(""); // Blank line between entries
irrecv.resume(); // Prepare for the next value
}
}

View File

@@ -6,20 +6,19 @@
* http://arcfn.com
*/
#include <IRremote.h>
IRsend irsend;
void setup()
{
Serial.begin(9600);
}
void loop() {
if (Serial.read() != -1) {
for (int i = 0; i < 3; i++) {
irsend.sendSony(0xa90, 12); // Sony TV power code
delay(40);
}
}
for (int i = 0; i < 3; i++) {
irsend.sendSony(0xa90, 12);
delay(40);
}
delay(5000); //5 second delay between each signal burst
}

View 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.
}

View 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 ;
}

View 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

View File

@@ -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
}
}

View File

@@ -15,67 +15,67 @@ int IRrecv::decode (decode_results *results)
if (irparams.rcvstate != STATE_STOP) return false ;
#ifdef DECODE_NEC
#if DECODE_NEC
DBG_PRINTLN("Attempting NEC decode");
if (decodeNEC(results)) return true ;
#endif
#ifdef DECODE_SONY
#if DECODE_SONY
DBG_PRINTLN("Attempting Sony decode");
if (decodeSony(results)) return true ;
#endif
#ifdef DECODE_SANYO
#if DECODE_SANYO
DBG_PRINTLN("Attempting Sanyo decode");
if (decodeSanyo(results)) return true ;
#endif
#ifdef DECODE_MITSUBISHI
#if DECODE_MITSUBISHI
DBG_PRINTLN("Attempting Mitsubishi decode");
if (decodeMitsubishi(results)) return true ;
#endif
#ifdef DECODE_RC5
#if DECODE_RC5
DBG_PRINTLN("Attempting RC5 decode");
if (decodeRC5(results)) return true ;
#endif
#ifdef DECODE_RC6
#if DECODE_RC6
DBG_PRINTLN("Attempting RC6 decode");
if (decodeRC6(results)) return true ;
#endif
#ifdef DECODE_PANASONIC
#if DECODE_PANASONIC
DBG_PRINTLN("Attempting Panasonic decode");
if (decodePanasonic(results)) return true ;
#endif
#ifdef DECODE_LG
#if DECODE_LG
DBG_PRINTLN("Attempting LG decode");
if (decodeLG(results)) return true ;
#endif
#ifdef DECODE_JVC
#if DECODE_JVC
DBG_PRINTLN("Attempting JVC decode");
if (decodeJVC(results)) return true ;
#endif
#ifdef DECODE_SAMSUNG
#if DECODE_SAMSUNG
DBG_PRINTLN("Attempting SAMSUNG decode");
if (decodeSAMSUNG(results)) return true ;
#endif
#ifdef DECODE_WHYNTER
#if DECODE_WHYNTER
DBG_PRINTLN("Attempting Whynter decode");
if (decodeWhynter(results)) return true ;
#endif
#ifdef DECODE_AIWA_RC_T501
#if DECODE_AIWA_RC_T501
DBG_PRINTLN("Attempting Aiwa RC-T501 decode");
if (decodeAiwaRCT501(results)) return true ;
#endif
#ifdef DECODE_DENON
#if DECODE_DENON
DBG_PRINTLN("Attempting Denon decode");
if (decodeDenon(results)) return true ;
#endif
@@ -97,6 +97,16 @@ IRrecv::IRrecv (int recvpin)
irparams.blinkflag = 0;
}
IRrecv::IRrecv (int recvpin, int blinkpin)
{
irparams.recvpin = recvpin;
irparams.blinkpin = blinkpin;
pinMode(blinkpin, OUTPUT);
irparams.blinkflag = 0;
}
//+=============================================================================
// initialization
//
@@ -133,6 +143,13 @@ void IRrecv::blink13 (int blinkflag)
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
//

View File

@@ -1,66 +1,87 @@
#include "IRremote.h"
#include "IRremoteInt.h"
//+=============================================================================
void IRsend::sendRaw (unsigned int buf[], int len, int hz)
{
// Set IR carrier frequency
enableIROut(hz);
for (int i = 0; i < len; i++) {
if (i & 1) space(buf[i]) ;
else mark (buf[i]) ;
}
space(0); // Always end with the LED off
}
//+=============================================================================
// Sends an IR mark for the specified number of microseconds.
// The mark output is modulated at the PWM frequency.
//
void IRsend::mark (int time)
{
TIMER_ENABLE_PWM; // Enable pin 3 PWM output
if (time > 0) delayMicroseconds(time);
}
//+=============================================================================
// Leave pin off for time (given in microseconds)
// Sends an IR space for the specified number of microseconds.
// A space is no output, so the PWM output is disabled.
//
void IRsend::space (int time)
{
TIMER_DISABLE_PWM; // Disable pin 3 PWM output
if (time > 0) delayMicroseconds(time);
}
//+=============================================================================
// Enables IR output. The khz value controls the modulation frequency in kilohertz.
// The IR output will be on pin 3 (OC2B).
// This routine is designed for 36-40KHz; if you use it for other values, it's up to you
// to make sure it gives reasonable results. (Watch out for overflow / underflow / rounding.)
// TIMER2 is used in phase-correct PWM mode, with OCR2A controlling the frequency and OCR2B
// controlling the duty cycle.
// There is no prescaling, so the output frequency is 16MHz / (2 * OCR2A)
// To turn the output on and off, we leave the PWM running, but connect and disconnect the output pin.
// A few hours staring at the ATmega documentation and this will all make sense.
// See my Secrets of Arduino PWM at http://arcfn.com/2009/07/secrets-of-arduino-pwm.html for details.
//
void IRsend::enableIROut (int khz)
{
// Disable the Timer2 Interrupt (which is used for receiving IR)
TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
pinMode(TIMER_PWM_PIN, OUTPUT);
digitalWrite(TIMER_PWM_PIN, LOW); // When not sending PWM, we want it low
// COM2A = 00: disconnect OC2A
// COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
// WGM2 = 101: phase-correct PWM with OCRA as top
// CS2 = 000: no prescaling
// The top value for the timer. The modulation frequency will be SYSCLOCK / 2 / OCR2A.
TIMER_CONFIG_KHZ(khz);
}
#include "IRremote.h"
#include "IRremoteInt.h"
//+=============================================================================
void IRsend::sendRaw (unsigned int buf[], unsigned int len, unsigned int hz)
{
// Set IR carrier frequency
enableIROut(hz);
for (unsigned int i = 0; i < len; i++) {
if (i & 1) space(buf[i]) ;
else mark (buf[i]) ;
}
space(0); // Always end with the LED off
}
//+=============================================================================
// Sends an IR mark for the specified number of microseconds.
// The mark output is modulated at the PWM frequency.
//
void IRsend::mark (unsigned int time)
{
TIMER_ENABLE_PWM; // Enable pin 3 PWM output
if (time > 0) custom_delay_usec(time);
}
//+=============================================================================
// Leave pin off for time (given in microseconds)
// Sends an IR space for the specified number of microseconds.
// A space is no output, so the PWM output is disabled.
//
void IRsend::space (unsigned int time)
{
TIMER_DISABLE_PWM; // Disable pin 3 PWM output
if (time > 0) IRsend::custom_delay_usec(time);
}
//+=============================================================================
// Enables IR output. The khz value controls the modulation frequency in kilohertz.
// The IR output will be on pin 3 (OC2B).
// This routine is designed for 36-40KHz; if you use it for other values, it's up to you
// to make sure it gives reasonable results. (Watch out for overflow / underflow / rounding.)
// TIMER2 is used in phase-correct PWM mode, with OCR2A controlling the frequency and OCR2B
// controlling the duty cycle.
// There is no prescaling, so the output frequency is 16MHz / (2 * OCR2A)
// To turn the output on and off, we leave the PWM running, but connect and disconnect the output pin.
// A few hours staring at the ATmega documentation and this will all make sense.
// See my Secrets of Arduino PWM at http://arcfn.com/2009/07/secrets-of-arduino-pwm.html for details.
//
void IRsend::enableIROut (int khz)
{
// Disable the Timer2 Interrupt (which is used for receiving IR)
TIMER_DISABLE_INTR; //Timer2 Overflow Interrupt
pinMode(TIMER_PWM_PIN, OUTPUT);
digitalWrite(TIMER_PWM_PIN, LOW); // When not sending PWM, we want it low
// COM2A = 00: disconnect OC2A
// COM2B = 00: disconnect OC2B; to send signal set to 10: OC2B non-inverted
// WGM2 = 101: phase-correct PWM with OCRA as top
// CS2 = 000: no prescaling
// The top value for the timer. The modulation frequency will be SYSCLOCK / 2 / OCR2A.
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
//}
}

View File

@@ -9,7 +9,7 @@
// 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
#define AIWA_RC_T501_HZ 38
@@ -28,7 +28,6 @@
void IRsend::sendAiwaRCT501 (int code)
{
unsigned long pre = 0x0227EEC0; // 26-bits
int mask;
// Set IR carrier frequency
enableIROut(AIWA_RC_T501_HZ);

View File

@@ -52,3 +52,29 @@ bool IRrecv::decodeLG (decode_results *results)
}
#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

View File

@@ -10,6 +10,7 @@
// t1 is the time interval for a single bit in microseconds.
// 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 width;
@@ -37,6 +38,7 @@ int IRrecv::getRClevel (decode_results *results, int *offset, int *used, int
return val;
}
#endif
//==============================================================================
// RRRR CCCC 55555

View File

@@ -32,7 +32,6 @@ sendSharpRaw KEYWORD2
sendPanasonic KEYWORD2
sendJVC KEYWORD2
#
#######################################
# Constants (LITERAL1)
#######################################

View File

@@ -1,5 +1,5 @@
name=IRremote
version=1.0
version=2.0.1
author=shirriff
maintainer=shirriff
sentence=Send and receive infrared signals with multiple protocols