hygain-ir-controller/hygain-ir-controller.ino

226 lines
7.3 KiB
C++

// Libraries
#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <IRremote.h>
#include <ESPAsyncWebServer.h>
byte SEND_PIN = 4;
IRsend irsend(SEND_PIN);
// WiFi network
const char* ssid = "xxxxxxx";
const char* password = "xxxxxxx";
AsyncWebServer server(80);
const char* input_heading = "heading";
const char* input_memory = "memory";
char headingmap[360];
const uint16_t IRCodes[] = {
0x44, // A
0x7, // B
0x9, // C
0x40, // D
0x19, // E
0x16, // F
0xC, // G
0x18, // H
0x5E, // I
0x8, // J
0x1C, // K -> U
0x5A // L
};
// other possible codes:
// rotate CCW: 0x43
// rotate CW: 0x45
// initial: 0x42
// memory: 0x4A
const char index_html[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hy-Gain AR-500X</title>
<style>
html {font-family: Times New Roman; display: inline-block; text-align: center;}
h2 {font-size: 3.0rem; color: #FF0000;}
</style>
</head>
<body>
<h2>HyGain AR-500X</h2>
<form action="/get">
<table cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="A">000</button></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="L">345</button></td><td></td><td><button type="submit" name="memory" value="B">015</button></td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="K">330</button></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="C">030</button></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td><button type="submit" name="memory" value="J">315</button></td><td></td><td></td><td>N</td><td></td><td></td><td><button type="submit" name="memory" value="D">045</button></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td><button type="submit" name="memory" value="I">300</button></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="E">060</button></td><td></td><td></td>
</tr>
<tr>
<td></td><td><button type="submit" name="memory" value="H">285</button></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="F">075</button></td><td></td>
</tr>
<tr>
<td><button type="submit" name="memory" value="G">270</button></td><td></td><td></td><td>W</td><td></td><td></td><td></td><td></td><td></td><td>E</td><td></td><td></td><td><button type="submit" name="memory" value="G">090</button></td>
</tr>
<tr>
<td></td><td><button type="submit" name="memory" value="F">255</button></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="H">105</button></td><td></td>
</tr>
<tr>
<td></td><td></td><td><button type="submit" name="memory" value="E">240</button></td><td></td><td></td><td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="I">120</button></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td><button type="submit" name="memory" value="D">225</button></td><td></td><td></td><td>S</td><td></td><td></td><td><button type="submit" name="memory" value="J">135</button></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="C">210</button></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="K">150</button></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="B">195</button></td><td></td><td><button type="submit" name="memory" value="L">164</button></td><td></td><td></td><td></td><td></td><td></td>
</tr>
<tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td><button type="submit" name="memory" value="A">180</button></td><td></td><td></td><td></td><td></td><td></td><td></td>
</tr>
</tbody>
</table>
</form><br>
</body>
</html>)rawliteral";
void notFound(AsyncWebServerRequest *request) {
request->send(404, "text/plain", "Not found");
}
// Function to get value by key
const uint16_t getValueByKey(char key) {
key = toupper(key);
int index = key - 'A';
return IRCodes[index];
}
char lookupLetter(int angle) {
// Adjust angle to be within 0 and 360
angle %= 360;
if (angle < 0) {
angle += 360;
}
// Define the lookup table
const int angles[] = {0, 15, 30, 45, 60, 75, 90, 105, 120, 135, 150, 165, 180,
195, 210, 225, 240, 255, 270, 285, 300, 315, 330, 345, 360};
const char letters[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'A'};
// Find the closest angle in the table
int closestAngleIndex = 0;
for (int i = 1; i < 26; ++i) {
if (abs(angles[i] - angle) < abs(angles[closestAngleIndex] - angle)) {
closestAngleIndex = i;
}
}
// Return the corresponding letter
return letters[closestAngleIndex];
}
void setup() {
// Start serial
Serial.begin(9600);
delay(10);
Serial.print("ESP Board MAC Address: ");
Serial.println(WiFi.macAddress());
// Connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
// Fill the array
char currentChar = 'A';
for (int i = 0; i < 360; i++) {
headingmap[i] = currentChar;
if ((i + 1) % 15 == 0) {
currentChar++;
if (currentChar > 'L')
currentChar = 'A';
}
}
Serial.println("OK");
server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
request->send_P(200, "text/html", index_html);
});
server.on("/get", HTTP_GET, [] (AsyncWebServerRequest *request) {
String input_message;
char mem;
if (request->hasParam(input_memory)) {
input_message = request->getParam(input_memory)->value();
mem = input_message[0];
}
if (request->hasParam(input_heading)) {
int angle = request->getParam(input_heading)->value().toInt();
char letter = lookupLetter(angle);
mem = letter;
}
else {
input_message = "No message sent";
}
Serial.println(String(mem));
uint16_t val = getValueByKey(mem);
Serial.println("IR Code: " + String(val));
irsend.sendNEC(0x0, val, 2);
delay(500);
request->send_P(200, "text/html", index_html);
});
server.onNotFound(notFound);
server.begin();
}
void loop() {
}