displayAndSend.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  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("v1.0", &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("Temp A:", &Font_7x10,SSD1306_COLOR_WHITE);
  33. SSD1306_SetPosition(0,11);
  34. SSD1306_Puts("Temp B:", &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. // Create the data input queue, now that all is setup
  41. dataQueue = xQueueCreate( QUEUE_SIZE, sizeof( DisplayData ) );
  42. if(dataQueue == NULL) {
  43. ESP_LOGE("DISPnSND","Error creating the queue");
  44. }
  45. ESP_LOGI("DISPnSND", "Data input queue ready.");
  46. queueReady = true;
  47. while( 1 ) {
  48. if( xQueueReceive(dataQueue,&data, 1000 / portTICK_PERIOD_MS) == pdTRUE ) {
  49. switch( data.type ) {
  50. case type_VPP: sprintf(txt,"%d",data.iData);
  51. SSD1306_SetPosition(127-(strlen(txt)*8),22);
  52. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  53. SSD1306_UpdateScreen();
  54. break;
  55. case type_TempA:
  56. sprintf(txt,"%.2f\044C",data.dData);
  57. SSD1306_SetPosition(127-(strlen(txt)*8),0);
  58. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  59. SSD1306_UpdateScreen();
  60. break;
  61. case type_TempB:
  62. sprintf(txt,"%.2f\044C",data.dData);
  63. SSD1306_SetPosition(127-(strlen(txt)*8),11);
  64. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  65. SSD1306_UpdateScreen();
  66. break;
  67. case type_kWh:
  68. sprintf(txt,"%.2f",data.dData);
  69. SSD1306_SetPosition(127-(strlen(txt)*8),33);
  70. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  71. SSD1306_UpdateScreen();
  72. sprintf(txt,"%.5f",data.dData);
  73. sendMQTTMessage("sensors/TEST/energy/electricalTotal", txt);
  74. break;
  75. default:
  76. break;
  77. }
  78. }
  79. else {
  80. sprintf(txt,"%u",aliveCnt);
  81. if( ++aliveCnt == 10 ) aliveCnt=0;
  82. SSD1306_SetPosition(127-(strlen(txt)*8),50);
  83. SSD1306_Puts(txt, &Font_7x10,SSD1306_COLOR_WHITE);
  84. SSD1306_UpdateScreen();
  85. }
  86. }
  87. vTaskDelete(NULL);
  88. }
  89. void addDataToQueue(int data_type, double dData_in, int iData_in) {
  90. DisplayData d;
  91. d.type = data_type;
  92. d.dData = dData_in;
  93. d.iData = iData_in;
  94. if( queueReady == true && dataQueue != NULL ) {
  95. if( xQueueSend(dataQueue, &d, 0) != pdPASS ) {
  96. ESP_LOGE("DISPnSND","Queue full");
  97. }
  98. }
  99. else {
  100. ESP_LOGE("DISPnSND","Queue not ready.");
  101. }
  102. }
  103. void initDisplayAndSend() {
  104. xTaskCreate(displayAndSendTask, "MQTT-Task", 1024*10, NULL, 2, NULL);
  105. }
  106. #endif