Air conditioner control by Wemos D1 R1 ESP8266

I assembled board + thermometer AM2320 + IR receiver VS1838B + IR emitter (D7 pin). I used 2 different sketches to read raw codes from RC of AC and took 2 different type of data.

In sketches number of pins may varys coz I did some experiments with different pins and mb uploaded here not last sctech with actual pin number.

I don't know C++ all code provided by vibe coding of gemini & qwen AIs
with this sketch

Main problem that board sends codes but AC doesn't react at all, but camera of smartphone shows that IR emitter lights shortly.

#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRrecv.h>
#include <IRutils.h>

// IR receiver pin number (D7 = GPIO13)
const uint16_t kRecvPin = 13;

// Buffer settings
const uint16_t kCaptureBufferSize = 1024;
const uint8_t kTimeout = 50;  // for air conditioners
const uint8_t kMinUnknownSize = 12;
const uint8_t kTolerancePercentage = kTolerance;

IRrecv irrecv(kRecvPin, kCaptureBufferSize, kTimeout, true);
decode_results results;

void setup() {
  Serial.begin(115200);
  delay(200);  // Allow Serial to start

  irrecv.setUnknownThreshold(kMinUnknownSize);
  irrecv.setTolerance(kTolerancePercentage);
  irrecv.enableIRIn();

  Serial.println("IRrecvDump is ready. Press remote buttons...");
}

void loop() {
  if (irrecv.decode(&results)) {
    Serial.println(resultToHumanReadableBasic(&results));
    Serial.println(resultToSourceCode(&results));
    Serial.println();  // empty line for readability
    irrecv.resume();    // ready for next reception
  }
}
I took power off code
Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)

uint16_t rawData[227] = {3086, 1616,  472, 1114,  472, 1114,  472, 326,  492, 326,  492, 326,  492, 1114,  472, 326,  494, 324,  494, 1114,  474, 1114,  472, 326,  494, 1114,  472, 326,  494, 326,  494, 1114,  472, 1114,  472, 326,  494, 1114,  474, 1114,  472, 326,  494, 326,  494, 1114,  472, 326,  494, 326,  494, 324,  494, 1114,  472, 326,  494, 324,  494, 324,  496, 324,  494, 324,  494, 326,  494, 326,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 326,  492, 328,  492, 326,  494, 324,  496, 324,  494, 324,  494, 326,  494, 324,  494, 1114,  472, 326,  494, 324,  494, 326,  494, 324,  496, 324,  494, 324,  494, 326,  494, 1114,  474, 324,  494, 326,  492, 326,  496, 324,  494, 324,  496, 324,  494, 326,  496, 324,  494, 326,  494, 1114,  474, 1114,  472, 326,  494, 324,  496, 324,  494, 324,  494, 324,  494, 1112,  474, 324,  494, 326,  494, 326,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 326,  494, 324,  496, 324,  494, 324,  494, 324,  494, 326,  494, 326,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 326,  494, 326,  494, 326,  494, 324,  494, 326,  494, 326,  494, 324,  494, 324,  496, 324,  494, 1114,  474, 324,  494, 1092,  492, 326,  494, 324,  494};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};

power on

Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)

uint16_t rawData[227] = {3086, 1616,  472, 1114,  472, 1114,  472, 326,  494, 326,  494, 326,  494, 1114,  472, 326,  494, 326,  492, 1114,  472, 1114,  472, 328,  492, 1114,  470, 328,  492, 328,  492, 1116,  470, 1116,  470, 328,  492, 1116,  470, 1116,  470, 328,  492, 326,  492, 1116,  470, 328,  492, 326,  492, 326,  492, 1116,  470, 328,  492, 328,  492, 328,  492, 326,  492, 326,  492, 328,  492, 326,  492, 328,  492, 328,  492, 328,  492, 326,  492, 326,  492, 328,  490, 328,  492, 328,  492, 326,  492, 326,  492, 328,  490, 328,  492, 326,  492, 1116,  472, 326,  492, 326,  492, 328,  492, 326,  492, 326,  492, 328,  492, 328,  494, 1114,  472, 326,  492, 326,  492, 326,  494, 326,  492, 328,  492, 326,  492, 326,  492, 328,  492, 326,  492, 1116,  470, 1114,  472, 326,  492, 326,  492, 326,  492, 328,  494, 326,  492, 1114,  472, 326,  492, 328,  492, 326,  494, 326,  492, 328,  492, 324,  494, 326,  494, 326,  492, 326,  494, 324,  494, 326,  492, 328,  492, 326,  492, 328,  492, 328,  468, 350,  470, 350,  470, 350,  470, 348,  494, 326,  496, 324,  496, 324,  496, 324,  496, 324,  494, 324,  494, 326,  494, 326,  492, 326,  492, 328,  492, 328,  492, 328,  492, 326,  492, 328,  490, 328,  490, 328,  492, 1114,  472, 328,  490, 1114,  472, 328,  490, 330,  490};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};


but with this sketch power  functions look different
#include <IRremoteESP8266.h> // Main library for IR reception on ESP
#include <IRrecv.h>          // Class for IR receiver

// Define the pin to which the IR receiver's output (OUT) is connected
// D4 corresponds to GPIO2 on WeMos D1 R2. (Note: The original comment said D2/GPIO4, but D4 is GPIO2 on WeMos D1 R2)
// This is a good choice for an IR receiver on ESP8266.
const uint16_t IR_RECEIVE_PIN = D4; // Using D4

// Create an IRrecv object for receiving signals
IRrecv irrecv(IR_RECEIVE_PIN);

// Buffer to store raw data needed for decoding
decode_results results;

// Manually define USECPERTICK. Typically 1 tick = 50 microseconds.
// This value is fundamental for IR protocols.
#define MY_USECPERTICK 50

void setup() {
  Serial.begin(115200);
  while (!Serial) {
    delay(10);
  }

  Serial.println("--- IR Receiver (IRremoteESP8266 - Fully Manual RAW Output, with Hardcoded USECPERTICK) ---");
  Serial.print("IR receiver connected to D");
  Serial.print(digitalPinToInterrupt(IR_RECEIVE_PIN)); // Print D-pin number
  Serial.print(" (GPIO");
  Serial.print(IR_RECEIVE_PIN); // Print GPIO number
  Serial.println(")");
  Serial.println("\nWaiting for IR signals...");

  // Enable IR signal reception
  irrecv.enableIRIn();
}

void loop() {
  // Check if there is a new IR signal
  if (irrecv.decode(&results)) { // If signal received and decoded

    Serial.print("\nReceived IR signal: ");

    // Print protocol type (numeric code) and HEX value
    Serial.print("Protocol (type): "); Serial.print((uint8_t)results.decode_type);
    Serial.print(" - Value (HEX): 0x");
    Serial.print(results.value, HEX);
    Serial.print(", Length (bits): ");
    Serial.println(results.bits);

    // If value = 0xFFFFFFFF, this often means a repeat signal
    if (results.value == 0xFFFFFFFF) {
      Serial.println("   (This is a repeat signal)");
    }

    // Print raw data (RAW pulses)
    Serial.print("   RAW data (pulses, us): [");
    for (uint16_t i = 0; i < results.rawlen; i++) {
      // Use our manually defined value
      Serial.print(results.rawbuf[i] * MY_USECPERTICK);
      if (i < results.rawlen - 1) {
        Serial.print(", ");
      }
    }
    Serial.println("]");

    irrecv.resume(); // Important: Continue receiving the next signal
  }

  yield(); // Required for ESP8266
}

OFF

Protocol (type): 5 - Value (HEX): 0xC4D364400002, Length (bits): 48
  RAW data (pulses, µs):  [50, 77150, 39800, 12400, 27300, 12350, 27350, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 26650, 12350, 8100, 13050, 7450, 13050, 26600, 12400, 27300, 12350, 8100, 13000, 26650, 12350, 8100, 13050, 7450, 13050, 26600, 12350, 27300, 12400, 8100, 13050, 26600, 12450, 27250, 12350, 8100, 13050, 7450, 13050, 26600, 12400, 8100, 13050, 7450, 13050, 7450, 13050, 26650, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13100, 7350, 13050, 7450, 13000, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13000, 7450, 13000, 7450, 13050, 7400, 13050, 7400, 13050, 7450, 13050, 26600, 12350, 8100, 13050]

Protocol (type): 5 - Value (HEX): 0xC4D364800004, Length (bits): 48
  RAW data (pulses, µs):  [50, 77200, 39800, 12400, 27300, 12400, 27250, 12400, 8100, 13000, 7450, 13050, 7450, 13000, 26600, 12400, 8100, 13050, 7400, 13050, 26600, 12400, 27250, 12350, 8100, 13050, 26600, 12400, 8100, 13000, 7450, 13050, 26600, 12350, 27300, 12350, 8100, 13050, 26650, 12350, 27300, 12400, 8100, 13000, 7450, 13000, 26650, 12350, 8100, 13050, 7450, 13000, 26650, 12400, 8100, 12450, 8000, 13050, 7450, 13050, 7450, 12450, 8000, 13050, 7400, 13050, 7450, 12450, 8000, 13050, 7450, 12450, 8050, 12450, 8000, 12450, 8000, 12450, 8050, 13000, 7450, 12450, 8050, 12400, 8050, 12500, 8000, 12450, 8000, 12450, 8000, 12450, 8050, 12400, 27200, 12350, 8100, 12450, 8050, 12450]

ON


Received IR signal: Protocol (type): 5 - Value (HEX): 0xC4D364400002, Length (bits): 48
  RAW data (pulses, µs): [50, 77150, 39800, 12450, 27250, 12350, 27250, 12400, 8100, 13050, 7400, 13050, 7450, 13050, 26600, 12350, 8100, 13050, 7400, 13050, 26550, 12400, 27300, 12350, 8100, 13050, 26600, 12350, 8100, 13050, 7400, 13050, 26600, 12350, 27300, 12350, 8100, 13050, 26600, 12400, 27300, 12350, 8100, 13050, 7400, 13050, 26600, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 26600, 12400, 8100, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7400, 13050, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13050, 7400, 12500, 8000, 12400, 8050, 13050, 7450, 12450, 8000, 13050, 7450, 12400, 27250, 12350, 8100, 13050]

Received IR signal: Protocol (type): 5 - Value (HEX): 0xC4D364800024, Length (bits): 48
  RAW data (pulses, µs): [50, 77900, 39150, 13000, 26650, 13050, 26650, 12400, 8050, 12400, 8100, 12350, 8100, 12450, 27200, 12400, 8100, 12400, 8100, 12400, 27250, 12400, 27250, 12400, 8100, 12350, 27250, 12400, 8100, 12350, 8100, 12350, 27250, 12400, 27250, 12400, 8100, 12400, 27250, 12400, 27250, 12400, 8100, 12400, 8100, 12400, 27250, 12400, 8100, 12400, 8100, 12400, 27250, 12400, 8100, 12400, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12400, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12350, 8100, 12400, 8100, 12350, 8100, 12350, 8150, 12350, 8150, 12350, 27300, 12350, 8100, 12350, 8150, 12350, 27250, 12350, 8150, 12350, 8150, 12350]

may be I an on wrong direction and AIs suggested for me to use not right sketch pls point me where to go.
AC model Family Comfort Plus 32

You cannot send TCL112AC using a generic sendNEC() or send() with 48-bit or 112-bit values. The encoding is different. Use IRremoteESP8266's sendRaw() or sendTCL112AC(). If your IRsend object is properly initialized, you can use:

IRsend irsend(4);  // Replace 4 with the GPIO used for IR emitter (e.g. D7 = GPIO13)

void setup() {
  irsend.begin();
}

void loop() {
  irsend.sendRaw(rawData, 227, 38);  // 38 = frequency in kHz
  delay(5000);
}

Please correct your first post and add code tags around your code.

There is a small pencil image below your existing posts.

  • click on this pencil ➜ that will let you edit your post.
  • Select the part of the text that corresponds to the code
  • Click on the <code/> icon in the toolbar to indicate that it is code
  • click image Save Edit

(Also make sure to properly indent the code in the IDE before copying and pasting it here. This can be done by pressing ctrlT on a PC or cmdT on a Mac)

I use/used this sketch, sorry I forgot to say about it in 1st post

#include <IRremoteESP8266.h>
#include <IRsend.h>

// === Settings ===
// It's good practice to use GPIO numbers directly for clarity and portability
// D7 on NodeMCU/Wemos D1 Mini typically maps to GPIO13.
// Change this if your board's D7 is a different GPIO pin.
const int IR_LED_PIN = 13; // Pin for the IR LED (GPIO13 on many ESP8266 boards, often labelled D7)

// === IR Send Object ===
// Initialize IRsend with the specified pin.
IRsend irsend(IR_LED_PIN);

// === RAW data for turning ON ===
// This array contains the pulse timings (microseconds) for the "ON" command.
uint16_t acRawOn[] = {
  3086, 1616, 472, 1114, 472, 1114, 472, 326, 494, 326, 494, 326, 494, 1114, 472, 326,
  494, 326, 492, 1114, 472, 1114, 472, 328, 492, 1114, 470, 328, 492, 328, 492, 1116,
  470, 1116, 470, 328, 492, 1116, 470, 1116, 470, 328, 492, 326, 492, 1116, 470, 328,
  492, 326, 492, 326, 492, 1116, 470, 328, 492, 328, 492, 328, 492, 326, 492, 326,
  492, 328, 492, 326, 492, 328, 492, 328, 492, 326, 492, 326, 492, 328, 490, 328,
  492, 328, 492, 326, 492, 326, 492, 328, 490, 328, 492, 326, 492, 1116, 472, 326,
  492, 326, 492, 328, 492, 326, 492, 326, 492, 328, 492, 328, 494, 1114, 472, 326,
  492, 326, 492, 326, 494, 326, 492, 328, 492, 326, 492, 326, 492, 328, 492, 326,
  492, 1116, 470, 1114, 472, 326, 492, 326, 492, 326, 492, 328, 494, 326, 492, 1114,
  472, 326, 492, 328, 492, 326, 494, 326, 492, 328, 492, 324, 494, 326, 494, 326,
  492, 326, 494, 324, 494, 326, 492, 328, 492, 326, 492, 328, 492, 328, 468, 350,
  470, 350, 470, 348, 494, 326, 496, 324, 496, 324, 496, 324, 496, 324, 494, 324,
  494, 326, 494, 326, 492, 326, 492, 328, 492, 328, 492, 328, 492, 326, 492, 328,
  490, 328, 490, 328, 492, 1114, 472, 328, 490, 1114, 472, 328, 490, 330, 490
};
// Calculate the length of the raw data array
const int acRawOnLength = sizeof(acRawOn) / sizeof(acRawOn[0]);

// === RAW data for turning OFF ===
// This array contains the pulse timings (microseconds) for the "OFF" command.
uint16_t acRawOff[] = {
  3086, 1616, 472, 1114, 472, 1114, 472, 326, 492, 326, 492, 326, 492, 1114, 472, 326,
  494, 324, 494, 1114, 474, 1114, 472, 326, 494, 1114, 472, 326, 494, 326, 494, 1114,
  472, 1114, 472, 326, 494, 1114, 474, 1114, 472, 326, 494, 326, 494, 1114, 472, 326,
  494, 326, 494, 324, 494, 1114, 472, 326, 494, 324, 494, 324, 496, 324, 494, 324,
  494, 326, 494, 326, 494, 324, 494, 324, 494, 324, 494, 324, 496, 324, 494, 326,
  492, 328, 492, 326, 494, 324, 496, 324, 494, 324, 494, 326, 494, 324, 494, 1114,
  472, 326, 494, 324, 494, 326, 494, 324, 496, 324, 494, 324, 494, 326, 494, 1114,
  474, 324, 494, 326, 492, 326, 496, 324, 494, 324, 496, 324, 494, 326, 496, 324,
  494, 326, 494, 1114, 474, 1114, 472, 326, 494, 324, 496, 324, 494, 324, 494, 324,
  494, 1112, 474, 324, 494, 326, 494, 326, 494, 324, 494, 324, 494, 324, 496, 324,
  494, 324, 494, 326, 494, 324, 496, 324, 494, 324, 494, 324, 494, 326, 494, 326,
  494, 324, 494, 324, 494, 324, 496, 324, 494, 324, 494, 324, 494, 324, 494, 324,
  494, 324, 494, 324, 494, 326, 494, 326, 494, 326, 494, 324, 494, 326, 494, 326,
  494, 324, 494, 324, 496, 324, 494, 1114, 474, 324, 494, 1092, 492, 326, 494, 324, 494
};
// Calculate the length of the raw data array
const int acRawOffLength = sizeof(acRawOff) / sizeof(acRawOff[0]);

// === setup() ===
void setup() {
  Serial.begin(115200);
  // It's good practice to call irsend.begin() in setup()
  irsend.begin();
  delay(1000); // Give time for Serial to initialize and stabilize
  Serial.println("Ready for commands: '22' to turn ON, '33' to turn OFF");
}

// === loop() ===
void loop() {
  if (Serial.available()) {
    String cmd = Serial.readStringUntil('\n');
    cmd.trim(); // Remove any leading/trailing whitespace, including newline

    if (cmd == "22") {
      Serial.println("Sending ON command...");
      // Use irsend.sendRaw() to transmit the raw pulse data at 38kHz.
      irsend.sendRaw(acRawOn, acRawOnLength, 38);
      // A small delay after sending is usually fine, but not strictly necessary for functionality.
      delay(100);
    } else if (cmd == "33") {
      Serial.println("Sending OFF command...");
      // Use irsend.sendRaw() to transmit the raw pulse data at 38kHz.
      irsend.sendRaw(acRawOff, acRawOffLength, 38);
      delay(100);
    } else {
      Serial.println("Unknown command. Use '22' or '33'");
    }
  }
}

I even don't understand raw code should come with 1 block or 2 blocks as here

Protocol (type): 5 - Value (HEX): 0xC4D364400002, Length (bits): 48
  RAW data (pulses, µs):  [50, 77150, 39800, 12400, 27300, 12350, 27350, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 26650, 12350, 8100, 13050, 7450, 13050, 26600, 12400, 27300, 12350, 8100, 13000, 26650, 12350, 8100, 13050, 7450, 13050, 26600, 12350, 27300, 12400, 8100, 13050, 26600, 12450, 27250, 12350, 8100, 13050, 7450, 13050, 26600, 12400, 8100, 13050, 7450, 13050, 7450, 13050, 26650, 12350, 8100, 13050, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13100, 7350, 13050, 7450, 13000, 7450, 13050, 7400, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13050, 7450, 13000, 7450, 13000, 7450, 13050, 7400, 13050, 7400, 13050, 7450, 13050, 26600, 12350, 8100, 13050]

Protocol (type): 5 - Value (HEX): 0xC4D364800004, Length (bits): 48
  RAW data (pulses, µs):  [50, 77200, 39800, 12400, 27300, 12400, 27250, 12400, 8100, 13000, 7450, 13050, 7450, 13000, 26600, 12400, 8100, 13050, 7400, 13050, 26600, 12400, 27250, 12350, 8100, 13050, 26600, 12400, 8100, 13000, 7450, 13050, 26600, 12350, 27300, 12350, 8100, 13050, 26650, 12350, 27300, 12400, 8100, 13000, 7450, 13000, 26650, 12350, 8100, 13050, 7450, 13000, 26650, 12400, 8100, 12450, 8000, 13050, 7450, 13050, 7450, 12450, 8000, 13050, 7400, 13050, 7450, 12450, 8000, 13050, 7450, 12450, 8050, 12450, 8000, 12450, 8000, 12450, 8050, 13000, 7450, 12450, 8050, 12400, 8050, 12500, 8000, 12450, 8000, 12450, 8000, 12450, 8050, 12400, 27200, 12350, 8100, 12450, 8050, 12450]

Use this demo code and post the output

Also post your IR emitter circuit.

Maybe the IR signal just isn't strong enough. Try placing the IR emitter very close to the AC unit's receiver.

If that works, and you want the sensor to be on the other side of the room, you need to boost the IR signal with a transistor circuit.

The ESP8266 pins can provide only around 12mA IIRC, so a series resistor of at least 150R would be needed, and the IR signal will be pretty weak. If you use a lower resistor, the pin could be damaged.

Timestamp : 000260.105
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 2, Quiet: Off
uint16_t rawData[227] = {3084, 1616,  470, 1114,  472, 1114,  472, 326,  494, 326,  492, 326,  494, 1112,  472, 326,  494, 324,  494, 1112,  472, 1114,  472, 326,  492, 1114,  472, 326,  492, 326,  494, 1112,  474, 1112,  472, 324,  494, 1092,  494, 1112,  472, 324,  494, 324,  496, 1110,  474, 324,  494, 324,  494, 324,  494, 1112,  472, 324,  496, 322,  496, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 326,  494, 324,  494, 324,  494, 1112,  474, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 1090,  494, 324,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 1092,  494, 1092,  494, 324,  494, 324,  496, 322,  494, 324,  494, 324,  494, 1112,  474, 324,  494, 324,  496, 324,  496, 322,  496, 324,  496, 322,  492, 326,  492, 326,  472, 346,  472, 348,  470, 348,  472, 348,  472, 346,  472, 346,  478, 342,  496, 322,  498, 320,  524, 294,  524, 294,  524, 294,  498, 320,  496, 322,  496, 324,  494, 324,  494, 324,  494, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 328,  490, 1114,  472, 328,  490, 1114,  472, 328,  490, 328,  490};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};


Timestamp : 000260.298
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB2601002403070200000080C5 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 1, Power: On, Mode: 3 (Cool), Temp: 24C, Fan: 2 (Low), Swing(V): 0 (Auto), Swing(H): Off, Econo: Off, Health: Off, Turbo: Off, Light: On, On Timer: Off, Off Timer: Off
uint16_t rawData[227] = {3082, 1596,  492, 1094,  492, 1094,  492, 328,  490, 326,  492, 326,  492, 1112,  476, 324,  492, 326,  492, 1094,  492, 1116,  468, 328,  492, 1112,  472, 330,  490, 328,  490, 1114,  472, 1114,  472, 328,  490, 1114,  472, 1114,  472, 328,  490, 328,  490, 1114,  472, 328,  490, 328,  490, 1114,  472, 328,  492, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  492, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 1114,  470, 328,  490, 328,  490, 1116,  470, 328,  490, 328,  490, 1114,  470, 1116,  470, 330,  490, 328,  490, 330,  490, 328,  490, 330,  488, 330,  488, 1116,  470, 1116,  470, 1116,  470, 330,  488, 330,  488, 330,  488, 330,  488, 330,  488, 330,  488, 1116,  470, 330,  488, 352,  466, 352,  468, 350,  468, 350,  468, 350,  468, 350,  468, 352,  466, 352,  468, 350,  468, 352,  468, 350,  468, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 354,  466, 352,  466, 352,  466, 354,  466, 352,  466, 354,  464, 354,  466, 354,  464, 354,  466, 352,  466, 354,  464, 354,  464, 354,  464, 354,  464, 354,  464, 1122,  464, 1122,  462, 354,  464, 1122,  462, 354,  464, 354,  464, 356,  462, 1124,  460, 1124,  462};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x24, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x80, 0xC5};


Timestamp : 000269.687
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 2, Quiet: Off
uint16_t rawData[227] = {3084, 1594,  494, 1114,  472, 1114,  472, 324,  494, 324,  494, 324,  494, 1114,  472, 324,  496, 322,  496, 1092,  494, 1112,  472, 324,  494, 1092,  494, 324,  494, 324,  494, 1092,  494, 1092,  492, 324,  496, 1110,  474, 1112,  474, 324,  496, 324,  494, 1112,  472, 324,  494, 324,  494, 324,  494, 1114,  472, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  496, 322,  496, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  496, 322,  496, 324,  494, 324,  496, 1090,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  496, 324,  494, 324,  496, 1112,  472, 324,  494, 324,  494, 324,  496, 324,  496, 322,  496, 322,  496, 322,  496, 324,  496, 324,  494, 1092,  494, 1092,  492, 324,  496, 322,  496, 324,  496, 322,  496, 324,  494, 1090,  494, 324,  494, 324,  494, 326,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 322,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 322,  496, 324,  494, 324,  496, 324,  494, 324,  494, 324,  496, 322,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 322,  494, 324,  494, 324,  494, 324,  496, 1090,  494, 324,  494, 1090,  494, 324,  494, 324,  494};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};


Timestamp : 000269.879
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB2601002003070200000080C1 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 1, Power: Off, Mode: 3 (Cool), Temp: 24C, Fan: 2 (Low), Swing(V): 0 (Auto), Swing(H): Off, Econo: Off, Health: Off, Turbo: Off, Light: On, On Timer: Off, Off Timer: Off
uint16_t rawData[227] = {3084, 1594,  494, 1092,  492, 1092,  494, 322,  494, 324,  496, 324,  494, 1092,  492, 324,  494, 326,  494, 1090,  494, 1090,  494, 326,  492, 1112,  474, 324,  494, 324,  496, 1092,  492, 1092,  492, 324,  494, 1092,  494, 1092,  494, 324,  494, 326,  494, 1092,  494, 324,  494, 324,  494, 1092,  492, 324,  494, 324,  494, 324,  494, 326,  492, 326,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 326,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 1092,  492, 326,  494, 324,  494, 1112,  474, 1112,  472, 326,  496, 322,  494, 324,  494, 324,  494, 324,  494, 324,  494, 1110,  474, 1092,  494, 1112,  472, 326,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 1112,  474, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  496, 324,  494, 324,  494, 324,  494, 324,  492, 326,  494, 324,  494, 326,  494, 324,  494, 324,  494, 326,  492, 326,  492, 326,  490, 330,  470, 348,  472, 348,  470, 348,  470, 348,  470, 348,  470, 348,  470, 348,  472, 348,  472, 346,  472, 1134,  450, 1116,  470, 348,  494, 324,  496, 324,  496, 322,  496, 322,  496, 1088,  496, 1090,  496};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x80, 0xC1};


Timestamp : 000274.526
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 2, Quiet: Off
uint16_t rawData[227] = {3086, 1592,  494, 1090,  494, 1092,  494, 324,  520, 298,  508, 312,  520, 1066,  494, 324,  520, 298,  520, 1064,  496, 1090,  496, 324,  520, 1066,  494, 324,  520, 298,  520, 1064,  494, 1092,  494, 324,  496, 1088,  494, 1090,  494, 324,  520, 298,  498, 1086,  496, 322,  520, 298,  496, 322,  520, 1066,  494, 324,  496, 322,  496, 322,  496, 322,  512, 306,  496, 322,  520, 298,  496, 320,  498, 322,  520, 298,  520, 298,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 1088,  494, 324,  496, 322,  496, 322,  498, 320,  496, 322,  496, 322,  498, 320,  496, 1088,  494, 324,  496, 322,  496, 322,  496, 322,  496, 322,  504, 314,  496, 322,  496, 322,  496, 322,  496, 1088,  494, 1090,  498, 320,  506, 314,  520, 298,  496, 322,  504, 314,  498, 1088,  496, 322,  520, 298,  498, 320,  498, 320,  520, 298,  512, 306,  496, 322,  498, 320,  520, 298,  520, 300,  496, 322,  496, 322,  520, 298,  496, 322,  502, 316,  500, 318,  500, 318,  520, 298,  520, 298,  520, 298,  520, 298,  520, 298,  506, 314,  520, 298,  520, 298,  520, 298,  520, 298,  520, 298,  520, 298,  498, 320,  520, 298,  518, 300,  520, 298,  520, 298,  506, 310,  498, 1088,  494, 326,  518, 1064,  494, 324,  522, 298,  506};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};


Timestamp : 000274.714
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB2601002403070200000080C5 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 1, Power: On, Mode: 3 (Cool), Temp: 24C, Fan: 2 (Low), Swing(V): 0 (Auto), Swing(H): Off, Econo: Off, Health: Off, Turbo: Off, Light: On, On Timer: Off, Off Timer: Off
uint16_t rawData[227] = {3084, 1592,  496, 1090,  496, 1090,  496, 324,  494, 324,  496, 324,  494, 1090,  494, 324,  494, 326,  492, 1090,  496, 1088,  496, 324,  494, 1090,  496, 324,  494, 324,  494, 1090,  496, 1090,  496, 324,  494, 1090,  496, 1090,  494, 324,  494, 324,  494, 1092,  494, 324,  494, 324,  494, 1090,  496, 324,  494, 324,  496, 322,  496, 324,  494, 322,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 322,  496, 324,  494, 324,  494, 1090,  494, 324,  494, 324,  494, 1092,  494, 324,  494, 324,  494, 1090,  494, 1092,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 1092,  494, 1090,  494, 1092,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 1090,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 326,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  496, 322,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 324,  494, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 1112,  472, 1112,  472, 326,  472, 1134,  472, 324,  472, 348,  470, 348,  470, 1134,  472, 1092,  470};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x24, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x80, 0xC5};


Timestamp : 000277.761
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 2, Quiet: Off
uint16_t rawData[227] = {3084, 1590,  496, 1090,  496, 1092,  492, 324,  494, 324,  496, 324,  496, 1090,  496, 322,  496, 324,  494, 1090,  494, 1090,  494, 322,  494, 1092,  496, 322,  494, 324,  494, 1090,  496, 1090,  496, 322,  494, 1092,  496, 1090,  494, 322,  496, 322,  496, 1090,  496, 324,  496, 322,  496, 322,  496, 1090,  494, 322,  496, 324,  494, 324,  496, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  496, 322,  496, 324,  494, 322,  496, 324,  494, 322,  496, 324,  496, 322,  496, 324,  496, 1088,  494, 324,  496, 322,  520, 300,  520, 298,  498, 322,  496, 322,  496, 322,  520, 1066,  494, 324,  520, 298,  498, 322,  496, 322,  498, 320,  498, 322,  498, 320,  496, 322,  496, 322,  496, 1088,  494, 1090,  494, 324,  498, 320,  498, 320,  496, 324,  496, 322,  498, 1086,  494, 324,  496, 324,  494, 324,  494, 324,  472, 346,  470, 348,  470, 348,  470, 348,  472, 348,  470, 348,  472, 346,  472, 346,  472, 346,  494, 324,  494, 324,  496, 322,  496, 322,  498, 322,  498, 320,  498, 322,  498, 320,  498, 320,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  496, 322,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  494, 1090,  494, 324,  494, 1092,  494, 326,  492, 328,  494};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};


Timestamp : 000277.947
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB2601002003070200000080C1 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 1, Power: Off, Mode: 3 (Cool), Temp: 24C, Fan: 2 (Low), Swing(V): 0 (Auto), Swing(H): Off, Econo: Off, Health: Off, Turbo: Off, Light: On, On Timer: Off, Off Timer: Off
uint16_t rawData[227] = {3084, 1592,  494, 1090,  494, 1090,  494, 324,  494, 324,  496, 322,  494, 1090,  494, 324,  494, 324,  494, 1092,  494, 1090,  496, 324,  494, 1092,  494, 324,  494, 326,  492, 1092,  494, 1092,  492, 326,  494, 1092,  494, 1092,  494, 326,  492, 326,  492, 1092,  492, 326,  492, 326,  492, 1092,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 328,  492, 326,  492, 328,  490, 326,  492, 326,  490, 1096,  494, 324,  490, 328,  490, 1094,  490, 1096,  488, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 1096,  490, 1114,  470, 1116,  470, 330,  490, 328,  490, 328,  490, 328,  490, 328,  490, 328,  490, 1116,  470, 328,  488, 330,  490, 330,  490, 328,  490, 330,  488, 330,  490, 330,  488, 330,  488, 330,  488, 330,  488, 330,  488, 332,  486, 332,  488, 330,  488, 330,  488, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 352,  466, 352,  468, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 1120,  466, 1120,  466, 352,  466, 352,  466, 354,  464, 354,  466, 352,  466, 1120,  464, 1120,  464};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x80, 0xC1};


Timestamp : 000282.618
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 2, Quiet: Off
uint16_t rawData[227] = {3062, 1616,  470, 1114,  474, 1110,  472, 346,  472, 346,  470, 348,  472, 1114,  470, 348,  472, 346,  470, 1116,  470, 1116,  470, 346,  474, 1114,  470, 348,  470, 348,  470, 1114,  470, 1114,  472, 348,  470, 1116,  470, 1114,  470, 348,  472, 346,  472, 1114,  474, 346,  472, 346,  470, 348,  470, 1114,  470, 348,  472, 348,  472, 344,  472, 348,  472, 348,  470, 348,  470, 348,  472, 346,  472, 346,  470, 348,  472, 346,  470, 346,  472, 346,  470, 350,  470, 348,  470, 346,  470, 348,  472, 348,  470, 348,  470, 348,  470, 1112,  472, 346,  472, 348,  470, 348,  470, 348,  472, 346,  472, 346,  472, 346,  472, 1114,  470, 348,  472, 348,  470, 346,  472, 348,  470, 348,  470, 348,  470, 348,  470, 348,  472, 348,  470, 1114,  470, 1114,  474, 346,  470, 348,  472, 346,  472, 348,  470, 348,  472, 1112,  472, 346,  472, 346,  472, 348,  470, 348,  470, 346,  472, 346,  472, 348,  470, 348,  470, 348,  470, 346,  472, 346,  472, 346,  472, 346,  472, 346,  472, 348,  472, 346,  474, 346,  472, 348,  472, 346,  472, 346,  496, 324,  470, 348,  472, 346,  472, 346,  472, 346,  472, 346,  494, 326,  492, 324,  472, 348,  472, 346,  496, 322,  498, 322,  472, 346,  472, 346,  498, 322,  472, 1112,  496, 322,  498, 1088,  494, 324,  496, 322,  472};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};


Timestamp : 000282.807
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB2601002403070200000080C5 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 1, Power: On, Mode: 3 (Cool), Temp: 24C, Fan: 2 (Low), Swing(V): 0 (Auto), Swing(H): Off, Econo: Off, Health: Off, Turbo: Off, Light: On, On Timer: Off, Off Timer: Off
uint16_t rawData[227] = {3062, 1614,  472, 1114,  472, 1114,  472, 348,  472, 346,  472, 346,  472, 1114,  494, 324,  494, 324,  472, 1112,  472, 1112,  498, 322,  472, 1112,  474, 346,  494, 324,  494, 1090,  484, 1104,  492, 324,  472, 1112,  472, 1112,  472, 346,  494, 324,  472, 1112,  496, 322,  494, 324,  494, 1088,  496, 324,  496, 322,  494, 322,  496, 322,  496, 324,  496, 322,  498, 320,  496, 322,  496, 322,  494, 324,  498, 320,  496, 322,  496, 324,  496, 322,  496, 322,  496, 322,  494, 324,  496, 1088,  498, 320,  496, 322,  496, 1088,  498, 320,  498, 322,  496, 1088,  498, 1088,  498, 322,  496, 322,  496, 322,  498, 320,  498, 322,  498, 320,  496, 1088,  498, 1088,  498, 1088,  498, 320,  498, 322,  498, 320,  500, 320,  498, 320,  498, 322,  496, 1088,  498, 320,  498, 320,  498, 320,  498, 320,  498, 322,  498, 320,  498, 320,  520, 298,  498, 320,  522, 298,  522, 296,  520, 298,  520, 298,  522, 298,  522, 320,  498, 298,  520, 320,  474, 344,  498, 320,  498, 320,  498, 320,  498, 320,  500, 320,  498, 320,  498, 320,  500, 318,  498, 320,  498, 320,  498, 320,  498, 320,  498, 322,  496, 322,  496, 322,  496, 322,  498, 322,  496, 322,  498, 298,  520, 1064,  520, 1064,  522, 320,  496, 1066,  520, 322,  498, 298,  520, 322,  472, 1088,  496, 1088,  520};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x24, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x80, 0xC5};


Timestamp : 000287.087
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB260200404000830000000028 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 2, Quiet: Off
uint16_t rawData[227] = {3058, 1616,  470, 1114,  472, 1112,  472, 348,  472, 346,  474, 346,  470, 1116,  470, 346,  474, 346,  470, 1114,  470, 1114,  472, 346,  472, 1112,  472, 348,  468, 348,  470, 1114,  472, 1112,  472, 346,  470, 1114,  470, 1114,  472, 348,  470, 348,  474, 1112,  472, 346,  472, 346,  472, 348,  470, 1114,  472, 346,  472, 348,  470, 348,  470, 346,  472, 348,  470, 348,  472, 346,  472, 346,  472, 346,  472, 346,  472, 346,  472, 348,  470, 346,  472, 348,  472, 346,  494, 324,  494, 324,  496, 324,  494, 324,  494, 324,  472, 1112,  494, 324,  496, 322,  496, 322,  498, 320,  498, 322,  496, 320,  496, 322,  498, 1086,  498, 322,  494, 322,  498, 322,  496, 322,  498, 320,  498, 322,  496, 320,  500, 320,  498, 320,  498, 1086,  500, 1084,  500, 320,  498, 320,  496, 322,  498, 320,  498, 322,  496, 1086,  498, 320,  524, 296,  498, 322,  520, 298,  496, 346,  474, 344,  498, 298,  520, 318,  496, 302,  518, 320,  498, 320,  496, 322,  496, 302,  516, 322,  496, 300,  518, 322,  472, 324,  518, 302,  516, 322,  474, 322,  494, 324,  492, 326,  494, 324,  494, 326,  492, 326,  494, 324,  494, 324,  494, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 326,  492, 328,  492, 1092,  492, 328,  490, 1094,  492, 328,  490, 328,  490};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x02, 0x00, 0x40, 0x40, 0x00, 0x83, 0x00, 0x00, 0x00, 0x00, 0x28};


Timestamp : 000287.273
Library   : v2.8.6

Protocol  : TCL112AC
Code      : 0x23CB2601002003070200000080C1 (112 Bits)
Mesg Desc.: Model: 1 (TAC09CHSD), Type: 1, Power: Off, Mode: 3 (Cool), Temp: 24C, Fan: 2 (Low), Swing(V): 0 (Auto), Swing(H): Off, Econo: Off, Health: Off, Turbo: Off, Light: On, On Timer: Off, Off Timer: Off
uint16_t rawData[227] = {3082, 1596,  492, 1092,  492, 1094,  494, 326,  492, 326,  492, 326,  492, 1092,  492, 326,  492, 328,  490, 1094,  492, 1094,  490, 326,  492, 1094,  490, 328,  490, 328,  494, 1092,  492, 1094,  492, 328,  490, 1096,  488, 1094,  490, 328,  490, 330,  490, 1094,  490, 328,  490, 328,  490, 1094,  490, 328,  490, 328,  490, 328,  488, 330,  490, 330,  488, 330,  490, 328,  490, 330,  488, 330,  488, 330,  488, 330,  488, 348,  470, 330,  488, 330,  488, 348,  470, 348,  470, 348,  470, 348,  470, 348,  470, 348,  470, 1098,  488, 348,  470, 348,  470, 1114,  470, 1116,  470, 348,  470, 350,  468, 350,  470, 350,  468, 350,  468, 350,  470, 1116,  470, 1116,  470, 1116,  470, 348,  470, 348,  470, 350,  470, 348,  470, 350,  468, 350,  468, 1116,  470, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 350,  468, 352,  468, 350,  468, 350,  468, 350,  468, 352,  468, 350,  466, 352,  466, 352,  466, 352,  466, 352,  468, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 352,  466, 354,  466, 352,  466, 352,  466, 354,  466, 352,  466, 352,  466, 354,  464, 354,  464, 354,  464, 354,  464, 1120,  464, 1122,  464, 354,  464, 354,  464, 354,  464, 354,  464, 354,  464, 1122,  464, 1122,  462};  // TCL112AC
uint8_t state[14] = {0x23, 0xCB, 0x26, 0x01, 0x00, 0x20, 0x03, 0x07, 0x02, 0x00, 0x00, 0x00, 0x80, 0xC1};



3 times pressed on 3times off

sry I don't got u about IR emitter circuit. from aliexpress, emitter is transparent
Description:

Item: 10pcs 5mm 940nm Emitter + 5pcs 5mm 940nm Receiver +5pcs VS1838B Receiver (Total 20pcs)

5mm 940nm Emitter:

Lens: Clear Lens

Receiving Angle: 45°

Voltage: 1.2V-1.5V

Current: 20mA

Recived Distance: 12M

anode on D7 cathode on gnd

So you have perfectly decoded signal.
Try to resend it (not tested):

#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <ir_Tcl.h>  

// Set the GPIO connected to the IR LED
const uint16_t kIrLedPin = 13;  

IRsend irsend(kIrLedPin);

void setup() {
  Serial.begin(115200);
  irsend.begin();  

  IRTcl112Ac ac(kIrLedPin);
  ac.begin();
  ac.setModel(1);         // Set model (TAC09CHSD from your signal)
  ac.setPower(false);     // Power OFF
  ac.send();              // Send the command

  Serial.println("Sent TCL AC OFF command.");
}

void loop() {
  // Nothing 
}

You need 120ohm resistor in series with your LED.
Be aware, the range is not high with this setup, but at least you can try it works.
If you need better range, you need transistor circuit to drive LED(s).

I try to compilate this code with 13 pin but I have error message

Arduino: 1.8.9 (Windows 10), Board: "LOLIN(WeMos) D1 R1, 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, 4MB (FS:2MB OTA:~1019KB), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

WARNING: Category 'Communication,AsyncWebServer,Async,UDP' in library AsyncUdp_ESP32_ENC is not valid. Setting to 'Uncategorized'
J:\Documents\Arduino\AControl_temperature_test\AControl_temperature_test.ino: In function 'void setup()':
AControl_temperature_test:17:15: error: 'TCL_AC_MODEL_DEFAULT' was not declared in this scope
   17 |   ac.setModel(TCL_AC_MODEL_DEFAULT);         // Set model (TAC09CHSD from your signal)
      |               ^~~~~~~~~~~~~~~~~~~~
exit status 1
'TCL_AC_MODEL_DEFAULT' was not declared in this scope

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

may be I need to include more libs?

Library doesn't have example for TCL, I don't know what it expects as "Model".
Try to replace the line:
ac.setModel(1); // Set model (TAC09CHSD from your signal)
with:
ac.setModel(tcl_ac_remote_model_t::TAC09CHSD);

good news. 2n2222 took my project on next lvl, AC reacted to ON/OFF
and yes with IR emitter of this type u don't need 100ohm resistor on anode. It works as well as on this schematic even with Wemos D1 R1 ESP8266 and not original arduino.

While you might not need, some (even small value) resistor would give you some known current. Without you are likely abusing your LED, the transistor and arduino. Also, I would power it from 5V without passing through 3.3V regulator. And 2-3 LEDs in series would make it more efficient.

1 Like