mirror of
https://github.com/brendanhaines/kilncontroller.git
synced 2024-12-25 10:26:55 -07:00
adds plotting, basic response to POST request
This commit is contained in:
parent
5b36251906
commit
58d8f0771d
|
@ -7,10 +7,14 @@
|
|||
#include <WiFiClient.h>
|
||||
#include <ESP8266WebServer.h>
|
||||
|
||||
|
||||
/////////////////////////
|
||||
///// USER SETTINGS /////
|
||||
/////////////////////////
|
||||
|
||||
|
||||
// WiFi Settings
|
||||
const char *ssid = "ESPap";
|
||||
const char *ssid = "KilnControlV1";
|
||||
const char *password = "thereisnospoon";
|
||||
|
||||
// Temperature Offsets
|
||||
|
@ -25,53 +29,66 @@ int CS1 = 16;
|
|||
int CS2 = 14;
|
||||
int CS3 = 15;
|
||||
|
||||
///// END USER SETTINGS /////
|
||||
|
||||
// Thermocouple stuff
|
||||
//////////////////////////////
|
||||
///// END: USER SETTINGS /////
|
||||
//////////////////////////////
|
||||
|
||||
|
||||
// Thermocouple
|
||||
MAX6675 t1(CLK0, CS1, MISO0);
|
||||
MAX6675 t2(CLK0, CS2, MISO0);
|
||||
MAX6675 t3(CLK0, CS3, MISO0);
|
||||
int temp1, temp2, temp3;
|
||||
|
||||
// Output Stuff
|
||||
LiquidCrystal_I2C lcd(0x3f, 20, 4);
|
||||
Adafruit_MCP23017 mcp;
|
||||
|
||||
// WiFi Stuff
|
||||
ESP8266WebServer server(80);
|
||||
|
||||
// Control Stuff
|
||||
// Control
|
||||
int onTemp = 70;
|
||||
int offTemp = 80;
|
||||
|
||||
// Output
|
||||
LiquidCrystal_I2C lcd(0x3f, 20, 4);
|
||||
Adafruit_MCP23017 mcp;
|
||||
|
||||
//////////////////////
|
||||
///// WEB SERVER /////
|
||||
//////////////////////
|
||||
|
||||
// WiFi
|
||||
ESP8266WebServer server(80);
|
||||
|
||||
const String header = "<head><title>Kiln Controller V1</title></head>";
|
||||
const String navbar = "<table border=\"1\"><nav><tr><td><a href=\"/\">Home</a></td><td><a href=\"/temps\">Temperature Display</a></td><td><a href=\"/settings\">Settings</a></td><td><a href=\"/config\">Configuration</a></td></tr></nav></table>";
|
||||
|
||||
void handleRoot() {
|
||||
server.send(200, "text/html",
|
||||
"<h1>Kiln Controller V1</h1>"
|
||||
"<a href=\"/temps\">Real Time Temperature Readout</a><br>"
|
||||
"<a href=\"/settings\">Temperature Setpoints</a><br>"
|
||||
"<a href=\"/config\">Configuration</a><br>"
|
||||
header + "<h1>Kiln Controller V1</h1>" + navbar
|
||||
);
|
||||
}
|
||||
|
||||
void handleTemps() {
|
||||
server.send(200, "text/html",
|
||||
"<h1>Temperature Readout</h1>"
|
||||
"<a href=\"/\">Home</a>"
|
||||
header + "<h1>Kiln Controller V1</h1><h2>Temperature Display</h2>" + navbar +
|
||||
"<br><img src=\"/tempgraph.svg\">"
|
||||
);
|
||||
}
|
||||
|
||||
void handleSettings() {
|
||||
server.send(200, "text/html",
|
||||
"<h1>Settings</h1>"
|
||||
"<a href=\"/\">Home</a>"
|
||||
header + "<h1>Kiln Controller V1</h1><h2>Settings</h2>" + navbar +
|
||||
"<form name=\"myform\" action=\"/settings\" method=\"post\">"
|
||||
"<br>" +
|
||||
"<button type=\"submit\">Submit</button>" +
|
||||
"</form>"
|
||||
);
|
||||
}
|
||||
|
||||
void handleSettingsUpdate() {
|
||||
mcp.digitalWrite(1, HIGH);
|
||||
}
|
||||
|
||||
void handleConfig() {
|
||||
server.send(200, "text/html",
|
||||
"<h1>Configuration</h1>"
|
||||
"<a href=\"/\">Home</a>"
|
||||
header + "<h1>Configuration</h1>" + navbar
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -92,7 +109,12 @@ void handleNotFound() {
|
|||
server.send ( 404, "text/plain", temp );
|
||||
}
|
||||
|
||||
|
||||
/////////////////
|
||||
///// SETUP /////
|
||||
/////////////////
|
||||
|
||||
|
||||
void setup() {
|
||||
// Onboard LED
|
||||
pinMode(2, OUTPUT);
|
||||
|
@ -125,18 +147,19 @@ void setup() {
|
|||
mcp.digitalWrite(3, LOW);
|
||||
|
||||
// Temperature Inital Values
|
||||
temp1 = t1.readFahrenheit();
|
||||
temp2 = t2.readFahrenheit();
|
||||
temp3 = t3.readFahrenheit();
|
||||
temp1 = 0;
|
||||
temp2 = 0;
|
||||
temp3 = 0;
|
||||
|
||||
// Access Point Setup
|
||||
WiFi.softAP(ssid, password);
|
||||
IPAddress myIP = WiFi.softAPIP();
|
||||
server.on("/", handleRoot);
|
||||
server.on("/temps", handleTemps);
|
||||
server.on("/settings", handleSettings);
|
||||
server.on("/settings", HTTP_GET, handleSettings);
|
||||
server.on("/settings", HTTP_POST, handleSettingsUpdate);
|
||||
server.on("/config", handleConfig);
|
||||
server.on ("/test.svg", tempGraph);
|
||||
server.on ("/tempgraph.svg", tempGraph);
|
||||
server.onNotFound(handleNotFound);
|
||||
server.begin();
|
||||
lcd.clear();
|
||||
|
@ -154,68 +177,145 @@ void loop() {
|
|||
server.handleClient();
|
||||
|
||||
// Get values
|
||||
temp1 = t1.readFahrenheit() + t1off;
|
||||
temp2 = t2.readFahrenheit() + t2off;
|
||||
temp3 = t3.readFahrenheit() + t3off;
|
||||
int ntemp1 = t1.readFahrenheit() + t1off;
|
||||
int ntemp2 = t2.readFahrenheit() + t2off;
|
||||
int ntemp3 = t3.readFahrenheit() + t3off;
|
||||
temp1 = (ntemp1 != 2147483647 ? ntemp1 : temp1);
|
||||
temp2 = (ntemp2 != 2147483647 ? ntemp2 : temp2);
|
||||
temp3 = (ntemp3 != 2147483647 ? ntemp3 : temp3);
|
||||
|
||||
// Write to LCD
|
||||
lcd.clear();
|
||||
lcd.setCursor(0, 0);
|
||||
lcd.print("1: ");
|
||||
lcd.print(temp1);
|
||||
lcd.print(" F");
|
||||
lcd.printf("1:%4d%cF", temp1, 0xDF);
|
||||
lcd.setCursor(0, 1);
|
||||
lcd.print("2: ");
|
||||
lcd.print(temp2);
|
||||
lcd.print(" F");
|
||||
lcd.printf("2:%4d%cF", temp2, 0xDF);
|
||||
lcd.setCursor(0, 2);
|
||||
lcd.print("3: ");
|
||||
lcd.print(temp3);
|
||||
lcd.print(" F");
|
||||
|
||||
lcd.printf("3:%4d%cF", temp3, 0xDF);
|
||||
// Heartbeat LED
|
||||
if (WiFi.softAPgetStationNum() == 0) {
|
||||
digitalWrite(2, LOW);
|
||||
delay(100);
|
||||
delay(10);
|
||||
digitalWrite(2, HIGH);
|
||||
delay(900);
|
||||
delay(990);
|
||||
} else {
|
||||
digitalWrite(2, LOW);
|
||||
delay(50);
|
||||
delay(5);
|
||||
digitalWrite(2, HIGH);
|
||||
delay(100);
|
||||
digitalWrite(2, LOW);
|
||||
delay(50);
|
||||
delay(1);
|
||||
digitalWrite(2, HIGH);
|
||||
delay(800);
|
||||
delay(980);
|
||||
}
|
||||
}
|
||||
|
||||
void drawGraph(int xvalues[], int yvalues[], int width, int height, int r, int g, int b) {
|
||||
|
||||
////////////////////
|
||||
///// PLOTTING /////
|
||||
////////////////////
|
||||
|
||||
/**
|
||||
x[] is x values
|
||||
y[] is y values corresponding to x values
|
||||
len is the length of both x and y
|
||||
*/
|
||||
void drawGraph(int x[], int y[], int len) {
|
||||
String out = "";
|
||||
char temp[100];
|
||||
|
||||
sprintf(temp, "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"%d\" height=\"%d\">\n", width, height);
|
||||
out += temp;
|
||||
// Find max/min x,y values
|
||||
int maxY = y[0];
|
||||
int minY = y[0];
|
||||
for (int i = 1; i < len; i++) {
|
||||
if (y[i] > maxY) {
|
||||
maxY = y[i];
|
||||
} else if (y[i] < minY) {
|
||||
minY = y[i];
|
||||
}
|
||||
}
|
||||
|
||||
sprintf(temp, "<rect width=\"%d\" height=\"%d\" fill=\"rgb(%d,%d,%d)\" stroke-width=\"1\" stroke=\"rgb(0, 0, 0)\" />\n", width, height, r, g, b);
|
||||
out += temp;
|
||||
int maxX = x[0];
|
||||
int minX = x[0];
|
||||
for (int i = 1; i < len; i++) {
|
||||
if (x[i] > maxX) {
|
||||
maxX = x[i];
|
||||
} else if (x[i] < minX) {
|
||||
minY = x[i];
|
||||
}
|
||||
}
|
||||
|
||||
float yscale = 92.0 / (maxY - minY);
|
||||
float xscale = 484.0 / (maxX - minX);
|
||||
|
||||
|
||||
// Chart area
|
||||
out += "<svg xmlns=\"http://www.w3.org/2000/svg\" version=\"1.1\" width=\"560\" height=\"195\">\n";
|
||||
out += "<rect width=\"560\" height=\"195\" style=\"fill:rgb(232,240,255);stroke-width:2;stroke:rgb(0,0,0)\"/>\n";
|
||||
out += "<rect x=\"50\" y=\"10\" width=\"500\" height=\"110\" style=\"fill:white;stroke-width:1;stroke:rgb(0,0,0)\"/>";
|
||||
|
||||
// Vertical axis labels
|
||||
out += "<text x=\"10\" y=\"66\" fill=\"black\">F</text>";
|
||||
sprintf(temp, "<text x=\"10\" y=\"25\" fill=\"black\">%d</text>", maxY);
|
||||
out += temp;
|
||||
sprintf(temp, "<text x=\"10\" y=\"117\" fill=\"black\">%d</text>", minY);
|
||||
out += temp;
|
||||
out += "<line x1=\"45\" y1=\"19\" x2=\"55\" y2=\"19\" style=\"stroke:black;stroke-width:1\"></line>";
|
||||
out += "<line x1=\"45\" y1=\"111\" x2=\"55\" y2=\"111\" style=\"stroke:black;stroke-width:1\"></line>";
|
||||
|
||||
// Horizontal axis labels
|
||||
int horizLabelSpacing = (maxX - minX) / 4;
|
||||
out += "<text x=\"275\" y=\"185\" fill=\"black\">HH:MM</text>";
|
||||
sprintf(temp, "<text x=\"53\" y=\"130\" fill=\"black\" transform=\"rotate(90 53,130)\">%02d:%02d </text>", minX / 60, minX % 60);
|
||||
out += temp;
|
||||
sprintf(temp, "<text x=\"174\" y=\"130\" fill=\"black\" transform=\"rotate(90 174,130)\">%02d:%02d </text>", (1 * horizLabelSpacing + minX) / 60, (1 * horizLabelSpacing + minX) % 60);
|
||||
out += temp;
|
||||
sprintf(temp, "<text x=\"295\" y=\"130\" fill=\"black\" transform=\"rotate(90 295,130)\">%02d:%02d </text>", (2 * horizLabelSpacing + minX) / 60, (2 * horizLabelSpacing + minX) % 60);
|
||||
out += temp;
|
||||
sprintf(temp, "<text x=\"416\" y=\"130\" fill=\"black\" transform=\"rotate(90 416,130)\">%02d:%02d </text>", (3 * horizLabelSpacing + minX) / 60, (3 * horizLabelSpacing + minX) % 60);
|
||||
out += temp;
|
||||
sprintf(temp, "<text x=\"535\" y=\"130\" fill=\"black\" transform=\"rotate(90 535,130)\">%02d:%02d </text>", maxX / 60, maxX % 60);
|
||||
out += temp;
|
||||
out += "<line x1=\"58\" y1=\"115\" x2=\"58\" y2=\"125\" style=\"stroke:black;stroke-width:1\"></line>";
|
||||
out += "<line x1=\"179\" y1=\"115\" x2=\"179\" y2=\"125\" style=\"stroke:black;stroke-width:1\"></line>";
|
||||
out += "<line x1=\"300\" y1=\"115\" x2=\"300\" y2=\"125\" style=\"stroke:black;stroke-width:1\"></line>";
|
||||
out += "<line x1=\"421\" y1=\"115\" x2=\"421\" y2=\"125\" style=\"stroke:black;stroke-width:1\"></line>";
|
||||
out += "<line x1=\"540\" y1=\"115\" x2=\"540\" y2=\"125\" style=\"stroke:black;stroke-width:1\"></line>";
|
||||
out += "Sorry, your browser does not support inline SVG.";
|
||||
|
||||
|
||||
// Plot polyline
|
||||
out += "<g stroke=\"black\">\n";
|
||||
int y = rand() % 130;
|
||||
// for (int i = 0; i < size(times); i ++) {
|
||||
// int y2 = rand() % 130;
|
||||
// sprintf(temp, "<line x1=\"%d\" y1=\"%d\" x2=\"%d\" y2=\"%d\" stroke-width=\"1\" />\n", x, 140 - y, x + 10, 140 - y2);
|
||||
// out += temp;
|
||||
// y = y2;
|
||||
// }
|
||||
out += "<polyline points=\"";
|
||||
for (int i = 0; i < len; i++) {
|
||||
sprintf(temp, "%d,%d ", (int)(58 + (xscale * (x[i] - minX))), (int)(111 - (yscale * (y[i] - minY))));
|
||||
out += temp;
|
||||
}
|
||||
out += "\" style=\"fill:none;stroke:black;stroke-width:2\" />";
|
||||
out += "</g>\n</svg>\n";
|
||||
|
||||
|
||||
server.send ( 200, "image/svg+xml", out);
|
||||
}
|
||||
|
||||
void tempGraph() {
|
||||
int times[] = {1, 2, 3, 4, 5, 6};
|
||||
int temps[] = {1, 2, 3, 1, 5, 3};
|
||||
drawGraph(times, temps, 400, 150, 232, 240, 255);
|
||||
lcd.clear();
|
||||
int times[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80, 85, 90, 95, 100};
|
||||
int temps[] = {70, 75, 81, 86, 90, 94, 97, 100, 103, 107,
|
||||
110, 113, 116, 130, 146, 160, 173, 186, 194, 205,
|
||||
220, 240, 255, 268, 282, 300, 300, 336, 335
|
||||
};
|
||||
drawGraph(times, temps, 29);
|
||||
|
||||
|
||||
lcd.setCursor(0, 0);
|
||||
for (int i = 0; i < 6; i++) {
|
||||
lcd.print(times[i]);
|
||||
lcd.print(" ");
|
||||
}
|
||||
lcd.setCursor(0, 1);
|
||||
for (int i = 0; i < sizeof(times) / sizeof(int); i++) {
|
||||
lcd.print(temps[i]);
|
||||
lcd.print(" ");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user