From 659bf875eac29431b489efb34ae7d92f350d4f2d Mon Sep 17 00:00:00 2001 From: chshkhr Date: Fri, 2 Dec 2022 12:44:30 +0200 Subject: [PATCH] relay, switcher, dht backend --- app_httpd.cpp | 25 ++++++++- esp32-cam-webserver.ino | 3 +- vsc.cpp | 118 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 143 insertions(+), 3 deletions(-) create mode 100644 vsc.cpp diff --git a/app_httpd.cpp b/app_httpd.cpp index 1c933c4..71b99be 100644 --- a/app_httpd.cpp +++ b/app_httpd.cpp @@ -321,6 +321,13 @@ static esp_err_t stream_handler(httpd_req_t *req){ return res; } +extern void relay(int8_t value); +extern void switcher(int waitmsec, bool revert = false); +extern void gettemperature(bool is_dht21 = false); +extern float humidity; +extern float temp; +extern int8_t relay_on; + static esp_err_t cmd_handler(httpd_req_t *req){ char* buf; size_t buf_len; @@ -360,6 +367,7 @@ static esp_err_t cmd_handler(httpd_req_t *req){ int val = atoi(value); sensor_t * s = esp_camera_sensor_get(); int res = 0; + char res_s[60] = ""; if(!strcmp(variable, "framesize")) { if(s->pixformat == PIXFORMAT_JPEG) res = s->set_framesize(s, (framesize_t)val); } @@ -428,6 +436,21 @@ static esp_err_t cmd_handler(httpd_req_t *req){ Serial.print('.'); } } + else if(!strcmp(variable, "relay")) { + relay(val); + sprintf(res_s, "Relay %d", relay_on); + Serial.println(res_s); + } + else if(!strcmp(variable, "switcher")) { + switcher(val); + sprintf(res_s, "Switcher %d", val); + Serial.println(res_s); + } + else if(!strcmp(variable, "dht")) { + gettemperature(val == 1); + sprintf(res_s, "Temperature: %.1f°C
Humidity: %.0f%s", temp, humidity, "%"); + Serial.println(res_s); + } else { res = -1; } @@ -435,7 +458,7 @@ static esp_err_t cmd_handler(httpd_req_t *req){ return httpd_resp_send_500(req); } httpd_resp_set_hdr(req, "Access-Control-Allow-Origin", "*"); - return httpd_resp_send(req, NULL, 0); + return httpd_resp_send(req, res_s, strlen(res_s)); } static esp_err_t status_handler(httpd_req_t *req){ diff --git a/esp32-cam-webserver.ino b/esp32-cam-webserver.ino index 39a623d..91109e9 100644 --- a/esp32-cam-webserver.ino +++ b/esp32-cam-webserver.ino @@ -582,8 +582,7 @@ void WifiSetup() { if (mdnsName[k] == '_') break; if (k < sizeof(mdnsName)) { - int i; - for (i = 0; i < sizeof(auto_rename_by_ip3); i++){ + for (int i = 0; i < sizeof(auto_rename_by_ip3); i++){ if (auto_rename_by_ip3[i] == ip[3]) { char s[5]; i += 1; diff --git a/vsc.cpp b/vsc.cpp new file mode 100644 index 0000000..9adaf0d --- /dev/null +++ b/vsc.cpp @@ -0,0 +1,118 @@ +#include +#include + +#define SWITCH_PIN 2 +#define SWITCH_WAIT 300 + +#define FIRMWARE_FOLDER "http://192.168.108.43:8080/win/winweb/espfw/cam205/" +#define FIRMWARE_FILE "esp32_cam205_last.bin" + +#define RELAY_PIN 15 +int8_t relay_on = 0; + +#include +#define DHT_PIN 13 +DHT dht11(DHT_PIN, DHT11); +DHT dht21(DHT_PIN, DHT21); +float humidity, temp; // Values read from sensor + +void update() { + + Serial.println("Updating with " FIRMWARE_FILE "..."); + //stop_httpds(); + + t_httpUpdate_return ret = ESPhttpUpdate.update(FIRMWARE_FOLDER FIRMWARE_FILE); + + switch (ret) { + case HTTP_UPDATE_FAILED: + Serial.printf("HTTP_UPDATE_FAILED Error (%d): %s\n", ESPhttpUpdate.getLastError(), ESPhttpUpdate.getLastErrorString().c_str()); + //need_update(false); + break; + + case HTTP_UPDATE_NO_UPDATES: + Serial.println("HTTP_UPDATE_NO_UPDATES"); + break; + + case HTTP_UPDATE_OK: + Serial.println("HTTP_UPDATE_OK"); + break; + } +} + +void relay(int8_t value) { + pinMode(RELAY_PIN, OUTPUT); + if(value == -1) + relay_on = abs(relay_on - 1); + else + relay_on = value; + if (relay_on > 0) + relay_on = 1; + else if (relay_on < 0) + relay_on = 0; + digitalWrite(RELAY_PIN, relay_on); +} + +void switcher(int waitmsec, bool revert = false) { + int L0 = 0; + int L1 = 1; + if (revert) { + L0 = 1; + L1 = 0; + } + pinMode(SWITCH_PIN, OUTPUT); + digitalWrite(SWITCH_PIN, L1); + if (waitmsec > 0) { + delay(waitmsec); + digitalWrite(SWITCH_PIN, L0); + } +} + +unsigned long previousMillis = 0; // will store last temp was read +const long interval = 2000; // interval at which to read sensor +bool is_dht_inited = false; + +void gettemperature(bool is_dht21 = false) { + + if (!is_dht_inited){ + is_dht_inited = true; + if (is_dht21) { + dht21.begin(); + } else { + dht11.begin(); + } + delay(1000); + } + + // Wait at least 2 seconds seconds between measurements. + // if the difference between the current time and last time you read + // the sensor is bigger than the interval you set, read the sensor + // Works better than delay for things happening elsewhere also + unsigned long currentMillis = millis(); + + if (currentMillis - previousMillis >= interval) { + // save the last time you read the sensor + previousMillis = currentMillis; + + // Reading temperature for humidity takes about 250 milliseconds! + // Sensor readings may also be up to 2 seconds 'old' (it's a very slow sensor) + // Check if any reads failed and exit early (to try again). + for (int i = 0; i < 10; i++) { + if (is_dht21) { + humidity = dht21.readHumidity(); // Read humidity (percent) + temp = dht21.readTemperature(false); // Read temperature as Fahrenheit + } else { + humidity = dht11.readHumidity(); // Read humidity (percent) + temp = dht11.readTemperature(false); // Read temperature as Fahrenheit + } + + if (isnan(humidity) || isnan(temp) || temp > 1000 || humidity > 1000) { + delay(500); + } else { + return; + } + } + + humidity = 0; + temp = 0; + } +}