226 lines
7.3 KiB
C++
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() {
|
|
|
|
} |