1
0
Prechádzať zdrojové kódy

Removed http and changed to uint32 instead of double.

Thomas Chef 2 rokov pred
rodič
commit
a4c88b0394
4 zmenil súbory, kde vykonal 19 pridanie a 147 odobranie
  1. 1 1
      main/CMakeLists.txt
  2. 0 122
      main/http_client.c
  3. 11 16
      main/main.c
  4. 7 8
      main/pcnt_functions.c

+ 1 - 1
main/CMakeLists.txt

@@ -1,4 +1,4 @@
-idf_component_register(SRCS "http_client.c" "mqtt.c" "wifi.c"
+idf_component_register(SRCS "mqtt.c" "wifi.c"
 "pcnt_functions.c" "main.c" "led_test_inout.c"
 "pcnt_functions.c" "wifi.c" "mqtt.c"
                     INCLUDE_DIRS "")

+ 0 - 122
main/http_client.c

@@ -1,122 +0,0 @@
-#include <string.h>
-#include <stdlib.h>
-#include "freertos/FreeRTOS.h"
-#include "freertos/task.h"
-#include "esp_log.h"
-#include "esp_system.h"
-#include "esp_event.h"
-
-#include "wifi.h"
-#include "config.h"
-
-#ifdef WIFI_ENABLED
-
-#include "nvs_flash.h"
-#include "esp_netif.h"
-#include "esp_tls.h"
-#include "esp_http_client.h"
-
-#define MAX_HTTP_RECV_BUFFER 512
-static const char *TAG = "HTTP_CLIENT";
-
-typedef struct {
-	double energyData_kWh;
-    uint32_t bigCnt;
-    int32_t cnt;
-} sensor_data;
-
-esp_err_t _http_event_handler(esp_http_client_event_t *evt)
-{
-    switch(evt->event_id) {
-        case HTTP_EVENT_ERROR:
-            ESP_LOGD(TAG, "HTTP_EVENT_ERROR");
-            break;
-        case HTTP_EVENT_ON_CONNECTED:
-            ESP_LOGD(TAG, "HTTP_EVENT_ON_CONNECTED");
-            break;
-        case HTTP_EVENT_HEADER_SENT:
-            ESP_LOGD(TAG, "HTTP_EVENT_HEADER_SENT");
-            break;
-        case HTTP_EVENT_ON_HEADER:
-            ESP_LOGD(TAG, "HTTP_EVENT_ON_HEADER, key=%s, value=%s", evt->header_key, evt->header_value);
-            break;
-        case HTTP_EVENT_ON_DATA:
-            ESP_LOGD(TAG, "HTTP_EVENT_ON_DATA, len=%d", evt->data_len);
-            if (!esp_http_client_is_chunked_response(evt->client)) {
-                // Write out data
-                // printf("%.*s", evt->data_len, (char*)evt->data);
-            }
-
-            break;
-        case HTTP_EVENT_ON_FINISH:
-            ESP_LOGD(TAG, "HTTP_EVENT_ON_FINISH");
-            break;
-        case HTTP_EVENT_DISCONNECTED:
-            ESP_LOGI(TAG, "HTTP_EVENT_DISCONNECTED");
-            int mbedtls_err = 0;
-            esp_err_t err = esp_tls_get_and_clear_last_error(evt->data, &mbedtls_err, NULL);
-            if (err != 0) {
-                ESP_LOGI(TAG, "Last esp error code: 0x%x", err);
-                ESP_LOGI(TAG, "Last mbedtls failure: 0x%x", mbedtls_err);
-            }
-            break;
-    }
-    return ESP_OK;
-}
-
-static void http_rest_with_url(void *pvParameters)
-{
-    esp_http_client_config_t config = {
-        .url = "http://192.168.1.110/electrical/register_sensor_data.php",
-        .event_handler = _http_event_handler,
-    };
-    esp_http_client_handle_t client = esp_http_client_init(&config);
-
-    
-
-    sensor_data *data = (sensor_data *)pvParameters;
-
-    char post_data[4096];
-    sprintf(post_data,"dataStr=%.4f&bigCnt=%u&cnt=%d",
-                        data->energyData_kWh, data->bigCnt, data->cnt
-                        );
-
-    //printf("\n%s\n",post_data);
-
-    esp_http_client_set_method(client, HTTP_METHOD_POST);
-    esp_http_client_set_post_field(client, post_data, strlen(post_data));
-    esp_err_t err = esp_http_client_perform(client);
-    if (err == ESP_OK) {
-        ESP_LOGI(TAG, "HTTP POST Status = %d, content_length = %d",
-                esp_http_client_get_status_code(client),
-                esp_http_client_get_content_length(client));
-    } else {
-        ESP_LOGE(TAG, "HTTP POST request failed: %s", esp_err_to_name(err));
-    }
-
-    esp_http_client_cleanup(client);
-}
-
-#endif
-
-static void http_send_data_task(void *pvParameters)
-{
-
-#ifdef WIFI_ENABLED
-    http_rest_with_url(pvParameters);
-#endif
-
-    vTaskDelete(NULL);
-}
-
-void sendHTTPMessage(const double inData, const uint32_t bigCnt, const int32_t cnt) {
-
-    static sensor_data data;
-
-    data.energyData_kWh = inData;
-    data.bigCnt = bigCnt;
-    data.cnt = cnt;
-    void *const ptr = (void *const)&data;
-
-    if( commIsUpAndRunning == 1 ) xTaskCreate(&http_send_data_task, "send_data_task", 8192, ptr, 5, NULL);
-}

+ 11 - 16
main/main.c

@@ -15,13 +15,11 @@
 // Externs
 extern void ledc_init(void);
 extern void init_pcnt_unit();
-extern double getkWh(uint32_t *bigCnt, int32_t *cnt);
+extern uint32_t getkWh();
 
 extern void mqtt_init();
 extern void sendMQTTMessage(const char * topic, const char * data);
 
-extern void sendHTTPMessage(const double inData, const uint32_t bigCnt, const int32_t cnt);
-
 // Chip info:
 // This is esp32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 1, 4MB external flash
 
@@ -45,25 +43,22 @@ void app_main(void)
 #endif
     mqtt_init();
 
-    char dataStr[100];
-    double kWh = 0.0;
-    uint32_t bigCnt = 0;
-    int32_t cnt = 0;
-
-    while( true ) {
+    uint32_t kWh = 0;
+    char txt[100];
 
+    TickType_t vLastWakeTime = xTaskGetTickCount();
+    const TickType_t xFreq = 60000 / portTICK_PERIOD_MS;
 
-        kWh = getkWh(&bigCnt, &cnt);
-
-        sprintf(dataStr,"%.5f",kWh);
+    while( true ) {
 
-        sendMQTTMessage("/sensors/energy/electricalTotal", dataStr);
+        kWh = getkWh();
 
-        sendHTTPMessage(kWh, bigCnt, cnt);
+        sprintf(txt,"%u",kWh);
+        sendMQTTMessage("basement/meter/electricalTotal", txt);
 
-        ESP_LOGI("MAIN", "%.4f   %u    %d",kWh,bigCnt,cnt);
+        ESP_LOGI("MAIN", "%u",kWh);
 
-        vTaskDelay(60000 / portTICK_PERIOD_MS);
+        vTaskDelayUntil( &vLastWakeTime, xFreq );
     }
     esp_restart();
 }

+ 7 - 8
main/pcnt_functions.c

@@ -13,26 +13,25 @@
 
 // Example-code: https://github.com/espressif/esp-idf/blob/master/examples/peripherals/pcnt/pulse_count_event/main/pcnt_event_example_main.c
 
+// PCNT unit counts incomming pulses by itself, but it can only count up to 32000, then an interrupt must poccur
+// So an interrupt is comming every 32kWh (1 to multiple times per day)
 // Counts interrupts that occus every 32K Pulses
 // The counter register is 16 bit signed so we count to 32K before doing an interrupt
 // This equals to 32kWH consumed energy (at 1000 pulses per kWh)
 static uint32_t Counter_32K_Pulses = 0;
 
+// A 32-bit unsigned (with resolution 1/1000 kWh) can hold 4294967kWh which is 214 years for us, so no problem
+
 const int pcntUnit = PCNT_UNIT_0;
 
-double getkWh(uint32_t *bigCnt, int32_t *cnt) {
+uint32_t getkWh() {
 
     pcnt_intr_disable(pcntUnit);
     volatile int32_t count = DPORT_REG_READ(0x3FF57060);
     volatile uint32_t bigCounter = Counter_32K_Pulses;
     pcnt_intr_enable(pcntUnit);
 
-    *bigCnt = bigCounter;
-    *cnt = count;
-
-    const double retVal = ((double)bigCounter*32)+((double)count / PULSES_PER_KWH);
-
-    return retVal;
+    return (bigCounter * 32000) + count;
 }
 
 static void IRAM_ATTR pcnt_example_intr_handler(void *arg)
@@ -92,6 +91,6 @@ void init_pcnt_unit()
 #else
 
 void init_pcnt_unit() { }
-double getkWh() { return 0.0f; }
+uint32_t getkWh() { return 0; }
 
 #endif