Last active
May 12, 2024 21:53
-
-
Save balloob/daf310faa80112817d6826fbe5fc399d to your computer and use it in GitHub Desktop.
ESP8266 sketch to control a Whynter ARC-110WD portable air conditioner and monitor temperature using MQTT, infrared transmitter, DHT22. For a list of possible IR codes see https://docs.google.com/spreadsheets/d/1dsr4Jh-nzC6xvSKGpLlPBF0NRwvlpyw-ozg8eZU813w/edit#gid=0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#define wifi_ssid "YOUR_WIFI_NAME" | |
#define wifi_password "YOUR_WIFI_PASSWORD" | |
#define mqtt_server "MQTT_SERVER" | |
#define mqtt_user "MQTT_USER" | |
#define mqtt_password "MQTT_PASS" | |
#define ac_topic "device/study_room/ac" | |
#define temperature_topic "device/study_room/temperature" | |
#define humidity_topic "device/study_room/humidity" |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Get ESP8266 going with Arduino IDE | |
// - https://github.com/esp8266/Arduino#installing-with-boards-manager | |
// Required libraries (sketch -> include library -> manage libraries) | |
// - PubSubClient by Nick 'O Leary | |
// - IRemoteESP8266 | |
#include <ESP8266WiFi.h> | |
#include <PubSubClient.h> | |
#include <IRremoteESP8266.h> | |
#include <DHT.h> | |
#define DHTTYPE DHT22 | |
#define DHTPIN 14 | |
IRsend irsend(13); //an IR led is connected to GPIO pin 13 | |
#include "config.h" | |
void callback(char* topic, byte* payload, unsigned int length) { | |
Serial.print("Message arrived ["); | |
Serial.print(topic); | |
Serial.print("] "); | |
for (int i = 0; i < length; i++) { | |
Serial.print((char)payload[i]); | |
} | |
Serial.println(); | |
if ((char)payload[0] == 'O') { | |
Serial.println("Sending off command"); | |
irsend.sendWhynter(0xB400AAC, 32); | |
} else if ((char)payload[0] == 'F') { | |
Serial.println("Sending fan high command"); | |
irsend.sendWhynter(0x8B400AA4, 32); | |
} else if ((char)payload[0] == 'C') { | |
Serial.println("Sending cool high - 19C command"); | |
irsend.sendWhynter(0x86000AAD, 32); | |
} | |
} | |
WiFiClient espClient; | |
PubSubClient client(mqtt_server, 1883, callback, espClient); | |
DHT dht(DHTPIN, DHTTYPE, 11); // 11 works fine for ESP8266 | |
long lastMsg = 0; | |
float temp = 0.0; | |
float hum = 0.0; | |
bool checkBound(float newValue, float prevValue, float maxDiff) { | |
return !isnan(newValue) && | |
(newValue < prevValue - maxDiff || newValue > prevValue + maxDiff); | |
} | |
void setup() { | |
irsend.begin(); | |
dht.begin(); | |
Serial.begin(115200); | |
setup_wifi(); | |
} | |
void setup_wifi() { | |
delay(10); | |
// We start by connecting to a WiFi network | |
Serial.println(); | |
Serial.print("Connecting to "); | |
Serial.println(wifi_ssid); | |
WiFi.begin(wifi_ssid, wifi_password); | |
while (WiFi.status() != WL_CONNECTED) { | |
delay(500); | |
Serial.print("."); | |
} | |
Serial.println(""); | |
Serial.println("WiFi connected"); | |
Serial.println("IP address: "); | |
Serial.println(WiFi.localIP()); | |
} | |
void reconnect() { | |
// Loop until we're reconnected | |
while (!client.connected()) { | |
Serial.print("Attempting MQTT connection..."); | |
Serial.print("state="); | |
Serial.println(client.state()); | |
// Attempt to connect | |
if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) { | |
Serial.println("connected"); | |
Serial.print("state="); | |
Serial.println(client.state()); | |
client.subscribe(ac_topic); | |
} else { | |
Serial.print("failed, rc="); | |
Serial.print(client.state()); | |
Serial.println(" try again in 5 seconds"); | |
// Wait 5 seconds before retrying | |
delay(5000); | |
} | |
} | |
} | |
void loop() { | |
if (!client.connected()) { | |
reconnect(); | |
} | |
client.loop(); | |
long now = millis(); | |
if (now - lastMsg > 2000) { | |
lastMsg = now; | |
float newTemp = dht.readTemperature(); | |
float newHum = dht.readHumidity(); | |
if (checkBound(newTemp, temp, 0.5)) { | |
temp = newTemp; | |
Serial.print("New temperature:"); | |
Serial.println(String(temp).c_str()); | |
client.publish(temperature_topic, String(temp).c_str(), true); | |
} | |
if (checkBound(newHum, hum, 2)) { | |
hum = newHum; | |
Serial.print("New humidity:"); | |
Serial.println(String(hum).c_str()); | |
client.publish(humidity_topic, String(hum).c_str(), true); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
How did you decode the IR commands? Thanks!