First version of the external temperature/humidity sensor

pull/60/head
Miroslav Pivovarsky 2024-07-12 21:44:08 +02:00
parent b0c88946b4
commit e99a5b6afa
21 changed files with 489 additions and 69 deletions

View File

@ -13,6 +13,7 @@
- ArduinoJson - MIT - 7.1.0 - https://github.com/bblanchon/ArduinoJson
- ArduinoUniqueID - MIT - 1.3.0 - https://github.com/ricaun/ArduinoUniqueID
- arduino-esp32 - LGPL 2.1 - 3.0.2 - https://github.com/espressif/arduino-esp32
- DHTnew - MIT - 0.4.20 - https://github.com/RobTillaart/DHTNew
Arduino IDE configuration for the MCU are stored in the module_XXX.h file.
@ -95,6 +96,9 @@ void setup() {
/* init class for communication with PrusaConnect */
Connect.Init();
/* init external temperature sensor */
ExternalTemperatureSensor.Init();
/* init wdg */
SystemLog.AddEvent(LogLevel_Info, F("Init WDG"));
esp_task_wdt_config_t twdt_config;
@ -121,8 +125,8 @@ void setup() {
#endif
xTaskCreatePinnedToCore(System_TaskSerialCfg, "CheckSerialConfiguration", 2600, NULL, 5, &Task_SerialCfg, 0); /*function, description, stack size, parameters, priority, task handle, core*/
ESP_ERROR_CHECK(esp_task_wdt_add(Task_SerialCfg));
xTaskCreatePinnedToCore(System_TaskStreamTelemetry, "PrintStreamTelemetry", 2200, NULL, 6, &Task_StreamTelemetry, 0); /*function, description, stack size, parameters, priority, task handle, core*/
ESP_ERROR_CHECK(esp_task_wdt_add(Task_StreamTelemetry));
xTaskCreatePinnedToCore(System_TaskSystemTelemetry, "PrintSystemTelemetry", 2200, NULL, 6, &Task_SystemTelemetry, 0); /*function, description, stack size, parameters, priority, task handle, core*/
ESP_ERROR_CHECK(esp_task_wdt_add(Task_SystemTelemetry));
xTaskCreatePinnedToCore(System_TaskSysLed, "SystemLed", 2100, NULL, 7, &Task_SysLed, 0); /*function, description, stack size, parameters, priority, task handle, core*/
ESP_ERROR_CHECK(esp_task_wdt_add(Task_SysLed));
xTaskCreatePinnedToCore(System_TaskWiFiWatchdog, "WiFiWatchdog", 2200, NULL, 8, &Task_WiFiWatchdog, 0); /*function, description, stack size, parameters, priority, task handle, core*/

View File

@ -0,0 +1,150 @@
/**
@file ExternalTemperatureSensor.cpp
@brief Library for external temperature sensor control
@author Miroslav Pivovarsky
Contact: miroslav.pivovarsky@gmail.com
@bug: no know bug
*/
#include "ExternalTemperatureSensor.h"
ExternalSensor ExternalTemperatureSensor(DHT_SENSOR_PIN, DHT_SENSOR_ENABLE, &SystemLog, &SystemConfig);
ExternalSensor::ExternalSensor(uint8_t i_pin, bool i_enable, Logs *i_log, Configuration *i_cfg) : DhtSensor(i_pin) {
Pin = i_pin;
SystemEnable = i_enable;
log = i_log;
config = i_cfg;
}
void ExternalSensor::Init() {
log->AddEvent(LogLevel_Info, F("Init external temperature sensor"));
Unit = (TemperatureSensorUnit_enum) config->LoadExternalTemperatureSensorUnit();
UserEnable = config->LoadExternalTemperatureSensorEnable();
//DhtSensor.setHumOffset(10);
//DhtSensor.setTempOffset(-3.5);
ReadSensorData();
}
String ExternalSensor::GetSensorStatus() {
String status = "";
if (false == SystemEnable) {
status = "Unsupport sensor";
} else if (false == UserEnable) {
status = "Sensor disabled";
} else {
status = "Detected: ";
SensorType = DhtSensor.getType();
switch (SensorType) {
case 0:
status += "not defined";
break;
case 11:
status += "DHT11";
break;
case 22:
status += "DHT22";
break;
case 23:
status += "DHT22";
break;
case 70:
status += "Sonoff Si7021";
break;
default:
status += "Unknown";
break;
}
}
return status;
}
void ExternalSensor::EnableSensor(bool i_enable) {
if (true == SystemEnable) {
UserEnable = i_enable;
config->SaveExternalTemperatureSensorEnable(UserEnable);
} else {
UserEnable = false;
config->SaveExternalTemperatureSensorEnable(UserEnable);
}
}
void ExternalSensor::ReadSensorData() {
if ((true == SystemEnable) && (true == UserEnable)) {
DhtSensor.read();
}
}
void ExternalSensor::SetUnit(TemperatureSensorUnit_enum i_unit) {
Unit = i_unit;
config->SaveExternalTemperatureSensorUnit(Unit);
}
float ExternalSensor::GetTemperature() {
float temp = 0.0;
if ((true == SystemEnable) && (true == UserEnable)) {
if (Unit == TEMPERATURE_UNIT_CELSIUS) {
temp = DhtSensor.getTemperature();
} else if (Unit == TEMPERATURE_UNIT_FAHRENHEIT) {
temp = DhtSensor.getTemperature() * 9.0 / 5.0 + 32.0;
}
}
return temp;
}
float ExternalSensor::GetHumidity() {
if ((true == SystemEnable) && (true == UserEnable)) {
return DhtSensor.getHumidity();
} else {
return 0.0;
}
}
String ExternalSensor::GetTemperatureString() {
String temp = "";
if (false == SystemEnable) {
temp = "Unsupport";
} else if ((false == UserEnable) || (false == SystemEnable)) {
temp = "Disabled";
} else {
if (Unit == TEMPERATURE_UNIT_CELSIUS) {
temp = String(GetTemperature(), 1) + " °C";
} else if (Unit == TEMPERATURE_UNIT_FAHRENHEIT) {
temp = String(GetTemperature(), 1) + " °F";
}
}
return temp;
}
String ExternalSensor::GetHumidityString() {
String hum = "";
if (false == SystemEnable) {
hum = "Unsupport";
} else if ((false == UserEnable) || (false == SystemEnable)) {
hum = "Disabled";
} else {
hum = String(GetHumidity(), 1) + " %";
}
return hum;
}
bool ExternalSensor::GetUserEnableSensor() {
return UserEnable;
}
TemperatureSensorUnit_enum ExternalSensor::GetTemperatureUnit() {
return Unit;
}
/* EOF */

View File

@ -0,0 +1,59 @@
/**
@file ExternalTemperatureSensor.h
@brief Library for external temperature sensor control
@author Miroslav Pivovarsky
Contact: miroslav.pivovarsky@gmail.com
@bug: no know bug
*/
#pragma once
#include <Arduino.h>
#include "log.h"
#include "mcu_cfg.h"
#include "module_templates.h"
#include <dhtnew.h>
#include "cfg.h"
#include "ExternalTemperatureSensorTypes.h"
class Logs;
class Configuration;
class ExternalSensor {
private:
TemperatureSensorUnit_enum Unit; ///< unit number
DHTNEW DhtSensor; ///< DHT sensor object
uint8_t Pin; ///< pin number
bool SystemEnable; ///< system enable flag
bool UserEnable; ///< user enable flag
uint8_t SensorType; ///< sensor type
Logs *log;
Configuration *config;
public:
ExternalSensor(uint8_t, bool, Logs *, Configuration *);
~ExternalSensor(){};
void Init();
String GetSensorStatus();
void EnableSensor(bool);
void ReadSensorData();
void SetUnit(TemperatureSensorUnit_enum);
float GetTemperature();
float GetHumidity();
String GetTemperatureString();
String GetHumidityString();
bool GetUserEnableSensor();
TemperatureSensorUnit_enum GetTemperatureUnit();
};
extern ExternalSensor ExternalTemperatureSensor;
/* EOF */

View File

@ -0,0 +1,19 @@
/**
@file connect_types.h
@brief Here are defined types for communication with prusa connect backend
@author Miroslav Pivovarsky
Contact: miroslav.pivovarsky@gmail.com
@bug: no know bug
*/
#pragma once
enum TemperatureSensorUnit_enum {
TEMPERATURE_UNIT_CELSIUS = 0, ///< Celsius
TEMPERATURE_UNIT_FAHRENHEIT = 1 ///< Fahrenheit
};
/* EOF */

View File

@ -82,6 +82,7 @@ const char index_html[] PROGMEM = R"rawliteral(
<li><a href="page_wifi.html">Wi-Fi</a></li>
<li><a href="page_auth.html">Authentication</a></li>
<li><a href="page_system.html">System</a></li>
<li><a href="page_temperature.html">Temperature</a></li>
</div>
</div>
</div>
@ -364,6 +365,35 @@ const char page_system_html[] PROGMEM = R"rawliteral(
</script>
)rawliteral";
/* ------------------------------------------------------------------------------------------------------------ */
const char page_temperature_html[] PROGMEM = R"rawliteral(
<style>@import url("styles.css");</style>
<script src="jquery-3.7.0.min.js"></script>
<body>
<center>
<table>
<tr><td class=pa3>External temperature sensor DHT22/DHT11</td><td></td></tr>
<tr><td class=pa1 align="right">Enable sensors</td><td><label class="switch"><input type="checkbox" name="extsens_en" id="extsetsid" onchange="changeValue(this.checked, 'set_bool?extsens_enable=', 'temp')"><span class="checkbox_slider round"></span></label></label> <span class=pa1 id="status_extsens"></span></td></tr>
<tr><td class="ps1">Sensor status: </td><td class="pa2" id="extsens_stat"></td></tr>
<tr>
<td class="pa1">Temperature Unit</td><td><label for="temp_unit"></label>
<select class="select" id="temp_unitid" name="temp_unit" onchange="changeValue(this.value, 'set_int?temp_unit=', 'temp')">
<option value="0">Celsius</option>
<option value="1">Fahrenheit</option>
</select>
</td>
</tr>
<tr><td class="pa1">Temperature</td><td class="pa2" id="ext_temp"></td></tr>
<tr><td class="pa1">Humidity</td><td class="pa2" id="ext_hum"></td></tr>
</table>
</center>
</body>
<script src="scripts.js"></script>
<script>
get_data("temp");
</script>
)rawliteral";
/* ------------------------------------------------------------------------------------------------------------ */
const char styles_css[] PROGMEM = R"rawliteral(
body {
@ -995,6 +1025,14 @@ function get_data(val) {
document.getElementById('mdnsid').value = obj.mdns;
document.getElementById('loglevelid').value = obj.log_level;
}
if (val == "temp") {
$("#extsens_stat").text(obj.extsens_stat);
document.getElementById('extsetsid').checked = obj.extsen_en;
document.getElementById('temp_unitid').value = obj.exttemp_unit;
$("#ext_temp").text(obj.ext_temp);
$("#ext_hum").text(obj.ext_hum);
}
},
error: function(html) {
console.log("json Timeout or error");

View File

@ -208,6 +208,15 @@ void Server_InitWebServer_WebPages() {
Server_handleCacheRequest(request, "text/html", page_system_html);
});
/* route for temperature web page */
server.on("/page_temperature.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get page_temperature.html"));
if (Server_CheckBasicAuth(request) == false)
return;
Server_handleCacheRequest(request, "text/html", page_temperature_html);
});
/* route to license page */
server.on("/license.html", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get license.html"));
@ -257,6 +266,24 @@ void Server_InitWebServer_WebPages() {
request->send(404, "text/plain", "Micro SD card not found with FAT32 partition!");
}
});
/* route to get temperature */
server.on("/get_temp", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get get_temp"));
if (Server_CheckBasicAuth(request) == false)
return;
request->send(200, "text/plain", String(ExternalTemperatureSensor.GetTemperature()));
});
/* route to get humidity */
server.on("/get_hum", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: Get get_hum"));
if (Server_CheckBasicAuth(request) == false)
return;
request->send(200, "text/plain", String(ExternalTemperatureSensor.GetHumidity()));
});
}
/**
@ -484,7 +511,7 @@ void Server_InitWebServer_Actions() {
ESP.restart();
});
/* route for change LED status */
/* route for change LED status */
server.on("/action_sderase", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: /action_sderase remove files from SD card"));
if (Server_CheckBasicAuth(request) == false)
@ -636,6 +663,14 @@ void Server_InitWebServer_Sets() {
response = true;
}
/* set saturation */
if (request->hasParam("temp_unit")) {
SystemLog.AddEvent(LogLevel_Verbose, F("Set temp_unit"));
ExternalTemperatureSensor.SetUnit((TemperatureSensorUnit_enum) request->getParam("temp_unit")->value().toInt());
response_msg = MSG_SAVE_OK;
response = true;
}
if (true == response) {
request->send(200, F("text/html"), response_msg.c_str());
}
@ -734,27 +769,36 @@ void Server_InitWebServer_Sets() {
response = true;
}
/* set service AP */
if (request->hasParam("serviceap_enable")) {
SystemLog.AddEvent(LogLevel_Verbose, F("Set service AP enable"));
SystemWifiMngt.SetEnableServiceAp(Server_TransfeStringToBool(request->getParam("serviceap_enable")->value()));
response = true;
}
/* set timelaps enable */
if (request->hasParam("timelaps_enable")) {
SystemLog.AddEvent(LogLevel_Verbose, F("Set timelaps enable"));
#if (ENABLE_SD_CARD == true)
bool val = Server_TransfeStringToBool(request->getParam("timelaps_enable")->value());
if ((true == val ) && (SystemLog.GetCardDetectedStatus() == true)) {
if ((true == val) && (SystemLog.GetCardDetectedStatus() == true)) {
Connect.SetTimeLapsPhotoSaveStatus(val);
} else {
Connect.SetTimeLapsPhotoSaveStatus(false);
}
#else
Connect.SetTimeLapsPhotoSaveStatus(false);
Connect.SetTimeLapsPhotoSaveStatus(false);
#endif
response = true;
}
/* set external temperature sensor enable */
if (request->hasParam("extsens_enable")) {
SystemLog.AddEvent(LogLevel_Verbose, F("Set enable ext temperature"));
ExternalTemperatureSensor.EnableSensor(Server_TransfeStringToBool(request->getParam("extsens_enable")->value()));
response = true;
}
if (true == response) {
request->send(200, F("text/html"), MSG_SAVE_OK);
}
@ -808,7 +852,7 @@ void Server_InitWebServer_Sets() {
request->send(200, F("text/html"), MSG_SAVE_OK_WIFI);
/* save ssid and password */
SystemWifiMngt.SetStaCredentials(TmpSsid,TmpPassword);
SystemWifiMngt.SetStaCredentials(TmpSsid, TmpPassword);
SystemWifiMngt.WiFiStaConnect();
} else {
@ -816,7 +860,7 @@ void Server_InitWebServer_Sets() {
}
});
/* route for set WI-FI static IP address */
/* route for set WI-FI static IP address */
server.on("/wifi_net_cfg", HTTP_GET, [](AsyncWebServerRequest* request) {
SystemLog.AddEvent(LogLevel_Verbose, F("WEB server: set WI-FI static IP address"));
if (Server_CheckBasicAuth(request) == false)
@ -848,9 +892,7 @@ void Server_InitWebServer_Sets() {
}
/* check min and max length network parameters */
if (((tmpIp.length() > 0) && (tmpMask.length() > 0) && (tmpGw.length() > 0) && (tmpDns.length() > 0)) &&
((tmpIp.length() <= IPV4_ADDR_MAX_LENGTH) && (tmpMask.length() <= IPV4_ADDR_MAX_LENGTH) &&
(tmpGw.length() <= IPV4_ADDR_MAX_LENGTH) && (tmpDns.length() <= IPV4_ADDR_MAX_LENGTH))) {
if (((tmpIp.length() > 0) && (tmpMask.length() > 0) && (tmpGw.length() > 0) && (tmpDns.length() > 0)) && ((tmpIp.length() <= IPV4_ADDR_MAX_LENGTH) && (tmpMask.length() <= IPV4_ADDR_MAX_LENGTH) && (tmpGw.length() <= IPV4_ADDR_MAX_LENGTH) && (tmpDns.length() <= IPV4_ADDR_MAX_LENGTH))) {
/* save ssid and password */
SystemWifiMngt.SetNetworkConfig(tmpIp, tmpMask, tmpGw, tmpDns);
@ -1010,8 +1052,7 @@ void Server_InitWebServer_Update() {
SystemLog.AddEvent(LogLevel_Error, String(SYSTEM_MSG_UPDATE_FAIL));
}
}
}
);
});
/* route for start web OTA update from server */
server.on("/web_ota_update", HTTP_GET, [](AsyncWebServerRequest* request) {
@ -1079,8 +1120,8 @@ void Server_resume() {
* @param const char* - content type
* @param const char* - data
*/
void Server_handleCacheRequest(AsyncWebServerRequest* request, const char *contentType, const char *data) {
AsyncWebServerResponse *response = request->beginResponse(200, contentType, data);
void Server_handleCacheRequest(AsyncWebServerRequest* request, const char* contentType, const char* data) {
AsyncWebServerResponse* response = request->beginResponse(200, contentType, data);
response->addHeader("Cache-Control", "public, max-age=" + String(WEB_CACHE_INTERVAL));
request->send(response);
}
@ -1174,6 +1215,11 @@ String Server_GetJsonData() {
doc_json["sw_build"] = SW_BUILD;
doc_json["sw_ver"] = SW_VERSION;
doc_json["sw_new_ver"] = FirmwareUpdate.NewVersionFw;
doc_json["extsens_stat"] = ExternalTemperatureSensor.GetSensorStatus();
doc_json["extsen_en"] = ExternalTemperatureSensor.GetUserEnableSensor();
doc_json["ext_temp"] = ExternalTemperatureSensor.GetTemperatureString();
doc_json["ext_hum"] = ExternalTemperatureSensor.GetHumidityString();
doc_json["exttemp_unit"] = ExternalTemperatureSensor.GetTemperatureUnit();
serializeJson(doc_json, string_json);
SystemLog.AddEvent(LogLevel_Verbose, string_json);
@ -1200,8 +1246,8 @@ bool Server_CheckBasicAuth(AsyncWebServerRequest* request) {
@param AsyncWebServerRequest - request
@return void
*/
void Server_streamJpg(AsyncWebServerRequest *request) {
AsyncJpegStreamResponse *response = new AsyncJpegStreamResponse(&SystemCamera, &SystemLog);
void Server_streamJpg(AsyncWebServerRequest* request) {
AsyncJpegStreamResponse* response = new AsyncJpegStreamResponse(&SystemCamera, &SystemLog);
if (!response) {
request->send(501);
return;

View File

@ -31,6 +31,7 @@
#include "connect.h"
#include "wifi_mngt.h"
#include "WebStream.h"
#include "ExternalTemperatureSensor.h"
extern AsyncWebServer server; ///< global variable for web server

View File

@ -852,6 +852,26 @@ void Configuration::SaveTimeLapseFunctionStatus(bool i_data) {
SaveBool(EEPROM_ADDR_TIMELAPS_ENABLE_START, i_data);
}
/**
@info Save external temperature sensor enable
@param bool - value
@return none
*/
void Configuration::SaveExternalTemperatureSensorEnable(bool i_data) {
Log->AddEvent(LogLevel_Verbose, F("Save external temperature sensor enable: "), String(i_data));
SaveBool(EEPROM_ADDR_EXT_SENS_ENABLE_START, i_data);
}
/**
@info Save external temperature sensor unit
@param uint8_t - value
@return none
*/
void Configuration::SaveExternalTemperatureSensorUnit(uint8_t i_data) {
Log->AddEvent(LogLevel_Verbose, F("Save external temperature sensor unit: "), String(i_data));
SaveUint8(EEPROM_ADDR_EXT_SENS_UNIT_START, i_data);
}
/**
@info load refresh interval from eeprom
@param none
@ -1363,4 +1383,27 @@ bool Configuration::LoadTimeLapseFunctionStatus() {
return (bool) ret;
}
bool Configuration::LoadExternalTemperatureSensorEnable() {
uint8_t ret = EEPROM.read(EEPROM_ADDR_EXT_SENS_ENABLE_START);
Log->AddEvent(LogLevel_Info, F("External temperature sensor enable: "), String(ret));
if (ret == 255) {
ret = 0;
}
return (bool) ret;
}
uint8_t Configuration::LoadExternalTemperatureSensorUnit() {
uint8_t ret = EEPROM.read(EEPROM_ADDR_EXT_SENS_UNIT_START);
Log->AddEvent(LogLevel_Info, F("External temperature sensor unit: "), String(ret));
if (ret == 255) {
ret = 0;
}
return ret;
}
/* EOF */

View File

@ -74,6 +74,8 @@ public:
void SaveNetworkDns(String);
void SaveCameraImageExifRotation(uint8_t);
void SaveTimeLapseFunctionStatus(bool);
void SaveExternalTemperatureSensorEnable(bool);
void SaveExternalTemperatureSensorUnit(uint8_t);
uint8_t LoadRefreshInterval();
String LoadToken();
@ -116,6 +118,8 @@ public:
String LoadNetworkDns();
uint8_t LoadCameraImageExifRotation();
bool LoadTimeLapseFunctionStatus();
bool LoadExternalTemperatureSensorEnable();
uint8_t LoadExternalTemperatureSensorUnit();
private:
Logs *Log; ///< Pointer to Logs object

View File

@ -14,15 +14,15 @@
#define _MCU_CFG_H_
/* ----------------- CAMERA TYPE ---------------*/
#define AI_THINKER_ESP32_CAM true
#define ESP32_WROVER_DEV false
#define CAMERA_MODEL_ESP32_S3_DEV_CAM false
#define CAMERA_MODEL_ESP32_S3_EYE_2_2 false
#define AI_THINKER_ESP32_CAM true
#define ESP32_WROVER_DEV false
#define CAMERA_MODEL_ESP32_S3_DEV_CAM false
#define CAMERA_MODEL_ESP32_S3_EYE_2_2 false
#define CAMERA_MODEL_XIAO_ESP32_S3_CAM false
#define CAMERA_MODEL_ESP32_S3_CAM false
#define CAMERA_MODEL_ESP32_S3_CAM false
/* ---------------- BASIC MCU CFG --------------*/
#define SW_VERSION "1.1.0-rc1" ///< SW version
#define SW_VERSION "1.1.0-rc2" ///< SW version
#define SW_BUILD __DATE__ " " __TIME__ ///< build number
#define CONSOLE_VERBOSE_DEBUG false ///< enable/disable verbose debug log level for console
#define DEVICE_HOSTNAME "Prusa-ESP32cam" ///< device hostname
@ -46,7 +46,7 @@
#define TASK_SDCARD 25000 ///< sd card task interval [ms]
#define TASK_WIFI 28000 ///< wifi reconnect interval. Checking when is signal lost [ms]
#define TASK_SERIAL_CFG 1000 ///< serial cfg task interval [ms]
#define TASK_STREAM_TELEMETRY 30000 ///< stream telemetry task interval [ms]
#define TASK_SYSTEM_TELEMETRY 30000 ///< stream telemetry task interval [ms]
#define TASK_WIFI_WATCHDOG 20000 ///< wifi watchdog task interval [ms]
#define TASK_PHOTO_SEND 1000 ///< photo send task interval [ms]
#define TASK_SDCARD_FILE_REMOVE 30000 ///< sd card file remove task interval [ms]
@ -283,6 +283,12 @@
#define EEPROM_ADDR_TIMELAPS_ENABLE_START (EEPROM_ADDR_IMAGE_ROTATION_START + EEPROM_ADDR_IMAGE_ROTATION_LENGTH)
#define EEPROM_ADDR_TIMELAPS_ENABLE_LENGTH 1
#define EEPROM_ADDR_EXT_SENS_ENABLE_START (EEPROM_ADDR_TIMELAPS_ENABLE_START + EEPROM_ADDR_TIMELAPS_ENABLE_LENGTH)
#define EEPROM_ADDR_EXT_SENS_ENABLE_LENGTH 1
#define EEPROM_ADDR_EXT_SENS_UNIT_START (EEPROM_ADDR_EXT_SENS_ENABLE_START + EEPROM_ADDR_EXT_SENS_ENABLE_LENGTH)
#define EEPROM_ADDR_EXT_SENS_UNIT_LENGTH 1
#define EEPROM_SIZE (EEPROM_ADDR_REFRESH_INTERVAL_LENGTH + EEPROM_ADDR_FINGERPRINT_LENGTH + EEPROM_ADDR_TOKEN_LENGTH + \
EEPROM_ADDR_FRAMESIZE_LENGTH + EEPROM_ADDR_BRIGHTNESS_LENGTH + EEPROM_ADDR_CONTRAST_LENGTH + \
EEPROM_ADDR_SATURATION_LENGTH + EEPROM_ADDR_HMIRROR_LENGTH + EEPROM_ADDR_VFLIP_LENGTH + \
@ -297,7 +303,8 @@
EEPROM_ADDR_AEC_VALUE_LENGTH + EEPROM_ADDR_GAIN_CTRL_LENGTH + EEPROM_ADDR_AGC_GAIN_LENGTH + EEPROM_ADDR_LOG_LEVEL_LENGTH + \
EEPROM_ADDR_HOSTNAME_LENGTH + EEPROM_ADDR_SERVICE_AP_ENABLE_LENGTH + EEPROM_ADDR_NETWORK_IP_METHOD_LENGTH +\
EEPROM_ADDR_NETWORK_STATIC_IP_LENGTH + EEPROM_ADDR_NETWORK_STATIC_MASK_LENGTH + EEPROM_ADDR_NETWORK_STATIC_GATEWAY_LENGTH + \
EEPROM_ADDR_NETWORK_STATIC_DNS_LENGTH + EEPROM_ADDR_IMAGE_ROTATION_LENGTH + EEPROM_ADDR_TIMELAPS_ENABLE_LENGTH) ///< how many bits do we need for eeprom memory
EEPROM_ADDR_NETWORK_STATIC_DNS_LENGTH + EEPROM_ADDR_IMAGE_ROTATION_LENGTH + EEPROM_ADDR_TIMELAPS_ENABLE_LENGTH + \
EEPROM_ADDR_EXT_SENS_ENABLE_LENGTH + EEPROM_ADDR_EXT_SENS_UNIT_LENGTH) ///< how many bits do we need for eeprom memory
#endif

View File

@ -73,7 +73,7 @@
#define SD_PIN_DATA0 2 ///< GPIO pin for SD card data 0
/* ---------- RESET CFG CONFIGURATION ----------*/
#define CFG_RESET_PIN 12 ///< GPIO 16 is for reset CFG to default
#define CFG_RESET_PIN 12 ///< GPIO 12 is for reset CFG to default
#define CFG_RESET_LED_PIN 4 ///< GPIO for indication of reset CFG
#define CFG_RESET_LED_LEVEL_ON HIGH ///< GPIO pin level for status LED ON
@ -82,5 +82,9 @@
#define STATUS_LED_GPIO_NUM 33 ///< GPIO pin for status LED
#define STATUS_LED_OFF_PIN_LEVEL LOW ///< GPIO pin level for status LED ON
/* -------------- DHT SENSOR CFG ----------------*/
#define DHT_SENSOR_ENABLE true ///< enable/disable DHT sensor
#define DHT_SENSOR_PIN 13 ///< GPIO pin for DHT sensor
#endif // AI_THINKER_ESP32_CAM
/* EOF */

View File

@ -6,8 +6,10 @@
@author Miroslav Pivovarsky
Contact: miroslav.pivovarsky@gmail.com
https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html
https://www.seeedstudio.com/XIAO-ESP32S3-Sense-p-5639.html
https://wiki.seeedstudio.com/xiao_esp32s3_getting_started/
https://github.com/limengdu/SeeedStudio-XIAO-ESP32S3-Sense-camera
https://github.com/Seeed-Studio/XIAO_Series
@bug: Currently SW don't work with this DEV board. WiFi and MicroSD is not working

View File

@ -18,23 +18,23 @@
class Logs;
class sys_led {
private:
uint8_t pin; ///< pin number for system LED
uint32_t time; ///< speed blinking time system LED
uint32_t ledOnDuration; ///< duration of LED on
Logs *log; ///< pointer to log class
private:
uint8_t pin; ///< pin number for system LED
uint32_t time; ///< speed blinking time system LED
uint32_t ledOnDuration; ///< duration of LED on
Logs *log; ///< pointer to log class
public:
sys_led(uint8_t, uint32_t);
sys_led(uint8_t, uint32_t, Logs *);
~sys_led(){};
public:
sys_led(uint8_t, uint32_t);
sys_led(uint8_t, uint32_t, Logs *);
~sys_led(){};
void init();
void toggle();
void set(bool);
bool get();
void setTimer(uint32_t);
uint32_t getTimer();
void init();
void toggle();
void set(bool);
bool get();
void setTimer(uint32_t);
uint32_t getTimer();
};
extern sys_led system_led;

View File

@ -459,9 +459,6 @@ void System_TaskWifiManagement(void *pvParameters) {
/* wifi reconnect after signal lost */
SystemWifiMngt.WiFiReconnect();
SystemLog.AddEvent(LogLevel_Info, "Free RAM: " + String(ESP.getFreeHeap()) + " B" + ", Min: " + String(ESP.getMinFreeHeap()));
SystemLog.AddEvent(LogLevel_Info, "Free PSRAM: " + String(ESP.getFreePsram()) + " B" + ", Min: " + String(ESP.getMinFreePsram()));
SystemLog.AddEvent(LogLevel_Info, "Temperature: " + String(McuTemperature.TemperatureCelsius) + " *C");
SystemLog.AddEvent(LogLevel_Verbose, F("WiFiManagement task. Stack free size: "), String(uxTaskGetStackHighWaterMark(NULL)) + "B");
SystemLog.AddEvent(LogLevel_Verbose, F("WiFi status: "), String(WiFi.status()));
@ -615,30 +612,36 @@ void System_TaskSerialCfg(void *pvParameters) {
}
/**
* @brief Function for stream telemetry task
* @brief Function for system telemetry task
*
* @param void *pvParameters
* @return none
*/
void System_TaskStreamTelemetry(void *pvParameters) {
SystemLog.AddEvent(LogLevel_Info, F("StreamTelemetry task. core: "), String(xPortGetCoreID()));
void System_TaskSystemTelemetry(void *pvParameters) {
SystemLog.AddEvent(LogLevel_Info, F("SystemTelemetry task. core: "), String(xPortGetCoreID()));
TickType_t xLastWakeTime = xTaskGetTickCount();
while (1) {
esp_task_wdt_reset();
SystemLog.AddEvent(LogLevel_Verbose, F("StreamTelemetry task. Stack free size: "), String(uxTaskGetStackHighWaterMark(NULL)) + "B");
SystemLog.AddEvent(LogLevel_Verbose, F("SystemTelemetry task. Stack free size: "), String(uxTaskGetStackHighWaterMark(NULL)) + "B");
if (SystemCamera.GetStreamStatus()) {
char buf[80] = { '\0' };
sprintf(buf, "Stream, average data in %dsec. FPS: %.1f, Size: %uKB", (TASK_STREAM_TELEMETRY / SECOND_TO_MILISECOND), SystemCamera.StreamGetFrameAverageFps(), SystemCamera.StreamGetFrameAverageSize());
sprintf(buf, "Stream, average data in %dsec. FPS: %.1f, Size: %uKB", (TASK_SYSTEM_TELEMETRY / SECOND_TO_MILISECOND), SystemCamera.StreamGetFrameAverageFps(), SystemCamera.StreamGetFrameAverageSize());
SystemLog.AddEvent(LogLevel_Info, buf);
SystemCamera.StreamClearFrameData();
}
SystemLog.AddEvent(LogLevel_Info, "Free RAM: " + String(ESP.getFreeHeap()) + " B" + ", Min: " + String(ESP.getMinFreeHeap()));
SystemLog.AddEvent(LogLevel_Info, "Free PSRAM: " + String(ESP.getFreePsram()) + " B" + ", Min: " + String(ESP.getMinFreePsram()));
SystemLog.AddEvent(LogLevel_Info, "MCU Temperature: " + String(McuTemperature.TemperatureCelsius) + " *C");
ExternalTemperatureSensor.ReadSensorData();
/* reset wdg */
esp_task_wdt_reset();
/* next start task */
vTaskDelayUntil(&xLastWakeTime, TASK_STREAM_TELEMETRY / portTICK_PERIOD_MS);
vTaskDelayUntil(&xLastWakeTime, TASK_SYSTEM_TELEMETRY / portTICK_PERIOD_MS);
}
}

View File

@ -38,6 +38,7 @@
#include "connect.h"
#include "serial_cfg.h"
#include "sys_led.h"
#include "ExternalTemperatureSensor.h"
#define SYSTEM_MSG_UPDATE_DONE F("FW update successfully done! Please reboot the MCU.")
#define SYSTEM_MSG_UPDATE_FAIL F("FW update failed! Please reboot MCU, and try again.")
@ -66,7 +67,7 @@ void System_TaskMain(void *);
void System_TaskCaptureAndSendPhoto(void *);
void System_TaskSdCardCheck(void *);
void System_TaskSerialCfg(void *);
void System_TaskStreamTelemetry(void *);
void System_TaskSystemTelemetry(void *);
void System_TaskSysLed(void *);
void System_TaskWiFiWatchdog(void *);
void System_TaskSdCardRemove(void *);

View File

@ -20,7 +20,7 @@ TaskHandle_t Task_WiFiManagement;
TaskHandle_t Task_SystemMain;
TaskHandle_t Task_SdCardCheck;
TaskHandle_t Task_SerialCfg;
TaskHandle_t Task_StreamTelemetry;
TaskHandle_t Task_SystemTelemetry;
TaskHandle_t Task_SysLed;
TaskHandle_t Task_WiFiWatchdog;
//TaskHandle_t Task_SdCardFileRemove;

View File

@ -49,7 +49,7 @@ extern TaskHandle_t Task_WiFiManagement; ///< task handle for wifi m
extern TaskHandle_t Task_SystemMain; ///< task handle for system main
extern TaskHandle_t Task_SdCardCheck; ///< task handle for sd card check
extern TaskHandle_t Task_SerialCfg; ///< task handle for serial configuration
extern TaskHandle_t Task_StreamTelemetry; ///< task handle for stream telemetry
extern TaskHandle_t Task_SystemTelemetry; ///< task handle for system telemetry
extern TaskHandle_t Task_SysLed; ///< task handle for system led
extern TaskHandle_t Task_WiFiWatchdog; ///< task handle for wifi watchdog
//extern TaskHandle_t Task_SdCardFileRemove; ///< task handle for remove file from sd card

View File

@ -57,6 +57,7 @@
<li><a href="page_wifi.html">Wi-Fi</a></li>
<li><a href="page_auth.html">Authentication</a></li>
<li><a href="page_system.html">System</a></li>
<li><a href="page_temperature.html">Temperature</a></li>
</div>
</div>
</div>

View File

@ -0,0 +1,25 @@
<style>@import url("styles.css");</style>
<script src="jquery-3.7.0.min.js"></script>
<body>
<center>
<table>
<tr><td class=pa3>External temperature sensor DHT22/DHT11</td><td></td></tr>
<tr><td class=pa1 align="right">Enable sensors</td><td><label class="switch"><input type="checkbox" name="extsens_en" id="extsetsid" onchange="changeValue(this.checked, 'set_bool?extsens_enable=', 'temp')"><span class="checkbox_slider round"></span></label></label> <span class=pa1 id="status_extsens"></span></td></tr>
<tr><td class="ps1">Sensor status: </td><td class="pa2" id="extsens_stat"></td></tr>
<tr>
<td class="pa1">Temperature Unit</td><td><label for="temp_unit"></label>
<select class="select" id="temp_unitid" name="temp_unit" onchange="changeValue(this.value, 'set_int?temp_unit=', 'temp')">
<option value="0">Celsius</option>
<option value="1">Fahrenheit</option>
</select>
</td>
</tr>
<tr><td class="pa1">Temperature</td><td class="pa2" id="ext_temp"></td></tr>
<tr><td class="pa1">Humidity</td><td class="pa2" id="ext_hum"></td></tr>
</table>
</center>
</body>
<script src="scripts.js"></script>
<script>
get_data("temp");
</script>

View File

@ -120,6 +120,14 @@ function get_data(val) {
document.getElementById('mdnsid').value = obj.mdns;
document.getElementById('loglevelid').value = obj.log_level;
}
if (val == "temp") {
$("#extsens_stat").text(obj.extsens_stat);
document.getElementById('extsetsid').checked = obj.extsen_en;
document.getElementById('temp_unitid').value = obj.exttemp_unit;
$("#ext_temp").text(obj.ext_temp);
$("#ext_hum").text(obj.ext_hum);
}
},
error: function(html) {
console.log("json Timeout or error");

View File

@ -33,6 +33,11 @@ echo "Generating page_system.html"
html_content=$(cat page_system.html | awk '{printf "%s\\n", $0}')
awk -v var="$html_content" '/^const char page_system_html\[\] PROGMEM = R"rawliteral\(/,/rawliteral";/ { if (/^const char page_system_html\[\] PROGMEM = R"rawliteral\(/) { print "const char page_system_html[] PROGMEM = R\"rawliteral(\n" var ")rawliteral\";"; next } { next } } 1' WebPage.h > temp && mv temp WebPage.h
# Read the page_system.html file and generate the WebPage.h file
echo "Generating page_temperature.html"
html_content=$(cat page_temperature.html | awk '{printf "%s\\n", $0}')
awk -v var="$html_content" '/^const char page_temperature_html\[\] PROGMEM = R"rawliteral\(/,/rawliteral";/ { if (/^const char page_temperature_html\[\] PROGMEM = R"rawliteral\(/) { print "const char page_temperature_html[] PROGMEM = R\"rawliteral(\n" var ")rawliteral\";"; next } { next } } 1' WebPage.h > temp && mv temp WebPage.h
# Read the syles.css file and generate the WebPage.h file
echo "Generating styles.css"
html_content=$(cat styles.css | awk '{printf "%s\\n", $0}')