1
0

displayAndSend.c 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. #include "displayAndSend.h"
  2. #include "ssd1306.h"
  3. #include "ssd1306_driver.h"
  4. #include "mqtt.h"
  5. #include "esp_log.h"
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include "freertos/FreeRTOS.h"
  9. #include "freertos/task.h"
  10. #include "freertos/queue.h"
  11. #ifdef ENABLE_SSD1306
  12. #define QUEUE_SIZE 3
  13. static QueueHandle_t dataQueue = NULL;
  14. static bool queueReady = false;
  15. void displayAndSendTask(void *pvParameters) {
  16. uint8_t aliveCnt = 0;
  17. DisplayData data;
  18. char txt[50];
  19. ESP_LOGI("DISPnSND", "displayAndSendTask starting. Core:%d",xPortGetCoreID());
  20. i2c_master_init();
  21. oled_ssd1306_init();
  22. vTaskDelay(100 / portTICK_PERIOD_MS);
  23. SSD1306_SetPosition(4,18);
  24. SSD1306_DrawVertLine(29,0,128);
  25. SSD1306_Puts("Home Energy Meter", &Font_7x10,SSD1306_COLOR_WHITE);
  26. SSD1306_SetPosition(4,31);
  27. SSD1306_Puts(SW_VERSION, &Font_7x10,SSD1306_COLOR_WHITE);
  28. SSD1306_UpdateScreen();
  29. vTaskDelay(3000 / portTICK_PERIOD_MS);
  30. SSD1306_Clear();
  31. SSD1306_SetPosition(0,0);
  32. SSD1306_Puts("Internal:", &Font_7x10,SSD1306_COLOR_WHITE);
  33. SSD1306_SetPosition(0,11);
  34. SSD1306_Puts("Heater:", &Font_7x10,SSD1306_COLOR_WHITE);
  35. SSD1306_SetPosition(0,22);
  36. SSD1306_Puts("ADC Vpp:", &Font_7x10,SSD1306_COLOR_WHITE);
  37. SSD1306_SetPosition(0,33);
  38. SSD1306_Puts("kWh:", &Font_7x10,SSD1306_COLOR_WHITE);
  39. SSD1306_UpdateScreen();
  40. SSD1306_SetPosition(0,50);
  41. sprintf(txt,"HoEnMeter %s",SW_VERSION);
  42. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  43. // Create the data input queue, now that all is setup
  44. dataQueue = xQueueCreate( QUEUE_SIZE, sizeof( DisplayData ) );
  45. if(dataQueue == NULL) {
  46. ESP_LOGE("DISPnSND","Error creating the queue");
  47. }
  48. ESP_LOGI("DISPnSND", "Data input queue ready.");
  49. queueReady = true;
  50. while( 1 ) {
  51. if( xQueueReceive(dataQueue,&data, 1000 / portTICK_PERIOD_MS) == pdTRUE ) {
  52. switch( data.type ) {
  53. case type_VPP: sprintf(txt," %d",data.iData);
  54. SSD1306_SetPosition(127-(strlen(txt)*8),22);
  55. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  56. SSD1306_UpdateScreen();
  57. sprintf(txt,"%d",data.iData);
  58. sendMQTTMessage("homeEnergyMeter/waterHeater/totalEnergy", txt);
  59. aliveCnt++;
  60. break;
  61. case type_TempA:
  62. sprintf(txt," %.1f\044C",data.dData);
  63. SSD1306_SetPosition(127-(strlen(txt)*8),0);
  64. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  65. SSD1306_UpdateScreen();
  66. sprintf(txt,"%.2f",data.dData);
  67. sendMQTTMessage("homeEnergyMeter/internal/temp", txt);
  68. break;
  69. case type_TempB:
  70. sprintf(txt," %.1f\044C",data.dData);
  71. SSD1306_SetPosition(127-(strlen(txt)*8),11);
  72. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  73. SSD1306_UpdateScreen();
  74. sprintf(txt,"%.2f",data.dData);
  75. sendMQTTMessage("homeEnergyMeter/waterHeater/temp", txt);
  76. break;
  77. case type_kWh:
  78. sprintf(txt," %.2f",data.dData);
  79. SSD1306_SetPosition(127-(strlen(txt)*8),33);
  80. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  81. SSD1306_UpdateScreen();
  82. sprintf(txt,"%.5f",data.dData);
  83. sendMQTTMessage("homeEnergyMeter/electricityMeter/kWh", txt);
  84. sprintf(txt,"%d",data.iData);
  85. sendMQTTMessage("homeEnergyMeter/electricityMeter/pulses", txt);
  86. break;
  87. default:
  88. break;
  89. }
  90. }
  91. else {
  92. sprintf(txt,"%u",aliveCnt);
  93. if( aliveCnt == 10 ) aliveCnt=0;
  94. SSD1306_SetPosition(127-(strlen(txt)*8),50);
  95. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  96. SSD1306_UpdateScreen();
  97. }
  98. }
  99. vTaskDelete(NULL);
  100. }
  101. void addDataToQueue(int data_type, double dData_in, int iData_in) {
  102. DisplayData d;
  103. d.type = data_type;
  104. d.dData = dData_in;
  105. d.iData = iData_in;
  106. if( queueReady == true && dataQueue != NULL ) {
  107. if( xQueueSend(dataQueue, &d, 0) != pdPASS ) {
  108. ESP_LOGE("DISPnSND","Queue full");
  109. }
  110. }
  111. else {
  112. ESP_LOGE("DISPnSND","Queue not ready.");
  113. }
  114. }
  115. void initDisplayAndSend() {
  116. xTaskCreate(displayAndSendTask, "MQTT-Task", 1024*10, NULL, 2, NULL);
  117. }
  118. #endif