初始化提交
This commit is contained in:
@@ -0,0 +1,148 @@
|
||||
/*
|
||||
* IRremoteESP8266: SmartIRRepeater.ino - Record and playback IR codes.
|
||||
* Copyright 2019 David Conran (crankyoldgit)
|
||||
*
|
||||
* This program will try to capture incoming IR messages and tries to
|
||||
* intelligently replay them back.
|
||||
* It uses the advanced detection features of the library, and the custom
|
||||
* sending routines. Thus it will try to use the correct frequencies,
|
||||
* duty cycles, and repeats as it thinks is required.
|
||||
* Anything it doesn't understand, it will try to replay back as best it can,
|
||||
* but at 38kHz.
|
||||
* Note:
|
||||
* That might NOT be the frequency of the incoming message, so some not
|
||||
* recogised messages that are replayed may not work. The frequency & duty
|
||||
* cycle of unknown incoming messages is lost at the point of the Hardware IR
|
||||
* demodulator. The ESP can't see it.
|
||||
*
|
||||
* W A R N I N G
|
||||
* This code is just for educational/example use only. No help will be given
|
||||
* to you to make it do something else, or to make it work with some
|
||||
* weird device or circuit, or to make it more usable or practical.
|
||||
* If it works for you. Great. If not, Congratulations on changing/fixing it.
|
||||
*
|
||||
* An IR detector/demodulator must be connected to the input, kRecvPin.
|
||||
* An IR LED circuit must be connected to the output, kIrLedPin.
|
||||
*
|
||||
* Example circuit diagrams (both are needed):
|
||||
* https://github.com/crankyoldgit/IRremoteESP8266/wiki#ir-receiving
|
||||
* https://github.com/crankyoldgit/IRremoteESP8266/wiki#ir-sending
|
||||
*
|
||||
* Common mistakes & tips:
|
||||
* * Don't just connect the IR LED directly to the pin, it won't
|
||||
* have enough current to drive the IR LED effectively.
|
||||
* * Make sure you have the IR LED polarity correct.
|
||||
* See: https://learn.sparkfun.com/tutorials/polarity/diode-and-led-polarity
|
||||
* * Some digital camera/phones can be used to see if the IR LED is flashed.
|
||||
* Replace the IR LED with a normal LED if you don't have a digital camera
|
||||
* when debugging.
|
||||
* * Avoid using the following pins unless you really know what you are doing:
|
||||
* * Pin 0/D3: Can interfere with the boot/program mode & support circuits.
|
||||
* * Pin 1/TX/TXD0: Any serial transmissions from the ESP will interfere.
|
||||
* * Pin 3/RX/RXD0: Any serial transmissions to the ESP will interfere.
|
||||
* * Pin 16/D0: Has no interrupts on the ESP8266, so can't be used for IR
|
||||
* receiving with this library.
|
||||
* * ESP-01 modules are tricky. We suggest you use a module with more GPIOs
|
||||
* for your first time. e.g. ESP-12 etc.
|
||||
*
|
||||
* Changes:
|
||||
* Version 1.0: June, 2019
|
||||
* - Initial version.
|
||||
*/
|
||||
|
||||
#include <Arduino.h>
|
||||
#include <IRsend.h>
|
||||
#include <IRrecv.h>
|
||||
#include <IRremoteESP8266.h>
|
||||
#include <IRutils.h>
|
||||
|
||||
// ==================== start of TUNEABLE PARAMETERS ====================
|
||||
|
||||
// The GPIO an IR detector/demodulator is connected to. Recommended: 14 (D5)
|
||||
// Note: GPIO 16 won't work on the ESP8266 as it does not have interrupts.
|
||||
const uint16_t kRecvPin = 14;
|
||||
|
||||
// GPIO to use to control the IR LED circuit. Recommended: 4 (D2).
|
||||
const uint16_t kIrLedPin = 4;
|
||||
|
||||
// The Serial connection baud rate.
|
||||
// NOTE: Make sure you set your Serial Monitor to the same speed.
|
||||
const uint32_t kBaudRate = 115200;
|
||||
|
||||
// As this program is a special purpose capture/resender, let's use a larger
|
||||
// than expected buffer so we can handle very large IR messages.
|
||||
const uint16_t kCaptureBufferSize = 1024; // 1024 == ~511 bits
|
||||
|
||||
// kTimeout is the Nr. of milli-Seconds of no-more-data before we consider a
|
||||
// message ended.
|
||||
const uint8_t kTimeout = 50; // Milli-Seconds
|
||||
|
||||
// kFrequency is the modulation frequency all UNKNOWN messages will be sent at.
|
||||
const uint16_t kFrequency = 38000; // in Hz. e.g. 38kHz.
|
||||
|
||||
// ==================== end of TUNEABLE PARAMETERS ====================
|
||||
|
||||
// The IR transmitter.
|
||||
IRsend irsend(kIrLedPin);
|
||||
// The IR receiver.
|
||||
IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, false);
|
||||
// Somewhere to store the captured message.
|
||||
decode_results results;
|
||||
|
||||
// This section of code runs only once at start-up.
|
||||
void setup() {
|
||||
irrecv.enableIRIn(); // Start up the IR receiver.
|
||||
irsend.begin(); // Start up the IR sender.
|
||||
|
||||
Serial.begin(kBaudRate, SERIAL_8N1);
|
||||
while (!Serial) // Wait for the serial connection to be establised.
|
||||
delay(50);
|
||||
Serial.println();
|
||||
|
||||
Serial.print("SmartIRRepeater is now running and waiting for IR input "
|
||||
"on Pin ");
|
||||
Serial.println(kRecvPin);
|
||||
Serial.print("and will retransmit it on Pin ");
|
||||
Serial.println(kIrLedPin);
|
||||
}
|
||||
|
||||
// The repeating section of the code
|
||||
void loop() {
|
||||
// Check if an IR message has been received.
|
||||
if (irrecv.decode(&results)) { // We have captured something.
|
||||
// The capture has stopped at this point.
|
||||
decode_type_t protocol = results.decode_type;
|
||||
uint16_t size = results.bits;
|
||||
bool success = true;
|
||||
// Is it a protocol we don't understand?
|
||||
if (protocol == decode_type_t::UNKNOWN) { // Yes.
|
||||
// Convert the results into an array suitable for sendRaw().
|
||||
// resultToRawArray() allocates the memory we need for the array.
|
||||
uint16_t *raw_array = resultToRawArray(&results);
|
||||
// Find out how many elements are in the array.
|
||||
size = getCorrectedRawLength(&results);
|
||||
#if SEND_RAW
|
||||
// Send it out via the IR LED circuit.
|
||||
irsend.sendRaw(raw_array, size, kFrequency);
|
||||
#endif // SEND_RAW
|
||||
// Deallocate the memory allocated by resultToRawArray().
|
||||
delete [] raw_array;
|
||||
} else if (hasACState(protocol)) { // Does the message require a state[]?
|
||||
// It does, so send with bytes instead.
|
||||
success = irsend.send(protocol, results.state, size / 8);
|
||||
} else { // Anything else must be a simple message protocol. ie. <= 64 bits
|
||||
success = irsend.send(protocol, results.value, size);
|
||||
}
|
||||
// Resume capturing IR messages. It was not restarted until after we sent
|
||||
// the message so we didn't capture our own message.
|
||||
irrecv.resume();
|
||||
|
||||
// Display a crude timestamp & notification.
|
||||
uint32_t now = millis();
|
||||
Serial.printf(
|
||||
"%06u.%03u: A %d-bit %s message was %ssuccessfully retransmitted.\n",
|
||||
now / 1000, now % 1000, size, typeToString(protocol).c_str(),
|
||||
success ? "" : "un");
|
||||
}
|
||||
yield(); // Or delay(milliseconds); This ensures the ESP doesn't WDT reset.
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
[platformio]
|
||||
src_dir = .
|
||||
|
||||
[env]
|
||||
lib_extra_dirs = ../../
|
||||
lib_ldf_mode = deep+
|
||||
lib_ignore = examples
|
||||
framework = arduino
|
||||
monitor_speed = 115200
|
||||
build_flags = ; -D_IR_LOCALE_=en-AU
|
||||
|
||||
[env:nodemcuv2]
|
||||
platform = espressif8266
|
||||
board = nodemcuv2
|
||||
|
||||
[env:esp32dev]
|
||||
platform = espressif32
|
||||
board = esp32dev
|
||||
|
||||
; Build the program forcing the compiler to treat all warnings as errors.
|
||||
[env:shakedown_all_protocols]
|
||||
platform = espressif8266
|
||||
board = nodemcuv2
|
||||
build_flags =
|
||||
${env.build_flags}
|
||||
-Werror
|
||||
|
||||
; Disable all protocols to see if we can force any errors.
|
||||
; Build the program forcing the compiler to treat all warnings as errors.
|
||||
[env:shakedown_no_protocols]
|
||||
platform = espressif8266
|
||||
board = nodemcuv2
|
||||
build_flags =
|
||||
${env.build_flags}
|
||||
-Werror
|
||||
-D_IR_ENABLE_DEFAULT_=false
|
||||
Reference in New Issue
Block a user