First verison with running FSM. Sensor data read not verified. Web updater is fine.
This commit is contained in:
parent
277e525314
commit
c8626bb5cd
3 changed files with 49 additions and 40 deletions
firmware
|
@ -12,11 +12,10 @@
|
||||||
#define EMERGENCY_SLEEP_S 172800 // Sleep for 2 days to recover
|
#define EMERGENCY_SLEEP_S 172800 // Sleep for 2 days to recover
|
||||||
#define RESET_ESP_TIME_INTERVAL_MS (60*60*12*1000) // reset every 12 hours
|
#define RESET_ESP_TIME_INTERVAL_MS (60*60*12*1000) // reset every 12 hours
|
||||||
#define WIND_SENSOR_MEAS_TIME_S 15
|
#define WIND_SENSOR_MEAS_TIME_S 15
|
||||||
#define INITIAL_WEBSERVER_TIME 20
|
#define WATCHDOG_TIMEOUT_MS 30000
|
||||||
|
#define WIFI_CHECK_INTERVAL_MS 60000
|
||||||
#define ENERGY_SAVING_ITERATIONS 30
|
#define ENERGY_SAVING_ITERATIONS 30
|
||||||
#define WIFI_MINIMUM_SIGNAL_QUALITY 10 // percent
|
#define WIFI_MINIMUM_SIGNAL_QUALITY 10 // percent
|
||||||
|
|
||||||
#define BAT_LOW_VOLTAGE 3.6
|
#define BAT_LOW_VOLTAGE 3.6
|
||||||
#define BAT_EMERGENCY_DEEPSLEEP_VOLTAGE 3.5
|
#define BAT_EMERGENCY_DEEPSLEEP_VOLTAGE 3.5
|
||||||
|
|
||||||
|
|
|
@ -18,4 +18,13 @@
|
||||||
#define ENERGY_SAVE_MODE_ENABLED 1.0
|
#define ENERGY_SAVE_MODE_ENABLED 1.0
|
||||||
#define ENERGY_SAVE_MODE_DISABLED 0.0
|
#define ENERGY_SAVE_MODE_DISABLED 0.0
|
||||||
|
|
||||||
|
#define FSM_STATE_WU 0
|
||||||
|
#define FSM_STATE_WSE 1
|
||||||
|
#define FSM_STATE_RS 2
|
||||||
|
#define FSM_STATE_WS 4
|
||||||
|
#define FSM_STATE_US 5
|
||||||
|
#define FSM_STATE_SC 6
|
||||||
|
#define FSM_STATE_ID 7
|
||||||
|
#define FSM_STATE_SD 8
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -44,19 +44,9 @@ uint32_t wifi_check_interval_counter = millis();
|
||||||
|
|
||||||
WiFiManager wifiManager;
|
WiFiManager wifiManager;
|
||||||
|
|
||||||
typedef enum fsm_states_et {
|
uint8_t fsm_state = FSM_STATE_WU;
|
||||||
FSM_STATE_WU,
|
|
||||||
FSM_STATE_WSE,
|
|
||||||
FSM_STATE_RS,
|
|
||||||
FSM_STATE_BP,
|
|
||||||
FSM_STATE_WS,
|
|
||||||
FSM_STATE_US,
|
|
||||||
FSM_STATE_SC,
|
|
||||||
FSM_STATE_ID,
|
|
||||||
FSM_STATE_SD
|
|
||||||
} t_fsm_states;
|
|
||||||
|
|
||||||
t_fsm_states fsm_state = FSM_STATE_WU;
|
uint8_t sensor_cnt = 0;
|
||||||
|
|
||||||
//*************************************************************************//
|
//*************************************************************************//
|
||||||
|
|
||||||
|
@ -181,7 +171,7 @@ void initSensors()
|
||||||
void wifiConnectionCheck()
|
void wifiConnectionCheck()
|
||||||
{
|
{
|
||||||
|
|
||||||
if (millis() - wifi_check_interval_counter < WIFI_CHECK_INVERVAL_MS)
|
if (millis() - wifi_check_interval_counter < WIFI_CHECK_INTERVAL_MS)
|
||||||
{
|
{
|
||||||
// if check interval is not exceeded abort check
|
// if check interval is not exceeded abort check
|
||||||
return;
|
return;
|
||||||
|
@ -279,9 +269,11 @@ void _loop()
|
||||||
{
|
{
|
||||||
|
|
||||||
case FSM_STATE_WU:
|
case FSM_STATE_WU:
|
||||||
|
debug("web updater call if required");
|
||||||
#ifdef WEBUPDATER_FEATURE
|
#ifdef WEBUPDATER_FEATURE
|
||||||
if (UPDATE_WEBSERVER_INTVERVAL_S * 1000 / DELAY_LOOP_MS <= update_webserver_cnt)
|
if (UPDATE_WEBSERVER_INTVERVAL_S * 1000 / DELAY_LOOP_MS <= update_webserver_cnt)
|
||||||
{
|
{
|
||||||
|
debug("web updater call");
|
||||||
update_webserver_cnt = 0;
|
update_webserver_cnt = 0;
|
||||||
doWebUpdater();
|
doWebUpdater();
|
||||||
}
|
}
|
||||||
|
@ -290,10 +282,11 @@ void _loop()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FSM_STATE_WSE:
|
case FSM_STATE_WSE:
|
||||||
|
debug("wind speed exceeded check if required");
|
||||||
#ifdef HTTP_CALL_ON_WINDSPEED_EXCEED
|
#ifdef HTTP_CALL_ON_WINDSPEED_EXCEED
|
||||||
if (HTTP_CALL_ON_WINDSPEED_INTERVAL_S * 1000 / DELAY_LOOP_MS <= update_windspeed_exceed_cnt)
|
if (HTTP_CALL_ON_WINDSPEED_INTERVAL_S * 1000 / DELAY_LOOP_MS <= update_windspeed_exceed_cnt)
|
||||||
{
|
{
|
||||||
debug("Reading wind sensor because of exceed call functionality");
|
debug("reading wind sensor because of exceed call functionality");
|
||||||
if (sensors[SENSOR_WINDSPEED])
|
if (sensors[SENSOR_WINDSPEED])
|
||||||
{
|
{
|
||||||
// read from windspeed sensorSTATUS_LED_PIN
|
// read from windspeed sensorSTATUS_LED_PIN
|
||||||
|
@ -315,9 +308,7 @@ void _loop()
|
||||||
|
|
||||||
if (httpResponseCode > 0) {
|
if (httpResponseCode > 0) {
|
||||||
String response = http.getString();
|
String response = http.getString();
|
||||||
#ifdef DEBUG
|
debug("http response code: " + String(httpResponseCode) + " = " + response);
|
||||||
Serial.println("http response code: " + String(httpResponseCode) + " = " + response);
|
|
||||||
#endif
|
|
||||||
// TODO handle response
|
// TODO handle response
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,63 +326,69 @@ void _loop()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FSM_STATE_RS:
|
case FSM_STATE_RS:
|
||||||
|
debug("reset time check if required");
|
||||||
#ifdef RESET_ESP_TIME_INTERVAL
|
#ifdef RESET_ESP_TIME_INTERVAL
|
||||||
// if millis() reached interval restart ESP
|
// if millis() reached interval restart ESP
|
||||||
if (RESET_ESP_TIME_INTERVAL_MS <= millis())
|
if (RESET_ESP_TIME_INTERVAL_MS <= millis())
|
||||||
{
|
{
|
||||||
debug("Resetting firmware intentionally");
|
debug("resetting firmware intentionally");
|
||||||
// Push reset button after flashing once or do a manual power cycle to get the functionality working.
|
// Push reset button after flashing once or do a manual power cycle to get the functionality working.
|
||||||
ESP.restart();
|
ESP.restart();
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
fsm_state = FSM_STATE_BP;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case FSM_STATE_BP:
|
|
||||||
#ifndef BATTERY_POWERED
|
|
||||||
if (UPDATE_SENSOR_INTERVAL_S * 1000 / DELAY_LOOP_MS > update_sensor_cnt)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
fsm_state = FSM_STATE_WS;
|
fsm_state = FSM_STATE_WS;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FSM_STATE_WS:
|
case FSM_STATE_WS:
|
||||||
|
debug("disable measure of wind speed if required");
|
||||||
#ifdef defined(BATTERY_POWERED) && defined(SENSOR_WIND)
|
#ifdef defined(BATTERY_POWERED) && defined(SENSOR_WIND)
|
||||||
if (energySavingMode() == 1) {
|
if (energySavingMode() == 1) {
|
||||||
// Disable expensive tasks
|
// Disable expensive tasks
|
||||||
sensors[SENSOR_WINDSPEED] = 0;
|
sensors[SENSOR_WINDSPEED] = 0;
|
||||||
|
debug("read of wind sensor because of low battery disabled");
|
||||||
} else {
|
} else {
|
||||||
sensors[SENSOR_WINDSPEED] = &wind_speed;
|
sensors[SENSOR_WINDSPEED] = &wind_speed;
|
||||||
|
debug("read of wind sensor because of high battery enabled");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
fsm_state = FSM_STATE_US;
|
fsm_state = FSM_STATE_US;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FSM_STATE_US:
|
case FSM_STATE_US:
|
||||||
update_sensor_cnt = 0;
|
debug("read sensor data check");
|
||||||
for (uint8_t i = 0; i < VALUES; i++)
|
if (UPDATE_SENSOR_INTERVAL_S * 1000 / DELAY_LOOP_MS <= update_sensor_cnt)
|
||||||
{
|
{
|
||||||
if (sensors[i]) {
|
debug("read sensor data" + String(sensor_cnt));
|
||||||
currentSensorData[i] = sensors[i]();
|
if (sensors[sensor_cnt]) {
|
||||||
|
currentSensorData[sensor_cnt] = sensors[sensor_cnt]();
|
||||||
} else {
|
} else {
|
||||||
currentSensorData[i] = nan("no value");
|
currentSensorData[sensor_cnt] = nan("no value");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sensor_cnt < VALUES)
|
||||||
|
{
|
||||||
|
sensor_cnt++;
|
||||||
|
} else {
|
||||||
|
update_sensor_cnt = 0;
|
||||||
|
sensor_cnt = 0;
|
||||||
|
fsm_state = FSM_STATE_SC;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
debug("skip read sensor data");
|
||||||
|
fsm_state = FSM_STATE_WU; // no new data, reset FSM
|
||||||
}
|
}
|
||||||
fsm_state = FSM_STATE_SC;
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FSM_STATE_SC:
|
case FSM_STATE_SC:
|
||||||
|
debug("log to serial if required");
|
||||||
#ifdef SERIAL_FEATURE
|
#ifdef SERIAL_FEATURE
|
||||||
logToSerial(currentSensorData);
|
logToSerial(currentSensorData);
|
||||||
#endif
|
#endif
|
||||||
fsm_state = FSM_STATE_ID;
|
fsm_state = FSM_STATE_ID;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
//delay(100); // TODO warum?
|
|
||||||
|
|
||||||
case FSM_STATE_ID:
|
case FSM_STATE_ID:
|
||||||
|
debug("Send data to influxdb");
|
||||||
#ifdef INFLUXDB_FEATURE
|
#ifdef INFLUXDB_FEATURE
|
||||||
for (uint8_t i = 0; i < 5 and validData == false; i++)
|
for (uint8_t i = 0; i < 5 and validData == false; i++)
|
||||||
{
|
{
|
||||||
|
@ -411,6 +408,7 @@ void _loop()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case FSM_STATE_SD:
|
case FSM_STATE_SD:
|
||||||
|
debug("set sensor data in webupdater");
|
||||||
#ifdef WEBUPDATER_FEATURE
|
#ifdef WEBUPDATER_FEATURE
|
||||||
setSensorData(currentSensorData);
|
setSensorData(currentSensorData);
|
||||||
#endif
|
#endif
|
||||||
|
@ -422,7 +420,10 @@ void _loop()
|
||||||
break;
|
break;
|
||||||
|
|
||||||
} // close of switch
|
} // close of switch
|
||||||
debug("FSM state = "+fsm_state);
|
|
||||||
|
//delay(100); // TODO warum hier ein delay?
|
||||||
|
|
||||||
|
debug("FSM state = " + String(fsm_state));
|
||||||
}
|
}
|
||||||
|
|
||||||
void logToSerial(float sensorValues[])
|
void logToSerial(float sensorValues[])
|
||||||
|
|
Loading…
Reference in a new issue