| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- /*
- * IRremoteESP8266: IRrecvDumpV2 - dump details of IR codes with IRrecv
- * An IR detector/demodulator must be connected to the input kRecvPin.
- *
- * Copyright 2009 Ken Shirriff, http://arcfn.com
- * Copyright 2017 David Conran
- *
- * Example circuit diagram:
- * https://github.com/markszabo/IRremoteESP8266/wiki#ir-receiving
- *
- * Changes:
- * Version 0.4 July, 2018
- * - Minor improvements and more A/C unit support.
- * Version 0.3 November, 2017
- * - Support for A/C decoding for some protcols.
- * Version 0.2 April, 2017
- * - Decode from a copy of the data so we can start capturing faster thus
- * reduce the likelihood of miscaptures.
- * Based on Ken Shirriff's IrsendDemo Version 0.1 July, 2009,
- */
- #ifndef UNIT_TEST
- #include <Arduino.h>
- #endif
- #include <IRrecv.h>
- #include <IRremoteESP8266.h>
- #include <IRutils.h>
- // The following are only needed for extended decoding of A/C Messages
- #include <ir_Coolix.h>
- #include <ir_Daikin.h>
- #include <ir_Fujitsu.h>
- #include <ir_Gree.h>
- #include <ir_Haier.h>
- #include <ir_Hitachi.h>
- #include <ir_Kelvinator.h>
- #include <ir_Midea.h>
- #include <ir_Mitsubishi.h>
- #include <ir_Panasonic.h>
- #include <ir_Samsung.h>
- #include <ir_Toshiba.h>
- // ==================== start of TUNEABLE PARAMETERS ====================
- // An IR detector/demodulator is connected to GPIO pin 14
- // e.g. D5 on a NodeMCU board.
- const uint16_t kRecvPin = 14;
- // The Serial connection baud rate.
- // i.e. Status message will be sent to the PC at this baud rate.
- // Try to avoid slow speeds like 9600, as you will miss messages and
- // cause other problems. 115200 (or faster) is recommended.
- // 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/decoder, let us use a larger
- // than normal buffer so we can handle Air Conditioner remote codes.
- const uint16_t kCaptureBufferSize = 1024;
- // kTimeout is the Nr. of milli-Seconds of no-more-data before we consider a
- // message ended.
- // This parameter is an interesting trade-off. The longer the timeout, the more
- // complex a message it can capture. e.g. Some device protocols will send
- // multiple message packets in quick succession, like Air Conditioner remotes.
- // Air Coniditioner protocols often have a considerable gap (20-40+ms) between
- // packets.
- // The downside of a large timeout value is a lot of less complex protocols
- // send multiple messages when the remote's button is held down. The gap between
- // them is often also around 20+ms. This can result in the raw data be 2-3+
- // times larger than needed as it has captured 2-3+ messages in a single
- // capture. Setting a low timeout value can resolve this.
- // So, choosing the best kTimeout value for your use particular case is
- // quite nuanced. Good luck and happy hunting.
- // NOTE: Don't exceed kMaxTimeoutMs. Typically 130ms.
- #if DECODE_AC
- // Some A/C units have gaps in their protocols of ~40ms. e.g. Kelvinator
- // A value this large may swallow repeats of some protocols
- const uint8_t kTimeout = 50;
- #else // DECODE_AC
- // Suits most messages, while not swallowing many repeats.
- const uint8_t kTimeout = 15;
- #endif // DECODE_AC
- // Alternatives:
- // const uint8_t kTimeout = 90;
- // Suits messages with big gaps like XMP-1 & some aircon units, but can
- // accidentally swallow repeated messages in the rawData[] output.
- //
- // const uint8_t kTimeout = kMaxTimeoutMs;
- // This will set it to our currently allowed maximum.
- // Values this high are problematic because it is roughly the typical boundary
- // where most messages repeat.
- // e.g. It will stop decoding a message and start sending it to serial at
- // precisely the time when the next message is likely to be transmitted,
- // and may miss it.
- // Set the smallest sized "UNKNOWN" message packets we actually care about.
- // This value helps reduce the false-positive detection rate of IR background
- // noise as real messages. The chances of background IR noise getting detected
- // as a message increases with the length of the kTimeout value. (See above)
- // The downside of setting this message too large is you can miss some valid
- // short messages for protocols that this library doesn't yet decode.
- //
- // Set higher if you get lots of random short UNKNOWN messages when nothing
- // should be sending a message.
- // Set lower if you are sure your setup is working, but it doesn't see messages
- // from your device. (e.g. Other IR remotes work.)
- // NOTE: Set this value very high to effectively turn off UNKNOWN detection.
- const uint16_t kMinUnknownSize = 12;
- // ==================== end of TUNEABLE PARAMETERS ====================
- // Use turn on the save buffer feature for more complete capture coverage.
- IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
- decode_results results; // Somewhere to store the results
- // Display the human readable state of an A/C message if we can.
- void dumpACInfo(decode_results *results) {
- String description = "";
- #if DECODE_DAIKIN
- if (results->decode_type == DAIKIN) {
- IRDaikinESP ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_DAIKIN
- #if DECODE_FUJITSU_AC
- if (results->decode_type == FUJITSU_AC) {
- IRFujitsuAC ac(0);
- ac.setRaw(results->state, results->bits / 8);
- description = ac.toString();
- }
- #endif // DECODE_FUJITSU_AC
- #if DECODE_KELVINATOR
- if (results->decode_type == KELVINATOR) {
- IRKelvinatorAC ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_KELVINATOR
- #if DECODE_MITSUBISHI_AC
- if (results->decode_type == MITSUBISHI_AC) {
- IRMitsubishiAC ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_MITSUBISHI_AC
- #if DECODE_TOSHIBA_AC
- if (results->decode_type == TOSHIBA_AC) {
- IRToshibaAC ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_TOSHIBA_AC
- #if DECODE_GREE
- if (results->decode_type == GREE) {
- IRGreeAC ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_GREE
- #if DECODE_MIDEA
- if (results->decode_type == MIDEA) {
- IRMideaAC ac(0);
- ac.setRaw(results->value); // Midea uses value instead of state.
- description = ac.toString();
- }
- #endif // DECODE_MIDEA
- #if DECODE_HAIER_AC
- if (results->decode_type == HAIER_AC) {
- IRHaierAC ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_HAIER_AC
- #if DECODE_HAIER_AC_YRW02
- if (results->decode_type == HAIER_AC_YRW02) {
- IRHaierACYRW02 ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_HAIER_AC_YRW02
- #if DECODE_SAMSUNG_AC
- if (results->decode_type == SAMSUNG_AC) {
- IRSamsungAc ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_SAMSUNG_AC
- #if DECODE_COOLIX
- if (results->decode_type == COOLIX) {
- IRCoolixAC ac(0);
- ac.setRaw(results->value); // Coolix uses value instead of state.
- description = ac.toString();
- }
- #endif // DECODE_COOLIX
- #if DECODE_PANASONIC_AC
- if (results->decode_type == PANASONIC_AC &&
- results->bits > kPanasonicAcShortBits) {
- IRPanasonicAc ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_PANASONIC_AC
- #if DECODE_HITACHI_AC
- if (results->decode_type == HITACHI_AC) {
- IRHitachiAc ac(0);
- ac.setRaw(results->state);
- description = ac.toString();
- }
- #endif // DECODE_HITACHI_AC
- // If we got a human-readable description of the message, display it.
- if (description != "") Serial.println("Mesg Desc.: " + description);
- }
- // The section of code run only once at start-up.
- void setup() {
- Serial.begin(kBaudRate, SERIAL_8N1, SERIAL_TX_ONLY);
- while (!Serial) // Wait for the serial connection to be establised.
- delay(50);
- Serial.println();
- Serial.print("IRrecvDumpV2 is now running and waiting for IR input on Pin ");
- Serial.println(kRecvPin);
- #if DECODE_HASH
- // Ignore messages with less than minimum on or off pulses.
- irrecv.setUnknownThreshold(kMinUnknownSize);
- #endif // DECODE_HASH
- irrecv.enableIRIn(); // Start the receiver
- }
- // The repeating section of the code
- //
- void loop() {
- // Check if the IR code has been received.
- if (irrecv.decode(&results)) {
- // Display a crude timestamp.
- uint32_t now = millis();
- Serial.printf("Timestamp : %06u.%03u\n", now / 1000, now % 1000);
- if (results.overflow)
- Serial.printf(
- "WARNING: IR code is too big for buffer (>= %d). "
- "This result shouldn't be trusted until this is resolved. "
- "Edit & increase kCaptureBufferSize.\n",
- kCaptureBufferSize);
- // Display the basic output of what we found.
- Serial.print(resultToHumanReadableBasic(&results));
- dumpACInfo(&results); // Display any extra A/C info if we have it.
- yield(); // Feed the WDT as the text output can take a while to print.
- // Display the library version the message was captured with.
- Serial.print("Library : v");
- Serial.println(_IRREMOTEESP8266_VERSION_);
- Serial.println();
- // Output RAW timing info of the result.
- Serial.println(resultToTimingInfo(&results));
- yield(); // Feed the WDT (again)
- // Output the results as source code
- Serial.println(resultToSourceCode(&results));
- Serial.println(""); // Blank line between entries
- yield(); // Feed the WDT (again)
- }
- }
|