5.9.1f * Upgrade library ArduinoJson to 5.11.2 * Upgrade library IRRemoteEsp8266 to 2.2.1 + 2 commits but tweaked some protocols to keep code usage small * Upgrade library NeoPixelBus to 2.2.9 * Upgrade library OneWire to 2.3.3 + 6 commits * Formalize library PubSubClient to 2.6 + 9 commits and additional delay * Add optional ADS1115 driver as alternative for unsupported I2Cdevlib in esp8266-core 2.4.0-rc2 * Fix wrong response name for command HlwISet (#1214)
114 lines
3.2 KiB
C++
114 lines
3.2 KiB
C++
// Copyright 2017 Ville Skyttä (scop)
|
|
// Copyright 2017 David Conran
|
|
//
|
|
// Gree protocol compatible heat pump carrying the "Ultimate" brand name.
|
|
//
|
|
|
|
#include "IRremoteESP8266.h"
|
|
#include "IRsend.h"
|
|
|
|
// GGGG RRRRRR EEEEEEE EEEEEEE
|
|
// GG GG RR RR EE EE
|
|
// GG RRRRRR EEEEE EEEEE
|
|
// GG GG RR RR EE EE
|
|
// GGGGGG RR RR EEEEEEE EEEEEEE
|
|
|
|
// Constants
|
|
// Ref: https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.h
|
|
#define GREE_HDR_MARK 9000U
|
|
#define GREE_HDR_SPACE 4000U
|
|
#define GREE_BIT_MARK 620U
|
|
#define GREE_ONE_SPACE 1600U
|
|
#define GREE_ZERO_SPACE 540U
|
|
#define GREE_MSG_SPACE 19000U
|
|
|
|
#if SEND_GREE
|
|
// Send a Gree Heat Pump message.
|
|
//
|
|
// Args:
|
|
// data: An array of bytes containing the IR command.
|
|
// nbytes: Nr. of bytes of data in the array. (>=GREE_STATE_LENGTH)
|
|
// repeat: Nr. of times the message is to be repeated. (Default = 0).
|
|
//
|
|
// Status: ALPHA / Untested.
|
|
//
|
|
// Ref:
|
|
// https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp
|
|
void IRsend::sendGree(unsigned char data[], uint16_t nbytes, uint16_t repeat) {
|
|
if (nbytes < GREE_STATE_LENGTH)
|
|
return; // Not enough bytes to send a proper message.
|
|
|
|
// Set IR carrier frequency
|
|
enableIROut(38);
|
|
|
|
for (uint16_t r = 0; r <= repeat; r++) {
|
|
// Header #1
|
|
mark(GREE_HDR_MARK);
|
|
space(GREE_HDR_SPACE);
|
|
|
|
// Data #1
|
|
uint16_t i;
|
|
for (i = 0; i < 4 && i < nbytes; i++)
|
|
sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
|
|
data[i], 8, false);
|
|
|
|
// Footer #1 (010)
|
|
sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
|
|
0b010, 3);
|
|
|
|
// Header #2
|
|
mark(GREE_BIT_MARK);
|
|
space(GREE_MSG_SPACE);
|
|
|
|
// Data #2
|
|
for (; i < nbytes; i++)
|
|
sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
|
|
data[i], 8, false);
|
|
|
|
// Footer #2
|
|
mark(GREE_BIT_MARK);
|
|
space(GREE_MSG_SPACE);
|
|
}
|
|
}
|
|
|
|
// Send a Gree Heat Pump message.
|
|
//
|
|
// Args:
|
|
// data: The raw message to be sent.
|
|
// nbits: Nr. of bits of data in the message. (Default is GREE_BITS)
|
|
// repeat: Nr. of times the message is to be repeated. (Default = 0).
|
|
//
|
|
// Status: ALPHA / Untested.
|
|
//
|
|
// Ref:
|
|
// https://github.com/ToniA/arduino-heatpumpir/blob/master/GreeHeatpumpIR.cpp
|
|
void IRsend::sendGree(uint64_t data, uint16_t nbits, uint16_t repeat) {
|
|
if (nbits != GREE_BITS)
|
|
return; // Wrong nr. of bits to send a proper message.
|
|
// Set IR carrier frequency
|
|
enableIROut(38);
|
|
|
|
for (uint16_t r = 0; r <= repeat; r++) {
|
|
// Header
|
|
mark(GREE_HDR_MARK);
|
|
space(GREE_HDR_SPACE);
|
|
|
|
// Data
|
|
for (int16_t i = 8; i <= nbits; i += 8) {
|
|
sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
|
|
(data >> (nbits - i)) & 0xFF, 8, false);
|
|
if (i == nbits / 2) {
|
|
// Send the mid-message Footer.
|
|
sendData(GREE_BIT_MARK, GREE_ONE_SPACE, GREE_BIT_MARK, GREE_ZERO_SPACE,
|
|
0b010, 3);
|
|
mark(GREE_BIT_MARK);
|
|
space(GREE_MSG_SPACE);
|
|
}
|
|
}
|
|
// Footer
|
|
mark(GREE_BIT_MARK);
|
|
space(GREE_MSG_SPACE);
|
|
}
|
|
}
|
|
#endif // SEND_GREE
|