main/iotbalkon.c

changeset 5
b1f38105ca7e
parent 4
d0155c16e992
child 6
bad3414f7bc4
--- 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();

mercurial