displayAndSend.c 3.8 KB

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