--- a/main/iotbalkon.c Wed Mar 29 21:39:07 2023 +0200 +++ b/main/iotbalkon.c Thu Mar 30 17:05:05 2023 +0200 @@ -19,8 +19,24 @@ static TaskHandle_t xTaskBMP280 = NULL; static TaskHandle_t xTaskINA219 = NULL; +static TaskHandle_t xTaskMQTT = NULL; static TaskHandle_t xTaskWifi = NULL; +#define MAX_LOOPS 32 + +RTC_DATA_ATTR float solarVolts, solarCurrent, solarPower; +RTC_DATA_ATTR float batteryVolts, batteryCurrent, batteryPower; +RTC_DATA_ATTR int batteryState; +RTC_DATA_ATTR float s_Volts[MAX_LOOPS + 1]; +RTC_DATA_ATTR float s_Current[MAX_LOOPS + 1]; +RTC_DATA_ATTR float b_Volts[MAX_LOOPS + 1]; +RTC_DATA_ATTR float b_Current[MAX_LOOPS + 1]; +RTC_DATA_ATTR bool m_Valid[MAX_LOOPS + 1]; +RTC_DATA_ATTR unsigned long m_Time[MAX_LOOPS + 1]; +RTC_DATA_ATTR unsigned long gLastTime; // millis() +RTC_DATA_ATTR uint8_t loopno; +RTC_DATA_ATTR uint8_t loops; + extern BMP280_State *bmp280_state; ///< I2C state extern SemaphoreHandle_t xSemaphoreBMP280; ///< I2C lock semaphore extern bmp280_params_t bmp280_params; @@ -31,6 +47,122 @@ extern SemaphoreHandle_t xSemaphoreWiFi; extern WIFI_State *wifi_state; ///< WiFi state +uint32_t Alarm = 0; + +/* + Alarm bits +*/ +#define AL_ACCULOW 0x01 +#define AL_NOWIFI 0x02 + + +#define ST_INTERVAL 10000 +#define MAX_LOOPS 32 + + + +// 0% 10% 20% 30% 40% 50% 60% 70% 80% 90% 100% +float Charge_C_5[11] = { 12.40, 12.60, 12.75, 12.95, 13.20, 13.35, 13.55, 13.67, 14.00, 15.25, 15.94 }; +float Charge_C_10[11] = { 12.20, 12.38, 12.60, 12.80, 13.05, 13.20, 13.28, 13.39, 13.60, 14.20, 15.25 }; +float Charge_C_20[11] = { 12.00, 12.07, 12.42, 12.70, 12.85, 13.02, 13.11, 13.15, 13.25, 13.60, 14.15 }; +float Charge_C_40[11] = { 11.55, 11.80, 12.25, 12.57, 12.70, 12.80, 12.90, 12.95, 13.00, 13.20, 13.50 }; +float Rest[11] = { 11.50, 11.70, 11.88, 12.10, 12.22, 12.30, 12.40, 12.50, 12.57, 12.64, 12.72 }; +float Load_C_20[11] = { 11.45, 11.70, 11.80, 12.05, 12.20, 12.28, 12.37, 12.48, 12.55, 12.57, 12.60 }; +float Load_C_10[11] = { 10.98, 11.27, 11.50, 11.65, 11.85, 12.00, 12.10, 12.20, 12.30, 12.40, 12.50 }; +float Load_C_5[11] = { 10.20, 10.65, 10.90, 11.15, 11.35, 11.55, 11.63, 11.75, 11.90, 12.00, 12.08 }; + + +/* + * Calculate the load state of the battery. + */ +void BatteryState(float Voltage, float Current) { + int i; + + batteryState = 0; + ESP_LOGI(TAG, "Batt %.4fV %.4fmA", Voltage, Current); + + if (Current < -750) { + // Load current > C/5, 1A + for (i = 0; i < 10; i++) { + if (Load_C_5[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Load C/5 %d%%", batteryState); + + } else if (Current < -375) { + // Load current > C/10, 500mA + for (i = 0; i < 10; i++) { + if (Load_C_10[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Load C/10 %d%%", batteryState); + + } else if (Current < -125) { + // Load current > C/20, 250mA + for (i = 0; i < 10; i++) { + if (Load_C_20[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Load C/20 %d%%", batteryState); + + } else if (Current > 750) { + // Charge > C/5, 1A + for (i = 0; i < 10; i++) { + if (Charge_C_5[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Charge C/5 %d%%", batteryState); + + } else if (Current > 375) { + // Charge > C/10, 500mA + for (i = 0; i < 10; i++) { + if (Charge_C_10[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Charge C/10 %d%%", batteryState); + + } else if (Current > 187.5) { + // Charge > C/20, 250 mA + for (i = 0; i < 10; i++) { + if (Charge_C_20[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Charge C/20 %d%%", batteryState); + + } else if (Current > 62.5) { + // Charge > C/40, 125 mA + for (i = 0; i < 10; i++) { + if (Charge_C_40[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Charge C/40 %d%%", batteryState); + + } else { + // Rest + for (i = 0; i < 10; i++) { + if (Rest[i + 1] >= Voltage) { + break; + } + } + batteryState = i * 10; + ESP_LOGI(TAG, "Rest %d%%", batteryState); + } +} + void app_main(void) @@ -93,6 +225,9 @@ xTaskCreate(&task_bmp280, "task_bmp280", 2560, NULL, 8, &xTaskBMP280); xTaskCreate(&task_ina219, "task_ina219", 2560, NULL, 8, &xTaskINA219); + // esp_log_level_set("MQTT_CLIENT", ESP_LOG_ERROR); + xTaskCreate(&task_mqtt, "task_mqtt", 4096, NULL, 5, &xTaskMQTT); + // esp_log_level_set("wifi", ESP_LOG_ERROR); xTaskCreate(&task_wifi, "task_wifi", 4096, NULL, 3, &xTaskWifi); vTaskDelay(10 / portTICK_PERIOD_MS); @@ -137,7 +272,7 @@ // // Measure // getVoltsCurrent(); - // solarVolts = solarCurrent = batteryVolts = batteryCurrent = 0; + solarVolts = solarCurrent = solarPower = batteryVolts = batteryCurrent = batteryPower = 0; // loops = 0; // totalTime = 0; // for (int i = 0; i < loopno; i++) { @@ -182,34 +317,17 @@ // batteryVolts = batteryVolts / loops; // batteryCurrent = batteryCurrent / totalTime; // batteryPower = batteryVolts * batteryCurrent; - // BatteryState(batteryVolts, (0 - batteryCurrent) + solarCurrent); - - // //#if Debug == true - // Serial.print(F(" Solar Volts: ")); - // Serial.print(solarVolts, 4); - // Serial.print(F("V Current: ")); - // Serial.print(solarCurrent, 4); - // Serial.print(F("mA Power: ")); - // Serial.print(solarPower, 4); - // Serial.println(F("mW")); + BatteryState(batteryVolts, (0 - batteryCurrent) + solarCurrent); - // Serial.print(F("Battery Volts: ")); - // Serial.print(batteryVolts, 4); - // Serial.print(F("V Current: ")); - // Serial.print(batteryCurrent, 4); - // Serial.print(F("mA Power: ")); - // Serial.print(batteryPower, 4); - // Serial.print(F("mW Capacity ")); - // Serial.print(batteryState); - // Serial.println(F("%")); - // //#endif + ESP_LOGI(TAG, " Solar Volts: %.4fV Current %.4fmA Power %.4fmW", solarVolts, solarCurrent, solarPower); + ESP_LOGI(TAG, "Battery Volts: %.4fV Current %.4fmA Power %.4fmW", batteryVolts, batteryCurrent, batteryPower); /* Check alarm conditions */ - // if (batteryState <= 10) { - // Alarm |= AL_ACCULOW; - // } else { - // Alarm &= ~AL_ACCULOW; - // } + if (batteryState <= 10) { + Alarm |= AL_ACCULOW; + } else { + Alarm &= ~AL_ACCULOW; + } // } // getTempHumi(); // Publish();