generated from jmgiacalone/esp32-template
Functional.
This commit is contained in:
252
src/main.cpp
252
src/main.cpp
@@ -1,4 +1,5 @@
|
||||
#include <Arduino.h>
|
||||
#define DEBUG
|
||||
|
||||
//Peripherals includes
|
||||
#include <Wire.h>
|
||||
@@ -6,6 +7,8 @@
|
||||
#include <Adafruit_GFX.h>
|
||||
#include <Adafruit_SSD1306.h>
|
||||
#include <max6675.h>
|
||||
// #include <QuickPID.h>
|
||||
#include <PID_v1.h>
|
||||
|
||||
//Web server includes
|
||||
#include <AsyncElegantOTA.h>
|
||||
@@ -16,14 +19,49 @@
|
||||
#include <AsyncTCP.h>
|
||||
#include <ESPAsyncWebServer.h>
|
||||
#include <SPIFFSEditor.h>
|
||||
#include <Arduino_JSON.h>
|
||||
// #include <Arduino_JSON.h>
|
||||
#include "AsyncJson.h"
|
||||
#include <ArduinoJson.h>
|
||||
|
||||
#include <Preferences.h>
|
||||
Preferences settings;
|
||||
|
||||
#define MAX6675_SCLK 12
|
||||
#define MAX6675_CS 13
|
||||
#define MAX6675_MISO 15
|
||||
#define I2C_SDA 5//13
|
||||
#define I2C_SCL 4//15
|
||||
#define LED_PIN 5
|
||||
#define LED_PIN 16
|
||||
#define HEATER_PIN 14
|
||||
|
||||
//PID
|
||||
#define T_SAMPLE_PERIOD 1000 // in milliseconds.
|
||||
uint32_t temperature_sample_timer = 0;
|
||||
double target = 0;
|
||||
double temperature = 0;
|
||||
double power = 0;
|
||||
int runProfile = 0;
|
||||
long int profileStartTime = 0;
|
||||
long int elapsedTime = 0;
|
||||
|
||||
struct dataPoint{
|
||||
double time;
|
||||
double temp;
|
||||
};
|
||||
struct dataPoint sProfile[10];
|
||||
|
||||
double kp = 950;
|
||||
double ki = 0.05;
|
||||
double kd = 100;
|
||||
PID outputPID(&temperature, &power, &target, kp, ki, kd, DIRECT);
|
||||
int cycle = 10000; //WindowSize
|
||||
unsigned long duty = 0; //WindowStartTime
|
||||
|
||||
// boolean on_off = false;
|
||||
|
||||
//DATA
|
||||
// StaticJsonBuffer<JSON_OBJECT_SIZE(5)> jbStatus;
|
||||
// JsonObject& objStatus = jbStatus.createObject();
|
||||
|
||||
//*****
|
||||
// Display defines
|
||||
@@ -39,7 +77,6 @@ unsigned long lastScreenRefresh = 0;
|
||||
//MAX6675(int8_t SCLK, int8_t CS, int8_t MISO);
|
||||
MAX6675 tc(12, 13, 15);
|
||||
unsigned long lastTempTime = 0;
|
||||
float temperature;
|
||||
|
||||
//*********************************************************
|
||||
// Web server variable declarations
|
||||
@@ -51,7 +88,7 @@ AsyncWebServer server(80);
|
||||
// AsyncEventSource events("/events");
|
||||
|
||||
//Variables to save values from HTML form
|
||||
JSONVar scannedSSIDs;
|
||||
// JSONVar scannedSSIDs;
|
||||
String ssid;
|
||||
String pass;
|
||||
String ip;
|
||||
@@ -86,14 +123,43 @@ bool initWiFi();
|
||||
String getLEDState();
|
||||
// ----------------------------------------------
|
||||
|
||||
String getStatus(void)
|
||||
{
|
||||
// String json;
|
||||
JsonDocument jsonStatus;
|
||||
jsonStatus["temp"] = String(temperature);
|
||||
jsonStatus["target"] = String(target);
|
||||
jsonStatus["power"] = String(power);
|
||||
jsonStatus["runProfile"] = String(runProfile);
|
||||
jsonStatus["elapsedTime"] = String(elapsedTime);
|
||||
String out;
|
||||
serializeJson(jsonStatus,out);
|
||||
return out;
|
||||
// return JSON.stringify(jsonStatus);
|
||||
}
|
||||
|
||||
String getPID(AsyncWebServerRequest * request)
|
||||
{
|
||||
JsonDocument jsonPID;
|
||||
jsonPID["kp"] = String(kp);
|
||||
jsonPID["ki"] = String(ki);
|
||||
jsonPID["kd"] = String(kd);
|
||||
String out;
|
||||
serializeJson(jsonPID,out);
|
||||
return out;
|
||||
}
|
||||
|
||||
String getJSONTemp(){
|
||||
JSONVar jsonTemp;
|
||||
JsonDocument jsonTemp;
|
||||
jsonTemp["t"]=String(temperature);
|
||||
return JSON.stringify(jsonTemp);
|
||||
String out;
|
||||
serializeJson(jsonTemp,out);
|
||||
return out;
|
||||
}
|
||||
|
||||
void setup() {
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
pinMode(HEATER_PIN, OUTPUT);
|
||||
|
||||
Serial.begin(115200);
|
||||
|
||||
@@ -146,7 +212,7 @@ server.addHandler(new SPIFFSEditor(SPIFFS,http_username,http_password));
|
||||
server.on("/temperature", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
String json = getJSONTemp();
|
||||
request->send(200, "application/json", json);
|
||||
json = String();
|
||||
// json = String();
|
||||
});
|
||||
|
||||
server.on("/scanNetworks", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
@@ -288,32 +354,182 @@ server.addHandler(new SPIFFSEditor(SPIFFS,http_username,http_password));
|
||||
ESP.restart();
|
||||
}
|
||||
});
|
||||
server.on("/heap", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, "text/plain", String(ESP.getFreeHeap()));
|
||||
});
|
||||
server.on("/status", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, "text/plain", getStatus());
|
||||
});
|
||||
server.on("/pid", HTTP_GET, [](AsyncWebServerRequest *request){
|
||||
request->send(200, "text/plain", getPID(request));
|
||||
});
|
||||
server.on("/pid",HTTP_POST, [](AsyncWebServerRequest *request){
|
||||
if (request->hasParam("kp",true))
|
||||
{
|
||||
kp = request->getParam("kp",true)->value().toFloat();
|
||||
#ifdef DEBUG
|
||||
Serial.print("kp=");
|
||||
Serial.print(kp,2);
|
||||
Serial.print("; ");
|
||||
#endif
|
||||
}
|
||||
if (request->hasParam("ki",true))
|
||||
{
|
||||
ki = request->getParam("ki",true)->value().toFloat();
|
||||
#ifdef DEBUG
|
||||
Serial.print("ki=");
|
||||
Serial.print(ki,2);
|
||||
Serial.print("; ");
|
||||
#endif
|
||||
}
|
||||
if (request->hasParam("kd",true))
|
||||
{
|
||||
kd = request->getParam("kd",true)->value().toFloat();
|
||||
#ifdef DEBUG
|
||||
Serial.print("kd=");
|
||||
Serial.print(kd,2);
|
||||
Serial.print("; ");
|
||||
#endif
|
||||
}
|
||||
#ifdef DEBUG
|
||||
Serial.print("\n");
|
||||
#endif
|
||||
outputPID.SetTunings(kp, ki, kd);
|
||||
|
||||
server.begin();
|
||||
request->send(200, "text/plain", getPID(request));
|
||||
});
|
||||
server.on("/target", HTTP_POST, [](AsyncWebServerRequest *request){
|
||||
int params = request->params();
|
||||
if(params > 0){
|
||||
// AsyncWebParameter* p = request->getParam("value",true)->value().toFloat();
|
||||
target = request->getParam("value",true)->value().toDouble();
|
||||
Serial.printf("Target: %3.2f\n",target);
|
||||
}else{
|
||||
target = -273;
|
||||
}
|
||||
// if(request->hasParam("value")){
|
||||
// target = request->getParam("value")->value().toFloat();
|
||||
// Serial.printf("Target: %d",target);
|
||||
// }
|
||||
request->send(200, "text/plain", (String)target);
|
||||
});
|
||||
server.on("/profile", HTTP_POST,[](AsyncWebServerRequest *request){
|
||||
// AsyncCallbackJsonWebHandler *handler = new AsyncCallbackJsonWebHandler("/profile", [](AsyncWebServerRequest *request, JsonVariant &json) {
|
||||
|
||||
int params = request->params();
|
||||
if(request->hasParam("profile",true)){
|
||||
JsonDocument jsonObj;
|
||||
Serial.println(request->getParam("profile",true)->value());
|
||||
|
||||
DeserializationError error = deserializeJson(jsonObj, request->getParam("profile",true)->value());
|
||||
if (error) {
|
||||
// Handle the error
|
||||
Serial.println(error.c_str()); request->send(400, "text/plain", "Invalid JSON payload"); return;
|
||||
}else{
|
||||
for(int i = 0;i<10;i++) {
|
||||
//double point[2];
|
||||
//int pointCount = jsonObj["profile"][i].as<JsonArray>().copyTo(point);
|
||||
sProfile[i].time = jsonObj[i]["x"];
|
||||
sProfile[i].temp = jsonObj[i]["y"];
|
||||
#ifdef DEBUG
|
||||
Serial.print("Point:");
|
||||
Serial.print(i);
|
||||
Serial.print(", Time:");
|
||||
Serial.print(sProfile[i].time);
|
||||
Serial.print(", Temp:");
|
||||
Serial.println(sProfile[i].temp);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(request->hasParam("run",true)){
|
||||
runProfile = request->getParam("run",true)->value().toInt();
|
||||
Serial.println(runProfile);
|
||||
if(runProfile == 1){
|
||||
profileStartTime = millis();
|
||||
elapsedTime = 0;
|
||||
}else{
|
||||
target = 0;
|
||||
}
|
||||
|
||||
}
|
||||
request->send(200, "text/plain", "{test: \"ok\"}");
|
||||
});
|
||||
|
||||
server.begin();
|
||||
duty = millis();
|
||||
outputPID.SetOutputLimits(0, cycle);
|
||||
outputPID.SetSampleTime(T_SAMPLE_PERIOD);
|
||||
outputPID.SetTunings(kp, ki, kd);
|
||||
outputPID.SetMode(AUTOMATIC);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void loop() {
|
||||
digitalWrite(LED_PIN,HIGH);
|
||||
temperature = tc.readCelsius();
|
||||
delay(500);
|
||||
digitalWrite(LED_PIN,LOW);
|
||||
delay(500);
|
||||
if ((millis() - lastScreenRefresh) > SCREEN_REFRESH) {
|
||||
long now = millis();
|
||||
if(now - temperature_sample_timer >= T_SAMPLE_PERIOD)
|
||||
{
|
||||
temperature = tc.readCelsius();
|
||||
temperature_sample_timer = now;
|
||||
//deal with profile
|
||||
if(runProfile == 1){
|
||||
elapsedTime = millis() - profileStartTime;
|
||||
if(sProfile[9].time * 1000 > elapsedTime){
|
||||
//find segment
|
||||
int segment = 0;
|
||||
for(segment;segment<10;segment++){
|
||||
if(sProfile[segment].time * 1000 < elapsedTime && sProfile[segment+1].time * 1000 >= elapsedTime){
|
||||
break;
|
||||
};
|
||||
}
|
||||
Serial.print("Segment:");
|
||||
Serial.print(segment);
|
||||
double t_t1 = elapsedTime - (sProfile[segment].time * 1000);
|
||||
double t2_t1 = (sProfile[segment+1].time - sProfile[segment].time) * 1000;
|
||||
double T2_T1 = sProfile[segment+1].temp - sProfile[segment].temp;
|
||||
|
||||
target = sProfile[segment].temp + (t_t1 / t2_t1) * T2_T1;
|
||||
Serial.print(", Target:");
|
||||
Serial.println(target);
|
||||
}else{
|
||||
runProfile = 0;
|
||||
target = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//set heater output
|
||||
outputPID.Compute();
|
||||
|
||||
unsigned long rightNow = millis();
|
||||
if (rightNow - duty > cycle)
|
||||
{ //time to shift the Relay Window
|
||||
duty += cycle;
|
||||
}
|
||||
if (power > rightNow - duty){
|
||||
digitalWrite(HEATER_PIN, HIGH);
|
||||
}else{
|
||||
digitalWrite(HEATER_PIN, LOW);
|
||||
}
|
||||
|
||||
if ((now - lastScreenRefresh) > SCREEN_REFRESH) {
|
||||
Serial.printf("T:%.2f\n", temperature);
|
||||
|
||||
display.clearDisplay();
|
||||
display.setTextSize(3);
|
||||
display.setCursor(0, 5);
|
||||
display.printf("T:%.1f\n", temperature);
|
||||
display.setTextSize(1);
|
||||
display.setCursor(0, 3);
|
||||
display.printf("T:%.1f/%.1f\n", temperature, target);
|
||||
display.setCursor(0,24);
|
||||
display.printf("P:%.1f\n", power);
|
||||
display.setCursor(0,48);
|
||||
display.printf("%s\n",ssid);
|
||||
display.printf("%s",ip);
|
||||
display.display();
|
||||
|
||||
lastScreenRefresh = millis();
|
||||
lastScreenRefresh = now;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user