TinyReceiver 2.0
This commit is contained in:
parent
8c84e03318
commit
f80a7df244
|
@ -1,7 +1,7 @@
|
|||
# https://github.com/Arduino-IRremote/Arduino-IRremote/blob/master/.github/workflows/LibraryBuild.yml
|
||||
# Github workflow script to test compile all examples of an Arduino library repository.
|
||||
#
|
||||
# Copyright (C) 2020 Armin Joachimsmeyer
|
||||
# Copyright (C) 2020-2023 Armin Joachimsmeyer
|
||||
# https://github.com/ArminJo/Github-Actions
|
||||
#
|
||||
# Before being able to push to my .github\workflows directories,
|
||||
|
@ -86,6 +86,7 @@ jobs:
|
|||
- arduino-boards-fqbn: arduino:avr:uno|DEBUG
|
||||
build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
IRremoteExtensionTest: -DRAW_BUFFER_LENGTH=100 -DIR_SEND_PIN=3
|
||||
TinyReceiver: -DUSE_CALLBACK_FOR_TINY_RECEIVER
|
||||
All: -DEBUG
|
||||
|
||||
- arduino-boards-fqbn: arduino:avr:uno|USE_NO_SEND_PWM
|
||||
|
@ -131,7 +132,7 @@ jobs:
|
|||
build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
IRremoteExtensionTest: -DRAW_BUFFER_LENGTH=100
|
||||
SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
TinyReceiver: -DUSE_ONKYO_PROTOCOL -DENABLE_NEC2_REPEATS -DNO_LED_FEEDBACK_CODE
|
||||
TinyReceiver: -DUSE_ONKYO_PROTOCOL -DENABLE_NEC2_REPEATS -DNO_LED_FEEDBACK_CODE -DUSE_CALLBACK_FOR_TINY_RECEIVER
|
||||
TinySender: -DUSE_ONKYO_PROTOCOL -DENABLE_NEC2_REPEATS -DNO_LED_FEEDBACK_CODE
|
||||
|
||||
- arduino-boards-fqbn: arduino:samd:arduino_zero_native
|
||||
|
@ -155,6 +156,9 @@ jobs:
|
|||
IRremoteExtensionTest: -DRAW_BUFFER_LENGTH=100
|
||||
SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
|
||||
#
|
||||
# RP2040
|
||||
#
|
||||
- arduino-boards-fqbn: arduino:mbed_rp2040:pico
|
||||
build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
IRremoteExtensionTest: -DRAW_BUFFER_LENGTH=100
|
||||
|
@ -167,6 +171,9 @@ jobs:
|
|||
SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
All: -DRAW_BUFFER_LENGTH=700
|
||||
|
||||
#
|
||||
# megaTinyCore
|
||||
#
|
||||
# https://github.com/SpenceKonde/megaTinyCore/issues/935
|
||||
# - arduino-boards-fqbn: megaTinyCore:megaavr:atxy4:chip=1604,clock=16internal
|
||||
# arduino-platform: megaTinyCore:megaavr
|
||||
|
@ -183,27 +190,33 @@ jobs:
|
|||
# build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
# IRremoteExtensionTest: -DRAW_BUFFER_LENGTH=100
|
||||
|
||||
- arduino-boards-fqbn: ATTinyCore:avr:attinyx5micr:LTO=enable,sketchclock=16pll
|
||||
platform-url: http://drazzy.com/package_drazzy.com_index.json
|
||||
required-libraries: ATtinySerialOut
|
||||
sketch-names: TinyReceiver.ino,IRremoteInfo.ino,SimpleReceiver.ino,ReceiveDemo.ino,ControlRelay.ino,SimpleSender.ino,SendDemo.ino,SendRawDemo.ino,SendAndReceive.ino
|
||||
build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
#
|
||||
# ATTinyCore
|
||||
#
|
||||
# - arduino-boards-fqbn: ATTinyCore:avr:attinyx5micr:LTO=enable,sketchclock=16pll
|
||||
# platform-url: http://drazzy.com/package_drazzy.com_index.json
|
||||
# required-libraries: ATtinySerialOut
|
||||
# sketch-names: TinyReceiver.ino,IRremoteInfo.ino,SimpleReceiver.ino,ReceiveDemo.ino,ControlRelay.ino,SimpleSender.ino,SendDemo.ino,SendRawDemo.ino,SendAndReceive.ino
|
||||
# build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
# SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
|
||||
- arduino-boards-fqbn: ATTinyCore:avr:attinyx7micr:LTO=enable,sketchclock=16external,pinmapping=new,millis=enabled
|
||||
platform-url: http://drazzy.com/package_drazzy.com_index.json
|
||||
required-libraries: ATtinySerialOut
|
||||
sketch-names: TinyReceiver.ino,IRremoteInfo.ino,SimpleReceiver.ino,ReceiveDemo.ino,ControlRelay.ino,SimpleSender.ino,SendDemo.ino,SendRawDemo.ino,SendAndReceive.ino
|
||||
build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
# - arduino-boards-fqbn: ATTinyCore:avr:attinyx7micr:LTO=enable,sketchclock=16external,pinmapping=new,millis=enabled
|
||||
# platform-url: http://drazzy.com/package_drazzy.com_index.json
|
||||
# required-libraries: ATtinySerialOut
|
||||
# sketch-names: TinyReceiver.ino,IRremoteInfo.ino,SimpleReceiver.ino,ReceiveDemo.ino,ControlRelay.ino,SimpleSender.ino,SendDemo.ino,SendRawDemo.ino,SendAndReceive.ino
|
||||
# build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
# SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
|
||||
- arduino-boards-fqbn: ATTinyCore:avr:attinyx8micr:LTO=enable,sketchclock=16external,pinmapping=mhtiny,millis=enabled # ATtiny88 China clone board @16 MHz
|
||||
platform-url: http://drazzy.com/package_drazzy.com_index.json
|
||||
required-libraries: ATtinySerialOut
|
||||
sketch-names: TinyReceiver.ino,IRremoteInfo.ino,SimpleReceiver.ino,ReceiveDemo.ino,ControlRelay.ino,SimpleSender.ino,SendDemo.ino,SendRawDemo.ino,SendAndReceive.ino
|
||||
build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
# - arduino-boards-fqbn: ATTinyCore:avr:attinyx8micr:LTO=enable,sketchclock=16external,pinmapping=mhtiny,millis=enabled # ATtiny88 China clone board @16 MHz
|
||||
# platform-url: http://drazzy.com/package_drazzy.com_index.json
|
||||
# required-libraries: ATtinySerialOut
|
||||
# sketch-names: TinyReceiver.ino,IRremoteInfo.ino,SimpleReceiver.ino,ReceiveDemo.ino,ControlRelay.ino,SimpleSender.ino,SendDemo.ino,SendRawDemo.ino,SendAndReceive.ino
|
||||
# build-properties: # the flags were put in compiler.cpp.extra_flags
|
||||
# SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
|
||||
#
|
||||
# MegaCore
|
||||
#
|
||||
- arduino-boards-fqbn: MegaCore:avr:128:bootloader=no_bootloader,eeprom=keep,BOD=2v7,LTO=Os_flto,clock=8MHz_internal
|
||||
platform-url: https://mcudude.github.io/MegaCore/package_MCUdude_MegaCore_index.json
|
||||
arduino-platform: arduino:avr,MegaCore:avr # gcc is taken from arduino:avr
|
||||
|
@ -212,6 +225,9 @@ jobs:
|
|||
SimpleSender: -DSEND_PWM_BY_TIMER
|
||||
All: -DRAW_BUFFER_LENGTH=700
|
||||
|
||||
#
|
||||
# ESP
|
||||
#
|
||||
- arduino-boards-fqbn: esp8266:esp8266:d1_mini:eesz=4M3M,xtal=80
|
||||
platform-url: https://arduino.esp8266.com/stable/package_esp8266com_index.json
|
||||
sketches-exclude: TinyReceiver
|
||||
|
@ -226,6 +242,9 @@ jobs:
|
|||
IRremoteExtensionTest: -DRAW_BUFFER_LENGTH=500 -Wno-error=maybe-uninitialized
|
||||
All: -DRAW_BUFFER_LENGTH=300 -Wno-error=maybe-uninitialized # https://github.com/espressif/arduino-esp32/issues/7024
|
||||
|
||||
#
|
||||
# STM
|
||||
#
|
||||
- arduino-boards-fqbn: STMicroelectronics:stm32:GenF1:pnum=BLUEPILL_F103C8 # ST version
|
||||
platform-url: https://raw.githubusercontent.com/stm32duino/BoardManagerFiles/main/package_stmicroelectronics_index.json
|
||||
sketches-exclude: TinyReceiver
|
||||
|
@ -247,6 +266,9 @@ jobs:
|
|||
IRremoteExtensionTest: -DRAW_BUFFER_LENGTH=700
|
||||
All: -DRAW_BUFFER_LENGTH=300
|
||||
|
||||
#
|
||||
# Others
|
||||
#
|
||||
- arduino-boards-fqbn: SparkFun:avr:promicro
|
||||
arduino-platform: arduino:avr,SparkFun:avr
|
||||
platform-url: https://raw.githubusercontent.com/sparkfun/Arduino_Boards/master/IDE_Board_Manager/package_sparkfun_index.json # Arduino URL is not required here
|
||||
|
|
29
README.md
29
README.md
|
@ -38,8 +38,9 @@ Available as [Arduino library "IRremote"](https://www.arduinolibraries.info/libr
|
|||
- [Why *.hpp instead of *.cpp](https://github.com/Arduino-IRremote/Arduino-IRremote#why-hpp-instead-of-cpp)
|
||||
- [Using the new *.hpp files](https://github.com/Arduino-IRremote/Arduino-IRremote#using-the-new-hpp-files)
|
||||
- [Receiving IR codes](https://github.com/Arduino-IRremote/Arduino-IRremote#receiving-ir-codes)
|
||||
* [Data format](https://github.com/Arduino-IRremote/Arduino-IRremote#data-format)
|
||||
* [decodedIRData structure](https://github.com/Arduino-IRremote/Arduino-IRremote#decodedirdata-structure)
|
||||
* [Ambiguous protocols](https://github.com/Arduino-IRremote/Arduino-IRremote#ambiguous-protocols)
|
||||
* [Unknown protocol](https://github.com/Arduino-IRremote/Arduino-IRremote#unknown-protocol)
|
||||
- [Sending IR codes](https://github.com/Arduino-IRremote/Arduino-IRremote#sending-ir-codes)
|
||||
* [Send pin](https://github.com/Arduino-IRremote/Arduino-IRremote#send-pin)
|
||||
+ [List of public IR code databases](https://github.com/Arduino-IRremote/Arduino-IRremote#list-of-public-ir-code-databases)
|
||||
|
@ -141,8 +142,8 @@ If you use an (old) Arduino core that does not use the `-flto` flag for compile,
|
|||
- Since the decoded values are now in `IrReceiver.decodedIRData` and not in `results` any more, remove the line `decode_results results` or similar.
|
||||
- Like for the Serial object, call [`IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK)`](https://github.com/Arduino-IRremote/Arduino-IRremote/blob/master/examples/ReceiveDemo/ReceiveDemo.ino#L106)
|
||||
or `IrReceiver.begin(IR_RECEIVE_PIN, DISABLE_LED_FEEDBACK)` instead of the `IrReceiver.enableIRIn()` or `irrecv.enableIRIn()` in setup().<br/>
|
||||
For sending, call `IrSender.begin(ENABLE_LED_FEEDBACK);` or `IrSender.begin(DISABLE_LED_FEEDBACK);` in setup().<br/>
|
||||
If IR_SEND_PIN is not defined you must use e.g. `IrSender.begin(3, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);`
|
||||
For sending, call `IrSender.begin();` or `IrSender.begin(DISABLE_LED_FEEDBACK);` in setup().<br/>
|
||||
If IR_SEND_PIN is not defined (before the line `#include <IRremote.hpp>`) you must use e.g. `IrSender.begin(3, ENABLE_LED_FEEDBACK, USE_DEFAULT_FEEDBACK_LED_PIN);`
|
||||
- Old `decode(decode_results *aResults)` function is replaced by simple `decode()`. So if you have a statement `if(irrecv.decode(&results))` replace it with `if (IrReceiver.decode())`.
|
||||
- The decoded result is now in in `IrReceiver.decodedIRData` and not in `results` any more, therefore replace any occurrences of `results.value` and `results.decode_type` (and similar) to
|
||||
`IrReceiver.decodedIRData.decodedRawData` and `IrReceiver.decodedIRData.protocol`.
|
||||
|
@ -287,13 +288,12 @@ The following macros will definitely be overridden with default values otherwise
|
|||
<br/>
|
||||
|
||||
# Receiving IR codes
|
||||
Check for **received data** with:<br/>
|
||||
Check for a **completly received IR frame** with:<br/>
|
||||
`if (IrReceiver.decode()) {}`<br/>
|
||||
This also decodes the received data.
|
||||
|
||||
## Data format
|
||||
This also decodes the received data.<br/>
|
||||
After successful decoding, the IR data is contained in the IRData structure, available as `IrReceiver.decodedIRData`.
|
||||
|
||||
## decodedIRData structure
|
||||
```c++
|
||||
struct IRData {
|
||||
decode_type_t protocol; // UNKNOWN, NEC, SONY, RC5, PULSE_DISTANCE, ...
|
||||
|
@ -368,6 +368,9 @@ This behavior is quite unique for NEC and its derived protocols like LG.
|
|||
So there are of course also remote control systems, which uses the NEC protocol but on a long press just repeat the first frame instead of sending the special short repeat frame. We named this the **NEC2** protocol and it is sent with `sendNEC2()`.<br/>
|
||||
But be careful, the NEC2 protocol can only be detected by the NEC library decoder **after** the first frame and if you do a long press!
|
||||
|
||||
## Unknown protocol
|
||||
If your protocol seems not to be supported by this library, you may try the [IRMP library](https://github.com/IRMP-org/IRMP).
|
||||
|
||||
<br/>
|
||||
|
||||
# Sending IR codes
|
||||
|
@ -417,12 +420,11 @@ void setup() {
|
|||
initPCIInterruptForTinyReceiver(); // Enables the interrupt generation on change of IR input signal
|
||||
}
|
||||
|
||||
void loop() {}
|
||||
|
||||
// This is the function, which is called if a complete command was received
|
||||
// It runs in an ISR context with interrupts enabled, so functions like delay() etc. should work here
|
||||
void handleReceivedTinyIRData(uint8_t aAddress, uint8_t aCommand, uint8_t aFlags) {
|
||||
printTinyReceiverResultMinimal(&Serial, aAddress, aCommand, aFlags);
|
||||
void loop() {
|
||||
if (TinyIRReceiverData.justWritten) {
|
||||
TinyIRReceiverData.justWritten = false;
|
||||
printTinyReceiverResultMinimal(&Serial);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
|
@ -702,6 +704,7 @@ These next macros for **TinyIRReceiver** must be defined in your program before
|
|||
| `USE_ONKYO_PROTOCOL` | disabled | Like NEC, but take the 16 bit address and command each as one 16 bit value and not as 8 bit normal and 8 bit inverted value. |
|
||||
| `USE_FAST_PROTOCOL` | disabled | Use FAST protocol (no address and 16 bit data, interpreted as 8 bit command and 8 bit inverted command) instead of NEC. |
|
||||
| `ENABLE_NEC2_REPEATS` | disabled | Instead of sending / receiving the NEC special repeat code, send / receive the original frame for repeat. |
|
||||
| `USE_CALLBACK_FOR_TINY_RECEIVER` | disabled | Call the fixed function `void handleReceivedTinyIRData()` each time a frame or repeat is received. |
|
||||
|
||||
The next macro for **IRCommandDispatcher** must be defined in your program before the line `#include <IRCommandDispatcher.hpp>` to take effect.
|
||||
| `IR_COMMAND_HAS_MORE_THAN_8_BIT` | disabled | Enables mapping and dispatching of IR commands consisting of more than 8 bits. Saves up to 160 bytes program memory and 4 bytes RAM + 1 byte RAM per mapping entry. |
|
||||
|
|
|
@ -4,6 +4,10 @@ See also the commit log at github: https://github.com/Arduino-IRremote/Arduino-I
|
|||
|
||||
# 4.2.1
|
||||
- Fix wrong type of tEnableLEDFeedback in IRSend.hpp and IRReceive.hpp.
|
||||
- TinyReceiver 2.0
|
||||
- New TinyIRReceiverData which is filled with address, command and flags.
|
||||
- Removed parameters address, command and flags from callback handleReceivedTinyIRData() and printTinyReceiverResultMinimal().
|
||||
- Callback function now only enabled if USE_CALLBACK_FOR_TINY_RECEIVER is activated.
|
||||
|
||||
# 4.2.0
|
||||
- The old decode function is renamed to decode_old(decode_results *aResults). decode (decode_results *aResults) is only available in IRremote.h and prints a message.
|
||||
|
|
|
@ -0,0 +1,345 @@
|
|||
/*
|
||||
* PinDefinitionsAndMore.h
|
||||
*
|
||||
* Contains pin definitions for IRremote examples for various platforms
|
||||
* as well as definitions for feedback LED and tone() and includes
|
||||
*
|
||||
* Copyright (C) 2021-2023 Armin Joachimsmeyer
|
||||
* armin.joachimsmeyer@gmail.com
|
||||
*
|
||||
* This file is part of IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
|
||||
*
|
||||
* Arduino-IRremote is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/gpl.html>.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Pin mapping table for different platforms
|
||||
*
|
||||
* Platform IR input IR output Tone Core/Pin schema
|
||||
* --------------------------------------------------------------
|
||||
* DEFAULT/AVR 2 3 4 Arduino
|
||||
* ATtinyX5 0|PB0 4|PB4 3|PB3 ATTinyCore
|
||||
* ATtiny167 3|PA3 2|PA2 7|PA7 ATTinyCore
|
||||
* ATtiny167 9|PA3 8|PA2 5|PA7 Digispark original core
|
||||
* ATtiny84 |PB2 |PA4 |PA3 ATTinyCore
|
||||
* ATtiny88 3|PD3 4|PD4 9|PB1 ATTinyCore
|
||||
* ATtiny3217 18|PA1 19|PA2 20|PA3 MegaTinyCore
|
||||
* ATtiny1604 2 3|PA5 %
|
||||
* ATtiny816 14|PA1 16|PA3 1|PA5 MegaTinyCore
|
||||
* ATtiny1614 8|PA1 10|PA3 1|PA5 MegaTinyCore
|
||||
* SAMD21 3 4 5
|
||||
* ESP8266 14|D5 12|D6 %
|
||||
* ESP32 15 4 27
|
||||
* BluePill PA6 PA7 PA3
|
||||
* APOLLO3 11 12 5
|
||||
* RP2040 3|GPIO15 4|GPIO16 5|GPIO17
|
||||
*/
|
||||
//#define _IR_MEASURE_TIMING // For debugging purposes.
|
||||
|
||||
#if defined(__AVR__)
|
||||
#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) // Digispark board. For use with ATTinyCore.
|
||||
#include "ATtinySerialOut.hpp" // TX is at pin 2 - Available as Arduino library "ATtinySerialOut". Saves 700 bytes program memory and 70 bytes RAM for ATtinyCore.
|
||||
#define IR_RECEIVE_PIN PIN_PB0
|
||||
#define IR_SEND_PIN PIN_PB4 // Pin 2 is serial output with ATtinySerialOut. Pin 1 is internal LED and Pin3 is USB+ with pullup on Digispark board.
|
||||
#define TONE_PIN PIN_PB3
|
||||
#define _IR_TIMING_TEST_PIN PIN_PB3
|
||||
|
||||
# elif defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__) // Digispark pro board
|
||||
#include "ATtinySerialOut.hpp" // Available as Arduino library "ATtinySerialOut"
|
||||
// For ATtiny167 Pins PB6 and PA3 are usable as interrupt source.
|
||||
# if defined(ARDUINO_AVR_DIGISPARKPRO)
|
||||
// For use with Digispark original core
|
||||
#define IR_RECEIVE_PIN 9 // PA3 - on Digispark board labeled as pin 9
|
||||
//#define IR_RECEIVE_PIN 14 // PB6 / INT0 is connected to USB+ on DigisparkPro boards
|
||||
#define IR_SEND_PIN 8 // PA2 - on Digispark board labeled as pin 8
|
||||
#define TONE_PIN 5 // PA7 - on Digispark board labeled as pin 5
|
||||
#define _IR_TIMING_TEST_PIN 10 // PA4
|
||||
# else
|
||||
// For use with ATTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA3 // On Digispark board labeled as pin 9 - INT0 is connected to USB+ on DigisparkPro boards
|
||||
#define IR_SEND_PIN PIN_PA2 // On Digispark board labeled as pin 8
|
||||
#define TONE_PIN PIN_PA7 // On Digispark board labeled as pin 5
|
||||
# endif
|
||||
|
||||
# elif defined(__AVR_ATtiny84__) // For use with ATTinyCore
|
||||
#include "ATtinySerialOut.hpp" // Available as Arduino library "ATtinySerialOut". Saves 128 bytes program memory.
|
||||
#define IR_RECEIVE_PIN PIN_PB2 // INT0
|
||||
#define IR_SEND_PIN PIN_PA4
|
||||
#define TONE_PIN PIN_PA3
|
||||
#define _IR_TIMING_TEST_PIN PIN_PA5
|
||||
|
||||
# elif defined(__AVR_ATtiny88__) // MH-ET Tiny88 board. For use with ATTinyCore.
|
||||
#include "ATtinySerialOut.hpp" // Available as Arduino library "ATtinySerialOut". Saves 128 bytes program memory.
|
||||
// Pin 6 is TX, pin 7 is RX
|
||||
#define IR_RECEIVE_PIN PIN_PD3 // 3 - INT1
|
||||
#define IR_SEND_PIN PIN_PD4 // 4
|
||||
#define TONE_PIN PIN_PB1 // 9
|
||||
#define _IR_TIMING_TEST_PIN PIN_PB0 // 8
|
||||
|
||||
# elif defined(__AVR_ATtiny1616__) || defined(__AVR_ATtiny3216__) || defined(__AVR_ATtiny3217__) // For use with megaTinyCore
|
||||
// Tiny Core Dev board
|
||||
// https://www.tindie.com/products/xkimi/tiny-core-16-dev-board-attiny1616/
|
||||
// https://www.tindie.com/products/xkimi/tiny-core-32-dev-board-attiny3217/
|
||||
#define IR_RECEIVE_PIN PIN_PA1 // use 18 for TinyCore32
|
||||
#define IR_SEND_PIN PIN_PA2 // 19
|
||||
#define TONE_PIN PIN_PA3 // 20
|
||||
#define APPLICATION_PIN PIN_PA0 // 0
|
||||
#undef LED_BUILTIN // No LED available on the TinyCore 32 board, take the one on the programming board which is connected to the DAC output
|
||||
#define LED_BUILTIN PIN_PA6 // use 2 for TinyCore32
|
||||
|
||||
# elif defined(__AVR_ATtiny816__) // For use with megaTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA1 // 14
|
||||
#define IR_SEND_PIN PIN_PA1 // 16
|
||||
#define TONE_PIN PIN_PA5 // 1
|
||||
#define APPLICATION_PIN PIN_PA4 // 0
|
||||
#undef LED_BUILTIN // No LED available, take the one which is connected to the DAC output
|
||||
#define LED_BUILTIN PIN_PB5 // 4
|
||||
|
||||
# elif defined(__AVR_ATtiny1614__) // For use with megaTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA1 // 8
|
||||
#define IR_SEND_PIN PIN_PA3 // 10
|
||||
#define TONE_PIN PIN_PA5 // 1
|
||||
#define APPLICATION_PIN PIN_PA4 // 0
|
||||
|
||||
# elif defined(__AVR_ATtiny1604__) // For use with megaTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA6 // 2 - To be compatible with interrupt example, pin 2 is chosen here.
|
||||
#define IR_SEND_PIN PIN_PA7 // 3
|
||||
#define APPLICATION_PIN PIN_PB2 // 5
|
||||
|
||||
#define tone(...) void() // Define as void, since TCB0_INT_vect is also used by tone()
|
||||
#define noTone(a) void()
|
||||
#define TONE_PIN 42 // Dummy for examples using it
|
||||
|
||||
# elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__) || defined(__AVR_ATmega32__) \
|
||||
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__) \
|
||||
|| defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) \
|
||||
|| defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) \
|
||||
|| defined(__AVR_ATmega8515__) || defined(__AVR_ATmega162__)
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 13
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
# else // Default as for ATmega328 like on Uno, Nano, Leonardo, Teensy 2.0 etc.
|
||||
#define IR_RECEIVE_PIN 2 // To be compatible with interrupt example, pin 2 is chosen here.
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
# if defined(ARDUINO_AVR_PROMICRO) // Sparkfun Pro Micro is __AVR_ATmega32U4__ but has different external circuit
|
||||
// We have no built in LED at pin 13 -> reuse RX LED
|
||||
#undef LED_BUILTIN
|
||||
#define LED_BUILTIN LED_BUILTIN_RX
|
||||
# endif
|
||||
# endif // defined(__AVR_ATtiny25__)...
|
||||
|
||||
#elif defined(ARDUINO_ARCH_RENESAS_UNO) // Uno R4
|
||||
// To be compatible with Uno R3.
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#elif defined(ESP8266)
|
||||
#define FEEDBACK_LED_IS_ACTIVE_LOW // The LED on my board (D4) is active LOW
|
||||
#define IR_RECEIVE_PIN 14 // D5
|
||||
#define IR_SEND_PIN 12 // D6 - D4/pin 2 is internal LED
|
||||
#define _IR_TIMING_TEST_PIN 2 // D4
|
||||
#define APPLICATION_PIN 13 // D7
|
||||
|
||||
#define tone(...) void() // tone() inhibits receive timer
|
||||
#define noTone(a) void()
|
||||
#define TONE_PIN 42 // Dummy for examples using it
|
||||
|
||||
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||
#define IR_RECEIVE_PIN 8
|
||||
#define IR_SEND_PIN 9
|
||||
#define TONE_PIN 10 // ADC2_0
|
||||
#define APPLICATION_PIN 11
|
||||
|
||||
#elif defined(ESP32)
|
||||
#include <Arduino.h>
|
||||
|
||||
// tone() is included in ESP32 core since 2.0.2
|
||||
#if !defined(ESP_ARDUINO_VERSION_VAL)
|
||||
#define ESP_ARDUINO_VERSION_VAL(major, minor, patch) 12345678
|
||||
#endif
|
||||
#if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2, 0, 2)
|
||||
#define TONE_LEDC_CHANNEL 1 // Using channel 1 makes tone() independent of receiving timer -> No need to stop receiving timer.
|
||||
void tone(uint8_t aPinNumber, unsigned int aFrequency){
|
||||
ledcAttachPin(aPinNumber, TONE_LEDC_CHANNEL);
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, aFrequency);
|
||||
}
|
||||
void tone(uint8_t aPinNumber, unsigned int aFrequency, unsigned long aDuration){
|
||||
ledcAttachPin(aPinNumber, TONE_LEDC_CHANNEL);
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, aFrequency);
|
||||
delay(aDuration);
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, 0);
|
||||
}
|
||||
void noTone(uint8_t aPinNumber){
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, 0);
|
||||
}
|
||||
#endif // ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2, 0, 2)
|
||||
|
||||
#define IR_RECEIVE_PIN 15 // D15
|
||||
#define IR_SEND_PIN 4 // D4
|
||||
#define TONE_PIN 27 // D27 25 & 26 are DAC0 and 1
|
||||
#define APPLICATION_PIN 16 // RX2 pin
|
||||
|
||||
#elif defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_STM32F1) // BluePill
|
||||
// Timer 3 blocks PA6, PA7, PB0, PB1 for use by Servo or tone()
|
||||
#define IR_RECEIVE_PIN PA6
|
||||
#define IR_RECEIVE_PIN_STRING "PA6"
|
||||
#define IR_SEND_PIN PA7
|
||||
#define IR_SEND_PIN_STRING "PA7"
|
||||
#define TONE_PIN PA3
|
||||
#define _IR_TIMING_TEST_PIN PA5
|
||||
#define APPLICATION_PIN PA2
|
||||
#define APPLICATION_PIN_STRING "PA2"
|
||||
# if defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_BLUEPILL_F103C8)
|
||||
// BluePill LED is active low
|
||||
#define FEEDBACK_LED_IS_ACTIVE_LOW
|
||||
# endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_APOLLO3) // Sparkfun Apollo boards
|
||||
#define IR_RECEIVE_PIN 11
|
||||
#define IR_SEND_PIN 12
|
||||
#define TONE_PIN 5
|
||||
|
||||
#elif defined(ARDUINO_ARCH_MBED) && defined(ARDUINO_ARCH_MBED_NANO) // Arduino Nano 33 BLE
|
||||
#define IR_RECEIVE_PIN 3 // GPIO15 Start with pin 3 since pin 2|GPIO25 is connected to LED on Pi pico
|
||||
#define IR_SEND_PIN 4 // GPIO16
|
||||
#define TONE_PIN 5
|
||||
#define APPLICATION_PIN 6
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 7 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 8
|
||||
|
||||
#elif defined(ARDUINO_ARCH_RP2040) // Arduino Nano Connect, Pi Pico with arduino-pico core https://github.com/earlephilhower/arduino-pico
|
||||
#define IR_RECEIVE_PIN 15 // GPIO15 to be compatible with the Arduino Nano RP2040 Connect (pin3)
|
||||
#define IR_SEND_PIN 16 // GPIO16
|
||||
#define TONE_PIN 17
|
||||
#define APPLICATION_PIN 18
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 19 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 20
|
||||
|
||||
// If you program the Nano RP2040 Connect with this core, then you must redefine LED_BUILTIN
|
||||
// and use the external reset with 1 kOhm to ground to enter UF2 mode
|
||||
#undef LED_BUILTIN
|
||||
#define LED_BUILTIN 6
|
||||
|
||||
#elif defined(PARTICLE) // !!!UNTESTED!!!
|
||||
#define IR_RECEIVE_PIN A4
|
||||
#define IR_SEND_PIN A5 // Particle supports multiple pins
|
||||
|
||||
#define LED_BUILTIN D7
|
||||
|
||||
/*
|
||||
* 4 times the same (default) layout for easy adaption in the future
|
||||
*/
|
||||
#elif defined(TEENSYDUINO) // Teensy 2.0 is handled at default for ATmega328 like on Uno, Nano, Leonardo etc.
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#elif defined(ARDUINO_ARCH_MBED) // Arduino Nano 33 BLE
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM)
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#if !defined(ARDUINO_SAMD_ADAFRUIT) && !defined(ARDUINO_SEEED_XIAO_M0)
|
||||
// On the Zero and others we switch explicitly to SerialUSB
|
||||
#define Serial SerialUSB
|
||||
#endif
|
||||
|
||||
// Definitions for the Chinese SAMD21 M0-Mini clone, which has no led connected to D13/PA17.
|
||||
// Attention!!! D2 and D4 are swapped on these boards!!!
|
||||
// If you connect the LED, it is on pin 24/PB11. In this case activate the next two lines.
|
||||
//#undef LED_BUILTIN
|
||||
//#define LED_BUILTIN 24 // PB11
|
||||
// As an alternative you can choose pin 25, it is the RX-LED pin (PB03), but active low.In this case activate the next 3 lines.
|
||||
//#undef LED_BUILTIN
|
||||
//#define LED_BUILTIN 25 // PB03
|
||||
//#define FEEDBACK_LED_IS_ACTIVE_LOW // The RX LED on the M0-Mini is active LOW
|
||||
|
||||
#elif defined (NRF51) // BBC micro:bit
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define APPLICATION_PIN 1
|
||||
#define _IR_TIMING_TEST_PIN 4
|
||||
|
||||
#define tone(...) void() // no tone() available
|
||||
#define noTone(a) void()
|
||||
#define TONE_PIN 42 // Dummy for examples using it
|
||||
|
||||
#else
|
||||
#warning Board / CPU is not detected using pre-processor symbols -> using default values, which may not fit. Please extend PinDefinitionsAndMore.h.
|
||||
// Default valued for unidentified boards
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
#endif // defined(ESP8266)
|
||||
|
||||
#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040) || defined(PARTICLE) || defined(ARDUINO_ARCH_MBED)
|
||||
#define SEND_PWM_BY_TIMER // We do not have pin restrictions for this CPU's, so lets use the hardware PWM for send carrier signal generation
|
||||
#else
|
||||
# if defined(SEND_PWM_BY_TIMER)
|
||||
#undef IR_SEND_PIN // SendPin is determined by timer! This avoids warning in IRTimer.hpp
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined (FLASHEND)
|
||||
#define FLASHEND 0xFFFF // Dummy value for platforms where FLASHEND is not defined
|
||||
#endif
|
||||
#if !defined (RAMEND)
|
||||
#define RAMEND 0xFFFF // Dummy value for platforms where RAMEND is not defined
|
||||
#endif
|
||||
#if !defined (RAMSIZE)
|
||||
#define RAMSIZE 0xFFFF // Dummy value for platforms where RAMSIZE is not defined
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Helper macro for getting a macro definition as string
|
||||
*/
|
||||
#if !defined(STR_HELPER)
|
||||
#define STR_HELPER(x) #x
|
||||
#define STR(x) STR_HELPER(x)
|
||||
#endif
|
|
@ -50,49 +50,21 @@
|
|||
|
||||
#include <Arduino.h>
|
||||
|
||||
/*
|
||||
* Set sensible receive pin for different CPU's
|
||||
*/
|
||||
#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) || defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__)
|
||||
/*
|
||||
* This program runs on 1 MHz CPU clock :-) and is requires only 1550 bytes program memory using ATTiny core
|
||||
*/
|
||||
#include "ATtinySerialOut.hpp" // TX is at pin 2 - Available as Arduino library "ATtinySerialOut" - Saves up to 700 bytes program memory and 70 bytes RAM for ATtinyCore
|
||||
# if defined(ARDUINO_AVR_DIGISPARKPRO)
|
||||
#define IR_RECEIVE_PIN 9 // PA3 - on Digispark board labeled as pin 9
|
||||
# else
|
||||
#define IR_RECEIVE_PIN 0 // PCINT0
|
||||
# endif
|
||||
#elif defined(__AVR_ATtiny1616__) || defined(__AVR_ATtiny3216__) || defined(__AVR_ATtiny3217__)
|
||||
#define IR_RECEIVE_PIN 10
|
||||
#elif (defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__))
|
||||
#define IR_RECEIVE_PIN 21 // INT0
|
||||
#elif defined(ESP8266)
|
||||
#define IR_RECEIVE_PIN 14 // D5
|
||||
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||
#define IR_RECEIVE_PIN 8
|
||||
#elif defined(ESP32)
|
||||
#define IR_RECEIVE_PIN 15
|
||||
#elif defined(ARDUINO_ARCH_MBED) && defined(ARDUINO_ARCH_MBED_NANO)
|
||||
#define IR_RECEIVE_PIN 3 // GPIO15 Use pin 3 since pin 2|GPIO25 is connected to LED on Pi pico
|
||||
#elif defined(ARDUINO_ARCH_RP2040) // Pi Pico with arduino-pico core https://github.com/earlephilhower/arduino-pico
|
||||
#define IR_RECEIVE_PIN 15 // to be compatible with the Arduino Nano RP2040 Connect (pin3)
|
||||
#else
|
||||
#define IR_RECEIVE_PIN 2 // INT0
|
||||
//#define NO_LED_FEEDBACK_CODE // Activate this if you want to suppress LED feedback or if you do not have a LED. This saves 14 bytes code and 2 clock cycles per interrupt.
|
||||
#endif
|
||||
#include "PinDefinitionsAndMore.h" // Set IR_RECEIVE_PIN for different CPU's
|
||||
|
||||
//#define DEBUG // to see if attachInterrupt is used
|
||||
//#define TRACE // to see the state of the ISR state machine
|
||||
|
||||
/*
|
||||
* Second: include the code and compile it.
|
||||
* Set compile options to modify the generated code.
|
||||
*/
|
||||
//#define DISABLE_PARITY_CHECKS // Disable parity checks. Saves 48 bytes of program memory.
|
||||
//#define USE_ONKYO_PROTOCOL // Like NEC, but take the 16 bit address and command each as one 16 bit value and not as 8 bit normal and 8 bit inverted value.
|
||||
//#define USE_FAST_PROTOCOL // Use FAST protocol (no address and 16 bit data, interpreted as 8 bit command and 8 bit inverted command) instead of NEC / ONKYO.
|
||||
//#define ENABLE_NEC2_REPEATS // Instead of sending / receiving the NEC special repeat code, send / receive the original frame for repeat.
|
||||
#include "TinyIRReceiver.hpp"
|
||||
//#define USE_CALLBACK_FOR_TINY_RECEIVER // Call the fixed function "void handleReceivedTinyIRData()" each time a frame or repeat is received.
|
||||
|
||||
#include "TinyIRReceiver.hpp" // include the code
|
||||
|
||||
/*
|
||||
* Helper macro for getting a macro definition as string
|
||||
|
@ -102,8 +74,6 @@
|
|||
#define STR(x) STR_HELPER(x)
|
||||
#endif
|
||||
|
||||
volatile struct TinyIRReceiverCallbackDataStruct sCallbackData;
|
||||
|
||||
void setup() {
|
||||
Serial.begin(115200);
|
||||
#if defined(__AVR_ATmega32U4__) || defined(SERIAL_PORT_USBVIRTUAL) || defined(SERIAL_USB) /*stm32duino*/|| defined(USBCON) /*STM32_stm32*/|| defined(SERIALUSB_PID) || defined(ARDUINO_attiny3217)
|
||||
|
@ -127,20 +97,20 @@ void setup() {
|
|||
}
|
||||
|
||||
void loop() {
|
||||
if (sCallbackData.justWritten) {
|
||||
sCallbackData.justWritten = false;
|
||||
#if defined(USE_FAST_PROTOCOL)
|
||||
Serial.print(F("Command=0x"));
|
||||
#else
|
||||
if (TinyIRReceiverData.justWritten) {
|
||||
TinyIRReceiverData.justWritten = false;
|
||||
#if !defined(USE_FAST_PROTOCOL)
|
||||
// We have no address at FAST protocol
|
||||
Serial.print(F("Address=0x"));
|
||||
Serial.print(sCallbackData.Address, HEX);
|
||||
Serial.print(F(" Command=0x"));
|
||||
Serial.print(TinyIRReceiverData.Address, HEX);
|
||||
Serial.print(' ');
|
||||
#endif
|
||||
Serial.print(sCallbackData.Command, HEX);
|
||||
if (sCallbackData.Flags == IRDATA_FLAGS_IS_REPEAT) {
|
||||
Serial.print(F("Command=0x"));
|
||||
Serial.print(TinyIRReceiverData.Command, HEX);
|
||||
if (TinyIRReceiverData.Flags == IRDATA_FLAGS_IS_REPEAT) {
|
||||
Serial.print(F(" Repeat"));
|
||||
}
|
||||
if (sCallbackData.Flags == IRDATA_FLAGS_PARITY_FAILED) {
|
||||
if (TinyIRReceiverData.Flags == IRDATA_FLAGS_PARITY_FAILED) {
|
||||
Serial.print(F(" Parity failed"));
|
||||
}
|
||||
Serial.println();
|
||||
|
@ -151,40 +121,30 @@ void loop() {
|
|||
}
|
||||
|
||||
/*
|
||||
* This is the function, which is called if a complete command was received
|
||||
* Optional code, if you require a callback
|
||||
*/
|
||||
#if defined(USE_CALLBACK_FOR_TINY_RECEIVER)
|
||||
/*
|
||||
* This is the function, which is called if a complete frame was received
|
||||
* It runs in an ISR context with interrupts enabled, so functions like delay() etc. should work here
|
||||
*/
|
||||
#if defined(ESP8266) || defined(ESP32)
|
||||
# if defined(ESP8266) || defined(ESP32)
|
||||
IRAM_ATTR
|
||||
#endif
|
||||
|
||||
#if defined(USE_FAST_PROTOCOL)
|
||||
void handleReceivedTinyIRData(uint8_t aCommand, uint8_t aFlags)
|
||||
#elif defined(USE_ONKYO_PROTOCOL)
|
||||
void handleReceivedTinyIRData(uint16_t aAddress, uint16_t aCommand, uint8_t aFlags)
|
||||
#else
|
||||
void handleReceivedTinyIRData(uint8_t aAddress, uint8_t aCommand, uint8_t aFlags)
|
||||
#endif
|
||||
{
|
||||
#if defined(ARDUINO_ARCH_MBED) || defined(ESP32)
|
||||
// Copy data for main loop, this is the recommended way for handling a callback :-)
|
||||
# if !defined(USE_FAST_PROTOCOL)
|
||||
sCallbackData.Address = aAddress;
|
||||
# endif
|
||||
sCallbackData.Command = aCommand;
|
||||
sCallbackData.Flags = aFlags;
|
||||
sCallbackData.justWritten = true;
|
||||
#else
|
||||
|
||||
void handleReceivedTinyIRData() {
|
||||
# if defined(ARDUINO_ARCH_MBED) || defined(ESP32)
|
||||
/*
|
||||
* Printing is not allowed in ISR context for any kind of RTOS
|
||||
* Printing is not allowed in ISR context for any kind of RTOS, so we use the slihjtly more complex,
|
||||
* but recommended way for handling a callback :-). Copy data for main loop.
|
||||
* For Mbed we get a kernel panic and "Error Message: Semaphore: 0x0, Not allowed in ISR context" for Serial.print()
|
||||
* for ESP32 we get a "Guru Meditation Error: Core 1 panic'ed" (we also have an RTOS running!)
|
||||
*/
|
||||
// Print only very short output, since we are in an interrupt context and do not want to miss the next interrupts of the repeats coming soon
|
||||
# if defined(USE_FAST_PROTOCOL)
|
||||
printTinyReceiverResultMinimal(&Serial, aCommand, aFlags);
|
||||
// Do something useful here...
|
||||
# else
|
||||
printTinyReceiverResultMinimal(&Serial, aAddress, aCommand, aFlags);
|
||||
// As an example, print very short output, since we are in an interrupt context and do not want to miss the next interrupts of the repeats coming soon
|
||||
printTinyReceiverResultMinimal(&Serial);
|
||||
# endif
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
|
||||
|
|
|
@ -0,0 +1,345 @@
|
|||
/*
|
||||
* PinDefinitionsAndMore.h
|
||||
*
|
||||
* Contains pin definitions for IRremote examples for various platforms
|
||||
* as well as definitions for feedback LED and tone() and includes
|
||||
*
|
||||
* Copyright (C) 2021-2023 Armin Joachimsmeyer
|
||||
* armin.joachimsmeyer@gmail.com
|
||||
*
|
||||
* This file is part of IRremote https://github.com/Arduino-IRremote/Arduino-IRremote.
|
||||
*
|
||||
* Arduino-IRremote is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/gpl.html>.
|
||||
*
|
||||
*/
|
||||
|
||||
/*
|
||||
* Pin mapping table for different platforms
|
||||
*
|
||||
* Platform IR input IR output Tone Core/Pin schema
|
||||
* --------------------------------------------------------------
|
||||
* DEFAULT/AVR 2 3 4 Arduino
|
||||
* ATtinyX5 0|PB0 4|PB4 3|PB3 ATTinyCore
|
||||
* ATtiny167 3|PA3 2|PA2 7|PA7 ATTinyCore
|
||||
* ATtiny167 9|PA3 8|PA2 5|PA7 Digispark original core
|
||||
* ATtiny84 |PB2 |PA4 |PA3 ATTinyCore
|
||||
* ATtiny88 3|PD3 4|PD4 9|PB1 ATTinyCore
|
||||
* ATtiny3217 18|PA1 19|PA2 20|PA3 MegaTinyCore
|
||||
* ATtiny1604 2 3|PA5 %
|
||||
* ATtiny816 14|PA1 16|PA3 1|PA5 MegaTinyCore
|
||||
* ATtiny1614 8|PA1 10|PA3 1|PA5 MegaTinyCore
|
||||
* SAMD21 3 4 5
|
||||
* ESP8266 14|D5 12|D6 %
|
||||
* ESP32 15 4 27
|
||||
* BluePill PA6 PA7 PA3
|
||||
* APOLLO3 11 12 5
|
||||
* RP2040 3|GPIO15 4|GPIO16 5|GPIO17
|
||||
*/
|
||||
//#define _IR_MEASURE_TIMING // For debugging purposes.
|
||||
|
||||
#if defined(__AVR__)
|
||||
#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__) || defined(__AVR_ATtiny85__) // Digispark board. For use with ATTinyCore.
|
||||
#include "ATtinySerialOut.hpp" // TX is at pin 2 - Available as Arduino library "ATtinySerialOut". Saves 700 bytes program memory and 70 bytes RAM for ATtinyCore.
|
||||
#define IR_RECEIVE_PIN PIN_PB0
|
||||
#define IR_SEND_PIN PIN_PB4 // Pin 2 is serial output with ATtinySerialOut. Pin 1 is internal LED and Pin3 is USB+ with pullup on Digispark board.
|
||||
#define TONE_PIN PIN_PB3
|
||||
#define _IR_TIMING_TEST_PIN PIN_PB3
|
||||
|
||||
# elif defined(__AVR_ATtiny87__) || defined(__AVR_ATtiny167__) // Digispark pro board
|
||||
#include "ATtinySerialOut.hpp" // Available as Arduino library "ATtinySerialOut"
|
||||
// For ATtiny167 Pins PB6 and PA3 are usable as interrupt source.
|
||||
# if defined(ARDUINO_AVR_DIGISPARKPRO)
|
||||
// For use with Digispark original core
|
||||
#define IR_RECEIVE_PIN 9 // PA3 - on Digispark board labeled as pin 9
|
||||
//#define IR_RECEIVE_PIN 14 // PB6 / INT0 is connected to USB+ on DigisparkPro boards
|
||||
#define IR_SEND_PIN 8 // PA2 - on Digispark board labeled as pin 8
|
||||
#define TONE_PIN 5 // PA7 - on Digispark board labeled as pin 5
|
||||
#define _IR_TIMING_TEST_PIN 10 // PA4
|
||||
# else
|
||||
// For use with ATTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA3 // On Digispark board labeled as pin 9 - INT0 is connected to USB+ on DigisparkPro boards
|
||||
#define IR_SEND_PIN PIN_PA2 // On Digispark board labeled as pin 8
|
||||
#define TONE_PIN PIN_PA7 // On Digispark board labeled as pin 5
|
||||
# endif
|
||||
|
||||
# elif defined(__AVR_ATtiny84__) // For use with ATTinyCore
|
||||
#include "ATtinySerialOut.hpp" // Available as Arduino library "ATtinySerialOut". Saves 128 bytes program memory.
|
||||
#define IR_RECEIVE_PIN PIN_PB2 // INT0
|
||||
#define IR_SEND_PIN PIN_PA4
|
||||
#define TONE_PIN PIN_PA3
|
||||
#define _IR_TIMING_TEST_PIN PIN_PA5
|
||||
|
||||
# elif defined(__AVR_ATtiny88__) // MH-ET Tiny88 board. For use with ATTinyCore.
|
||||
#include "ATtinySerialOut.hpp" // Available as Arduino library "ATtinySerialOut". Saves 128 bytes program memory.
|
||||
// Pin 6 is TX, pin 7 is RX
|
||||
#define IR_RECEIVE_PIN PIN_PD3 // 3 - INT1
|
||||
#define IR_SEND_PIN PIN_PD4 // 4
|
||||
#define TONE_PIN PIN_PB1 // 9
|
||||
#define _IR_TIMING_TEST_PIN PIN_PB0 // 8
|
||||
|
||||
# elif defined(__AVR_ATtiny1616__) || defined(__AVR_ATtiny3216__) || defined(__AVR_ATtiny3217__) // For use with megaTinyCore
|
||||
// Tiny Core Dev board
|
||||
// https://www.tindie.com/products/xkimi/tiny-core-16-dev-board-attiny1616/
|
||||
// https://www.tindie.com/products/xkimi/tiny-core-32-dev-board-attiny3217/
|
||||
#define IR_RECEIVE_PIN PIN_PA1 // use 18 for TinyCore32
|
||||
#define IR_SEND_PIN PIN_PA2 // 19
|
||||
#define TONE_PIN PIN_PA3 // 20
|
||||
#define APPLICATION_PIN PIN_PA0 // 0
|
||||
#undef LED_BUILTIN // No LED available on the TinyCore 32 board, take the one on the programming board which is connected to the DAC output
|
||||
#define LED_BUILTIN PIN_PA6 // use 2 for TinyCore32
|
||||
|
||||
# elif defined(__AVR_ATtiny816__) // For use with megaTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA1 // 14
|
||||
#define IR_SEND_PIN PIN_PA1 // 16
|
||||
#define TONE_PIN PIN_PA5 // 1
|
||||
#define APPLICATION_PIN PIN_PA4 // 0
|
||||
#undef LED_BUILTIN // No LED available, take the one which is connected to the DAC output
|
||||
#define LED_BUILTIN PIN_PB5 // 4
|
||||
|
||||
# elif defined(__AVR_ATtiny1614__) // For use with megaTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA1 // 8
|
||||
#define IR_SEND_PIN PIN_PA3 // 10
|
||||
#define TONE_PIN PIN_PA5 // 1
|
||||
#define APPLICATION_PIN PIN_PA4 // 0
|
||||
|
||||
# elif defined(__AVR_ATtiny1604__) // For use with megaTinyCore
|
||||
#define IR_RECEIVE_PIN PIN_PA6 // 2 - To be compatible with interrupt example, pin 2 is chosen here.
|
||||
#define IR_SEND_PIN PIN_PA7 // 3
|
||||
#define APPLICATION_PIN PIN_PB2 // 5
|
||||
|
||||
#define tone(...) void() // Define as void, since TCB0_INT_vect is also used by tone()
|
||||
#define noTone(a) void()
|
||||
#define TONE_PIN 42 // Dummy for examples using it
|
||||
|
||||
# elif defined(__AVR_ATmega1284__) || defined(__AVR_ATmega1284P__) \
|
||||
|| defined(__AVR_ATmega644__) || defined(__AVR_ATmega644P__) \
|
||||
|| defined(__AVR_ATmega324P__) || defined(__AVR_ATmega324A__) \
|
||||
|| defined(__AVR_ATmega324PA__) || defined(__AVR_ATmega164A__) \
|
||||
|| defined(__AVR_ATmega164P__) || defined(__AVR_ATmega32__) \
|
||||
|| defined(__AVR_ATmega16__) || defined(__AVR_ATmega8535__) \
|
||||
|| defined(__AVR_ATmega64__) || defined(__AVR_ATmega128__) \
|
||||
|| defined(__AVR_ATmega1281__) || defined(__AVR_ATmega2561__) \
|
||||
|| defined(__AVR_ATmega8515__) || defined(__AVR_ATmega162__)
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 13
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
# else // Default as for ATmega328 like on Uno, Nano, Leonardo, Teensy 2.0 etc.
|
||||
#define IR_RECEIVE_PIN 2 // To be compatible with interrupt example, pin 2 is chosen here.
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
# if defined(ARDUINO_AVR_PROMICRO) // Sparkfun Pro Micro is __AVR_ATmega32U4__ but has different external circuit
|
||||
// We have no built in LED at pin 13 -> reuse RX LED
|
||||
#undef LED_BUILTIN
|
||||
#define LED_BUILTIN LED_BUILTIN_RX
|
||||
# endif
|
||||
# endif // defined(__AVR_ATtiny25__)...
|
||||
|
||||
#elif defined(ARDUINO_ARCH_RENESAS_UNO) // Uno R4
|
||||
// To be compatible with Uno R3.
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#elif defined(ESP8266)
|
||||
#define FEEDBACK_LED_IS_ACTIVE_LOW // The LED on my board (D4) is active LOW
|
||||
#define IR_RECEIVE_PIN 14 // D5
|
||||
#define IR_SEND_PIN 12 // D6 - D4/pin 2 is internal LED
|
||||
#define _IR_TIMING_TEST_PIN 2 // D4
|
||||
#define APPLICATION_PIN 13 // D7
|
||||
|
||||
#define tone(...) void() // tone() inhibits receive timer
|
||||
#define noTone(a) void()
|
||||
#define TONE_PIN 42 // Dummy for examples using it
|
||||
|
||||
#elif defined(CONFIG_IDF_TARGET_ESP32C3)
|
||||
#define IR_RECEIVE_PIN 8
|
||||
#define IR_SEND_PIN 9
|
||||
#define TONE_PIN 10 // ADC2_0
|
||||
#define APPLICATION_PIN 11
|
||||
|
||||
#elif defined(ESP32)
|
||||
#include <Arduino.h>
|
||||
|
||||
// tone() is included in ESP32 core since 2.0.2
|
||||
#if !defined(ESP_ARDUINO_VERSION_VAL)
|
||||
#define ESP_ARDUINO_VERSION_VAL(major, minor, patch) 12345678
|
||||
#endif
|
||||
#if ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2, 0, 2)
|
||||
#define TONE_LEDC_CHANNEL 1 // Using channel 1 makes tone() independent of receiving timer -> No need to stop receiving timer.
|
||||
void tone(uint8_t aPinNumber, unsigned int aFrequency){
|
||||
ledcAttachPin(aPinNumber, TONE_LEDC_CHANNEL);
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, aFrequency);
|
||||
}
|
||||
void tone(uint8_t aPinNumber, unsigned int aFrequency, unsigned long aDuration){
|
||||
ledcAttachPin(aPinNumber, TONE_LEDC_CHANNEL);
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, aFrequency);
|
||||
delay(aDuration);
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, 0);
|
||||
}
|
||||
void noTone(uint8_t aPinNumber){
|
||||
ledcWriteTone(TONE_LEDC_CHANNEL, 0);
|
||||
}
|
||||
#endif // ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2, 0, 2)
|
||||
|
||||
#define IR_RECEIVE_PIN 15 // D15
|
||||
#define IR_SEND_PIN 4 // D4
|
||||
#define TONE_PIN 27 // D27 25 & 26 are DAC0 and 1
|
||||
#define APPLICATION_PIN 16 // RX2 pin
|
||||
|
||||
#elif defined(ARDUINO_ARCH_STM32) || defined(ARDUINO_ARCH_STM32F1) // BluePill
|
||||
// Timer 3 blocks PA6, PA7, PB0, PB1 for use by Servo or tone()
|
||||
#define IR_RECEIVE_PIN PA6
|
||||
#define IR_RECEIVE_PIN_STRING "PA6"
|
||||
#define IR_SEND_PIN PA7
|
||||
#define IR_SEND_PIN_STRING "PA7"
|
||||
#define TONE_PIN PA3
|
||||
#define _IR_TIMING_TEST_PIN PA5
|
||||
#define APPLICATION_PIN PA2
|
||||
#define APPLICATION_PIN_STRING "PA2"
|
||||
# if defined(ARDUINO_GENERIC_STM32F103C) || defined(ARDUINO_BLUEPILL_F103C8)
|
||||
// BluePill LED is active low
|
||||
#define FEEDBACK_LED_IS_ACTIVE_LOW
|
||||
# endif
|
||||
|
||||
#elif defined(ARDUINO_ARCH_APOLLO3) // Sparkfun Apollo boards
|
||||
#define IR_RECEIVE_PIN 11
|
||||
#define IR_SEND_PIN 12
|
||||
#define TONE_PIN 5
|
||||
|
||||
#elif defined(ARDUINO_ARCH_MBED) && defined(ARDUINO_ARCH_MBED_NANO) // Arduino Nano 33 BLE
|
||||
#define IR_RECEIVE_PIN 3 // GPIO15 Start with pin 3 since pin 2|GPIO25 is connected to LED on Pi pico
|
||||
#define IR_SEND_PIN 4 // GPIO16
|
||||
#define TONE_PIN 5
|
||||
#define APPLICATION_PIN 6
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 7 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 8
|
||||
|
||||
#elif defined(ARDUINO_ARCH_RP2040) // Arduino Nano Connect, Pi Pico with arduino-pico core https://github.com/earlephilhower/arduino-pico
|
||||
#define IR_RECEIVE_PIN 15 // GPIO15 to be compatible with the Arduino Nano RP2040 Connect (pin3)
|
||||
#define IR_SEND_PIN 16 // GPIO16
|
||||
#define TONE_PIN 17
|
||||
#define APPLICATION_PIN 18
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 19 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 20
|
||||
|
||||
// If you program the Nano RP2040 Connect with this core, then you must redefine LED_BUILTIN
|
||||
// and use the external reset with 1 kOhm to ground to enter UF2 mode
|
||||
#undef LED_BUILTIN
|
||||
#define LED_BUILTIN 6
|
||||
|
||||
#elif defined(PARTICLE) // !!!UNTESTED!!!
|
||||
#define IR_RECEIVE_PIN A4
|
||||
#define IR_SEND_PIN A5 // Particle supports multiple pins
|
||||
|
||||
#define LED_BUILTIN D7
|
||||
|
||||
/*
|
||||
* 4 times the same (default) layout for easy adaption in the future
|
||||
*/
|
||||
#elif defined(TEENSYDUINO) // Teensy 2.0 is handled at default for ATmega328 like on Uno, Nano, Leonardo etc.
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#elif defined(ARDUINO_ARCH_MBED) // Arduino Nano 33 BLE
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#elif defined(ARDUINO_ARCH_SAMD) || defined(ARDUINO_ARCH_SAM)
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
|
||||
#if !defined(ARDUINO_SAMD_ADAFRUIT) && !defined(ARDUINO_SEEED_XIAO_M0)
|
||||
// On the Zero and others we switch explicitly to SerialUSB
|
||||
#define Serial SerialUSB
|
||||
#endif
|
||||
|
||||
// Definitions for the Chinese SAMD21 M0-Mini clone, which has no led connected to D13/PA17.
|
||||
// Attention!!! D2 and D4 are swapped on these boards!!!
|
||||
// If you connect the LED, it is on pin 24/PB11. In this case activate the next two lines.
|
||||
//#undef LED_BUILTIN
|
||||
//#define LED_BUILTIN 24 // PB11
|
||||
// As an alternative you can choose pin 25, it is the RX-LED pin (PB03), but active low.In this case activate the next 3 lines.
|
||||
//#undef LED_BUILTIN
|
||||
//#define LED_BUILTIN 25 // PB03
|
||||
//#define FEEDBACK_LED_IS_ACTIVE_LOW // The RX LED on the M0-Mini is active LOW
|
||||
|
||||
#elif defined (NRF51) // BBC micro:bit
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define APPLICATION_PIN 1
|
||||
#define _IR_TIMING_TEST_PIN 4
|
||||
|
||||
#define tone(...) void() // no tone() available
|
||||
#define noTone(a) void()
|
||||
#define TONE_PIN 42 // Dummy for examples using it
|
||||
|
||||
#else
|
||||
#warning Board / CPU is not detected using pre-processor symbols -> using default values, which may not fit. Please extend PinDefinitionsAndMore.h.
|
||||
// Default valued for unidentified boards
|
||||
#define IR_RECEIVE_PIN 2
|
||||
#define IR_SEND_PIN 3
|
||||
#define TONE_PIN 4
|
||||
#define APPLICATION_PIN 5
|
||||
#define ALTERNATIVE_IR_FEEDBACK_LED_PIN 6 // E.g. used for examples which use LED_BUILDIN for example output.
|
||||
#define _IR_TIMING_TEST_PIN 7
|
||||
#endif // defined(ESP8266)
|
||||
|
||||
#if defined(ESP32) || defined(ARDUINO_ARCH_RP2040) || defined(PARTICLE) || defined(ARDUINO_ARCH_MBED)
|
||||
#define SEND_PWM_BY_TIMER // We do not have pin restrictions for this CPU's, so lets use the hardware PWM for send carrier signal generation
|
||||
#else
|
||||
# if defined(SEND_PWM_BY_TIMER)
|
||||
#undef IR_SEND_PIN // SendPin is determined by timer! This avoids warning in IRTimer.hpp
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#if !defined (FLASHEND)
|
||||
#define FLASHEND 0xFFFF // Dummy value for platforms where FLASHEND is not defined
|
||||
#endif
|
||||
#if !defined (RAMEND)
|
||||
#define RAMEND 0xFFFF // Dummy value for platforms where RAMEND is not defined
|
||||
#endif
|
||||
#if !defined (RAMSIZE)
|
||||
#define RAMSIZE 0xFFFF // Dummy value for platforms where RAMSIZE is not defined
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Helper macro for getting a macro definition as string
|
||||
*/
|
||||
#if !defined(STR_HELPER)
|
||||
#define STR_HELPER(x) #x
|
||||
#define STR(x) STR_HELPER(x)
|
||||
#endif
|
|
@ -52,7 +52,7 @@
|
|||
|
||||
#include "TinyIRSender.hpp"
|
||||
|
||||
#define IR_SEND_PIN 3
|
||||
#include "PinDefinitionsAndMore.h" // Set IR_SEND_PIN for different CPU's
|
||||
|
||||
void setup() {
|
||||
pinMode(LED_BUILTIN, OUTPUT);
|
||||
|
|
|
@ -407,10 +407,11 @@ bool IRrecv::isIdle() {
|
|||
}
|
||||
|
||||
/**
|
||||
* Restart the ISR (Interrupt Service Routine) state machine, to enable receiving of the next IR frame
|
||||
* Restart the ISR (Interrupt Service Routine) state machine, to enable receiving of the next IR frame.
|
||||
* Counting of gap timing is independent of StateForISR and therefore independent of call time of resume().
|
||||
*/
|
||||
void IRrecv::resume() {
|
||||
// check allows to call resume at arbitrary places or more than once
|
||||
// This check allows to call resume at arbitrary places or more than once
|
||||
if (irparams.StateForISR == IR_REC_STATE_STOP) {
|
||||
irparams.StateForISR = IR_REC_STATE_IDLE;
|
||||
}
|
||||
|
|
|
@ -100,7 +100,7 @@ struct irparams_struct {
|
|||
volatile uint8_t *IRReceivePinPortInputRegister;
|
||||
uint8_t IRReceivePinMask;
|
||||
#endif
|
||||
volatile uint_fast16_t TickCounterForISR; ///< Counts 50uS ticks. The value is copied into the rawbuf array on every transition.
|
||||
volatile uint_fast16_t TickCounterForISR; ///< Counts 50uS ticks. The value is copied into the rawbuf array on every transition. Counting is independent of state or resume().
|
||||
#if !IR_REMOTE_DISABLE_RECEIVE_COMPLETE_CALLBACK
|
||||
void (*ReceiveCompleteCallbackFunction)(void); ///< The function to call if a protocol message has arrived, i.e. StateForISR changed to IR_REC_STATE_STOP
|
||||
#endif
|
||||
|
|
59
src/TinyIR.h
59
src/TinyIR.h
|
@ -34,9 +34,9 @@
|
|||
* @{
|
||||
*/
|
||||
|
||||
#define VERSION_TINYIR "1.2.0"
|
||||
#define VERSION_TINYIR_MAJOR 1
|
||||
#define VERSION_TINYIR_MINOR 2
|
||||
#define VERSION_TINYIR "2.0.0"
|
||||
#define VERSION_TINYIR_MAJOR 2
|
||||
#define VERSION_TINYIR_MINOR 0
|
||||
#define VERSION_TINYIR_PATCH 0
|
||||
// The change log is at the bottom of the file
|
||||
|
||||
|
@ -77,15 +77,15 @@
|
|||
* - Repeats are sent as complete frames but in a 50 ms period / with a 21 ms distance.
|
||||
*/
|
||||
/*
|
||||
Protocol=FAST Address=0x0 Command=0x76 Raw-Data=0x8976 16 bits LSB first
|
||||
Protocol=FAST Address=0x0 Command=0x76 Raw-Data=0x8976 16 bits LSB first
|
||||
+2100,-1050
|
||||
+ 550,- 500 + 550,-1550 + 550,-1550 + 550,- 500
|
||||
+ 550,-1550 + 550,-1550 + 550,-1550 + 550,- 500
|
||||
+ 550,-1550 + 550,- 500 + 550,- 500 + 550,-1550
|
||||
+ 550,- 500 + 550,- 500 + 550,- 500 + 550,-1550
|
||||
+ 550
|
||||
Sum: 28900
|
||||
*/
|
||||
Sum: 28900
|
||||
*/
|
||||
#define FAST_KHZ 38
|
||||
#define FAST_ADDRESS_BITS 0 // No address
|
||||
#define FAST_COMMAND_BITS 16 // Command and inverted command (parity)
|
||||
|
@ -158,36 +158,12 @@ Sum: 28900
|
|||
#define TINY_RECEIVER_MAXIMUM_REPEAT_DISTANCE NEC_MAXIMUM_REPEAT_DISTANCE
|
||||
#endif
|
||||
|
||||
#if defined(USE_CALLBACK_FOR_TINY_RECEIVER)
|
||||
/*
|
||||
* This function is called, if a complete command was received and must be implemented in the file (user code) which includes this library.
|
||||
* The parameter size is dependent of the code variant used in order to save program memory.
|
||||
* We have 6 cases: 0, 8 bit or 16 bit address, each with 8 or 16 bit command
|
||||
* This function is called, if a complete command was received and must be implemented in the file (user code)
|
||||
* which includes this library if USE_CALLBACK_FOR_TINY_RECEIVER is activated.
|
||||
*/
|
||||
#if (TINY_RECEIVER_ADDRESS_BITS > 0)
|
||||
# if TINY_RECEIVER_ADDRESS_HAS_8_BIT_PARITY
|
||||
// 8 bit address here
|
||||
# if TINY_RECEIVER_COMMAND_HAS_8_BIT_PARITY
|
||||
extern void handleReceivedTinyIRData(uint8_t aAddress, uint8_t aCommand, uint8_t aFlags); // Standard NEC callback
|
||||
# else
|
||||
extern void handleReceivedTinyIRData(uint8_t aAddress, uint16_t aCommand, uint8_t aFlags); // If SUPPORT_ONKYO_16_BIT_COMMAND is defined
|
||||
# endif
|
||||
|
||||
# else // TINY_RECEIVER_ADDRESS_HAS_8_BIT_PARITY
|
||||
// 16 bit address here
|
||||
# if TINY_RECEIVER_COMMAND_HAS_8_BIT_PARITY
|
||||
extern void handleReceivedTinyIRData(uint16_t aAddress, uint8_t aCommand, uint8_t aFlags);
|
||||
# else
|
||||
extern void handleReceivedTinyIRData(uint16_t aAddress, uint16_t aCommand, uint8_t aFlags);
|
||||
# endif
|
||||
# endif
|
||||
|
||||
#else
|
||||
// FAST protocol - No address here
|
||||
# if TINY_RECEIVER_COMMAND_HAS_8_BIT_PARITY
|
||||
extern void handleReceivedTinyIRData(uint8_t aCommand, uint8_t aFlags); // Standard FAST callback
|
||||
# else
|
||||
extern void handleReceivedTinyIRData(uint16_t aCommand, uint8_t aFlags); // If "TINY_RECEIVER_COMMAND_HAS_8_BIT_PARITY false" is defined. 16 bit without parity.
|
||||
# endif
|
||||
extern void handleReceivedTinyIRData();
|
||||
#endif
|
||||
|
||||
#if !defined(MICROS_IN_ONE_SECOND)
|
||||
|
@ -248,8 +224,7 @@ struct TinyIRReceiverStruct {
|
|||
#define IRDATA_FLAGS_PARITY_FAILED 0x04 ///< the current (autorepeat) frame violated parity check
|
||||
|
||||
/**
|
||||
* Can be used by the callback to transfer received data to main loop for further processing.
|
||||
* E.g. with volatile struct TinyIRReceiverCallbackDataStruct sCallbackData;
|
||||
* Is filled before calling the user callback to transfer received data to main loop for further processing.
|
||||
*/
|
||||
struct TinyIRReceiverCallbackDataStruct {
|
||||
#if (TINY_RECEIVER_ADDRESS_BITS > 0)
|
||||
|
@ -268,16 +243,13 @@ struct TinyIRReceiverCallbackDataStruct {
|
|||
uint8_t Flags; // Bit coded flags. Can contain one of the bits: IRDATA_FLAGS_IS_REPEAT and IRDATA_FLAGS_PARITY_FAILED
|
||||
bool justWritten; ///< Is set true if new data is available. Used by the main loop, to avoid multiple evaluations of the same IR frame.
|
||||
};
|
||||
extern volatile TinyIRReceiverCallbackDataStruct TinyIRReceiverData;
|
||||
|
||||
bool initPCIInterruptForTinyReceiver();
|
||||
bool enablePCIInterruptForTinyReceiver();
|
||||
void disablePCIInterruptForTinyReceiver();
|
||||
bool isTinyReceiverIdle();
|
||||
#if defined(USE_FAST_PROTOCOL)
|
||||
void printTinyReceiverResultMinimal(Print *aSerial, uint16_t aCommand, uint8_t aFlags);
|
||||
#else
|
||||
void printTinyReceiverResultMinimal(Print *aSerial, uint8_t aAddress, uint8_t aCommand, uint8_t aFlags);
|
||||
#endif
|
||||
void printTinyReceiverResultMinimal(Print *aSerial);
|
||||
|
||||
void sendFAST(uint8_t aSendPin, uint16_t aCommand, uint_fast8_t aNumberOfRepeats = 0);
|
||||
void sendFast8BitAndParity(uint8_t aSendPin, uint8_t aCommand, uint_fast8_t aNumberOfRepeats = 0);
|
||||
|
@ -287,6 +259,11 @@ void sendNECMinimal(uint8_t aSendPin, uint16_t aAddress, uint16_t aCommand, uint
|
|||
void sendNEC(uint8_t aSendPin, uint16_t aAddress, uint16_t aCommand, uint_fast8_t aNumberOfRepeats = 0);
|
||||
|
||||
/*
|
||||
* Version 2.0.0 - 10/2023
|
||||
* - New TinyIRReceiverData which is filled with address, command and flags.
|
||||
* - Removed parameters address, command and flags from callback handleReceivedTinyIRData() and printTinyReceiverResultMinimal().
|
||||
* - Callback function now only enabled if USE_CALLBACK_FOR_TINY_RECEIVER is activated.
|
||||
*
|
||||
* Version 1.2.0 - 01/2023
|
||||
* - Added ONKYO protocol, NEC with 16 bit address and command, instead of 8 bit + 8 bit parity address and command.
|
||||
* - Renamed functions and macros.
|
||||
|
|
|
@ -61,6 +61,7 @@
|
|||
* - USE_ONKYO_PROTOCOL Like NEC, but take the 16 bit address and command each as one 16 bit value and not as 8 bit normal and 8 bit inverted value.
|
||||
* - USE_FAST_PROTOCOL Use FAST protocol (no address and 16 bit data, interpreted as 8 bit command and 8 bit inverted command) instead of NEC.
|
||||
* - ENABLE_NEC2_REPEATS Instead of sending / receiving the NEC special repeat code, send / receive the original frame for repeat.
|
||||
* - USE_CALLBACK_FOR_TINY_RECEIVER Call the fixed function "void handleReceivedTinyIRData()" each time a frame or repeat is received.
|
||||
*/
|
||||
|
||||
#ifndef _TINY_IR_RECEIVER_HPP
|
||||
|
@ -100,6 +101,7 @@
|
|||
//#define _IR_MEASURE_TIMING // Activate this if you want to enable internal hardware timing measurement.
|
||||
//#define _IR_TIMING_TEST_PIN 7
|
||||
TinyIRReceiverStruct TinyIRReceiverControl;
|
||||
volatile TinyIRReceiverCallbackDataStruct TinyIRReceiverData;
|
||||
|
||||
/*
|
||||
* Set input pin and output pin definitions etc.
|
||||
|
@ -143,7 +145,7 @@ TinyIRReceiverStruct TinyIRReceiverControl;
|
|||
* Declaration of the callback function provided by the user application.
|
||||
* It is called every time a complete IR command or repeat was received.
|
||||
*/
|
||||
extern void handleReceivedIRData(uint16_t aAddress, uint8_t aCommand, bool isRepetition);
|
||||
extern void handleTinyReceivedIRData();
|
||||
|
||||
#if defined(LOCAL_DEBUG)
|
||||
uint32_t sMicrosOfGap; // The length of the gap before the start bit
|
||||
|
@ -319,7 +321,7 @@ void IRPinChangeInterruptHandler(void) {
|
|||
*/
|
||||
if (TinyIRReceiverControl.IRRawData.UBytes[0] != (uint8_t) (~TinyIRReceiverControl.IRRawData.UBytes[1])) {
|
||||
#if defined(ENABLE_NEC2_REPEATS)
|
||||
TinyIRReceiverControl.Flags |= IRDATA_FLAGS_PARITY_FAILED; // here we can have the repeat flag already set
|
||||
TinyIRReceiverControl.Flags |= IRDATA_FLAGS_PARITY_FAILED; // here we can have the repeat flag already set
|
||||
#else
|
||||
TinyIRReceiverControl.Flags = IRDATA_FLAGS_PARITY_FAILED; // here we do not check anything, if we have a repeat
|
||||
#endif
|
||||
|
@ -332,15 +334,15 @@ void IRPinChangeInterruptHandler(void) {
|
|||
#if (TINY_RECEIVER_ADDRESS_BITS > 0)
|
||||
if (TinyIRReceiverControl.IRRawData.UBytes[2] != (uint8_t) (~TinyIRReceiverControl.IRRawData.UBytes[3])) {
|
||||
#if defined(ENABLE_NEC2_REPEATS)
|
||||
TinyIRReceiverControl.Flags |= IRDATA_FLAGS_PARITY_FAILED;
|
||||
TinyIRReceiverControl.Flags |= IRDATA_FLAGS_PARITY_FAILED;
|
||||
#else
|
||||
TinyIRReceiverControl.Flags = IRDATA_FLAGS_PARITY_FAILED;
|
||||
#endif
|
||||
# if defined(LOCAL_DEBUG)
|
||||
Serial.print(F("Parity check for command failed. Command="));
|
||||
Serial.print(TinyIRReceiverControl.IRRawData.UBytes[2], HEX);
|
||||
Serial.print(F(" parity="));
|
||||
Serial.println(TinyIRReceiverControl.IRRawData.UBytes[3], HEX);
|
||||
Serial.print(F("Parity check for command failed. Command="));
|
||||
Serial.print(TinyIRReceiverControl.IRRawData.UBytes[2], HEX);
|
||||
Serial.print(F(" parity="));
|
||||
Serial.println(TinyIRReceiverControl.IRRawData.UBytes[3], HEX);
|
||||
# endif
|
||||
#else
|
||||
// No address, so command and parity are in the lowest bytes
|
||||
|
@ -363,34 +365,37 @@ void IRPinChangeInterruptHandler(void) {
|
|||
#if !defined(ARDUINO_ARCH_MBED) && !defined(ESP32) // no Serial etc. in callback for ESP -> no interrupt required, WDT is running!
|
||||
interrupts(); // enable interrupts, so delay() etc. works in callback
|
||||
#endif
|
||||
handleReceivedTinyIRData(
|
||||
TinyIRReceiverData.justWritten = true;
|
||||
TinyIRReceiverData.Flags = TinyIRReceiverControl.Flags;
|
||||
#if (TINY_RECEIVER_ADDRESS_BITS > 0)
|
||||
# if TINY_RECEIVER_ADDRESS_HAS_8_BIT_PARITY
|
||||
// Here we have 8 bit address
|
||||
TinyIRReceiverControl.IRRawData.UBytes[0],
|
||||
// Here we have 8 bit address
|
||||
TinyIRReceiverData.Address = TinyIRReceiverControl.IRRawData.UBytes[0];
|
||||
# else
|
||||
// Here we have 16 bit address
|
||||
TinyIRReceiverControl.IRRawData.UWord.LowWord,
|
||||
// Here we have 16 bit address
|
||||
TinyIRReceiverData.Address = TinyIRReceiverControl.IRRawData.UWord.LowWord;
|
||||
# endif
|
||||
# if TINY_RECEIVER_COMMAND_HAS_8_BIT_PARITY
|
||||
// Here we have 8 bit command
|
||||
TinyIRReceiverControl.IRRawData.UBytes[2],
|
||||
// Here we have 8 bit command
|
||||
TinyIRReceiverData.Command = TinyIRReceiverControl.IRRawData.UBytes[2];
|
||||
# else
|
||||
// Here we have 16 bit command
|
||||
TinyIRReceiverControl.IRRawData.UWord.HighWord,
|
||||
TinyIRReceiverData.Command = TinyIRReceiverControl.IRRawData.UWord.HighWord;
|
||||
# endif
|
||||
#else
|
||||
|
||||
// Here we have NO address
|
||||
#else
|
||||
// Here we have NO address
|
||||
# if TINY_RECEIVER_COMMAND_HAS_8_BIT_PARITY
|
||||
// Here we have 8 bit command
|
||||
TinyIRReceiverControl.IRRawData.UBytes[0],
|
||||
// Here we have 8 bit command
|
||||
TinyIRReceiverData.Command = TinyIRReceiverControl.IRRawData.UBytes[0];
|
||||
# else
|
||||
// Here we have 16 bit command
|
||||
TinyIRReceiverControl.IRRawData.UWord,
|
||||
// Here we have 16 bit command
|
||||
TinyIRReceiverData.Command = TinyIRReceiverControl.IRRawData.UWord;
|
||||
# endif
|
||||
#endif
|
||||
TinyIRReceiverControl.Flags);
|
||||
#if defined(USE_CALLBACK_FOR_TINY_RECEIVER)
|
||||
handleReceivedTinyIRData();
|
||||
#endif
|
||||
|
||||
} else {
|
||||
// not finished yet
|
||||
|
@ -429,27 +434,22 @@ bool initPCIInterruptForTinyReceiver() {
|
|||
return enablePCIInterruptForTinyReceiver();
|
||||
}
|
||||
|
||||
#if defined(USE_FAST_PROTOCOL)
|
||||
void printTinyReceiverResultMinimal(Print *aSerial, uint16_t aCommand, uint8_t aFlags)
|
||||
#else
|
||||
void printTinyReceiverResultMinimal(Print *aSerial, uint8_t aAddress, uint8_t aCommand, uint8_t aFlags)
|
||||
#endif
|
||||
{
|
||||
void printTinyReceiverResultMinimal(Print *aSerial) {
|
||||
// Print only very short output, since we are in an interrupt context and do not want to miss the next interrupts of the repeats coming soon
|
||||
// Print only very short output, since we are in an interrupt context and do not want to miss the next interrupts of the repeats coming soon
|
||||
#if defined(USE_FAST_PROTOCOL)
|
||||
aSerial->print(F("C=0x"));
|
||||
#else
|
||||
aSerial->print(F("A=0x"));
|
||||
aSerial->print(aAddress, HEX);
|
||||
aSerial->print(TinyIRReceiverData.Address, HEX);
|
||||
aSerial->print(F(" C=0x"));
|
||||
#endif
|
||||
aSerial->print(aCommand, HEX);
|
||||
if (aFlags == IRDATA_FLAGS_IS_REPEAT) {
|
||||
aSerial->print(TinyIRReceiverData.Command, HEX);
|
||||
if (TinyIRReceiverData.Flags == IRDATA_FLAGS_IS_REPEAT) {
|
||||
aSerial->print(F(" R"));
|
||||
}
|
||||
#if !defined(DISABLE_PARITY_CHECKS)
|
||||
if (aFlags == IRDATA_FLAGS_PARITY_FAILED) {
|
||||
if (TinyIRReceiverData.Flags == IRDATA_FLAGS_PARITY_FAILED) {
|
||||
aSerial->print(F(" P"));
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -77,7 +77,7 @@
|
|||
// !!! We assume that the real implementations never set the official first header bit to anything other than 0 !!!
|
||||
// !!! We therefore use 4 start bits instead of the specified 3 and in turn ignore the first header bit of the specification !!!
|
||||
|
||||
// IR messages are 16 bits long and datalink messages have different lengths
|
||||
// IR messages are 16 bits long. Datalink messages have different lengths.
|
||||
// This implementation supports up to 40 bits total length split into 8 bit data/command and a header/address of variable length
|
||||
// Header data with more than 16 bits is stored in decodedIRData.extra
|
||||
|
||||
|
@ -87,8 +87,9 @@
|
|||
|
||||
/*
|
||||
* Options for this decoder
|
||||
*
|
||||
*/
|
||||
//#define ENABLE_BEO_WITHOUT_FRAME_GAP // Requires additional 30 bytes program memory.
|
||||
#define ENABLE_BEO_WITHOUT_FRAME_GAP // Requires additional 30 bytes program memory. Enabled by default, see https://github.com/Arduino-IRremote/Arduino-IRremote/discussions/1181
|
||||
//#define SUPPORT_BEO_DATALINK_TIMING_FOR_DECODE // This also supports headers up to 32 bit. Requires additional 150 bytes program memory.
|
||||
#if defined(DECODE_BEO)
|
||||
# if defined(ENABLE_BEO_WITHOUT_FRAME_GAP)
|
||||
|
|
|
@ -180,7 +180,7 @@ void disableSendPWMByTimer() {
|
|||
|
||||
#elif defined(__AVR_ATtiny816__) || defined(__AVR_ATtiny1614__) || defined(__AVR_ATtiny1616__) || defined(__AVR_ATtiny3216__) || defined(__AVR_ATtiny3217__) // e.g. TinyCore boards
|
||||
# if !defined(IR_USE_AVR_TIMER_A) && !defined(IR_USE_AVR_TIMER_D)
|
||||
#define IR_USE_AVR_TIMER_A // use this if you use MegaTinyCore, Tone is on TCB and millis() on TCD
|
||||
#define IR_USE_AVR_TIMER_A // use this if you use megaTinyCore, Tone is on TCB and millis() on TCD
|
||||
//#define IR_USE_AVR_TIMER_D // use this if you use TinyCore
|
||||
# endif
|
||||
|
||||
|
|
Loading…
Reference in New Issue