Repo for ESP32 Weather Station Development
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

227 lignes
6.5KB

  1. /*
  2. * display.c
  3. *
  4. * Created on: 19 Apr 2020
  5. * Author: Chris
  6. */
  7. #include "display.h"
  8. #include "tftspi.h"
  9. #include "tft.h"
  10. #define SPI_BUS TFT_VSPI_HOST
  11. typedef struct {
  12. int datetimeW;
  13. int datetimeA;
  14. int dateTimeLeft;
  15. int datetimeBaseline;
  16. int innenW;
  17. int aussenW;
  18. int locA;
  19. int tempW;
  20. int degCW;
  21. int tempA;
  22. int humW;
  23. int percentW;
  24. int humA;
  25. int pressW;
  26. int pressA;
  27. int hpaW;
  28. int datetimebarH;
  29. int margin;
  30. int borderVMargin;
  31. int innenBaseline;
  32. int aussenBaseline;
  33. int pressBaseline;
  34. int humBaseline;
  35. int tempBaseline;
  36. int unitMaxW;
  37. int unitW;
  38. int ioW;
  39. int unitLeft;
  40. int innenLeft;
  41. int aussenLeft;
  42. } layout_t;
  43. static layout_t layout;
  44. layout_t create_layout()
  45. {
  46. layout_t layout;
  47. int screenW = tft_width;
  48. int screenH = tft_height;
  49. layout.datetimebarH = 20; // Can be calculated too
  50. layout.margin = 5;
  51. layout.borderVMargin = 10;
  52. TFT_setFont(UBUNTU16_FONT, NULL);
  53. layout.datetimebarH = 20;
  54. layout.datetimeW = TFT_getStringWidth("25.12.2031 08:31");
  55. layout.datetimeA = TFT_getfontheight();
  56. layout.dateTimeLeft = (screenW - layout.datetimeW) / 2;
  57. layout.datetimeBaseline = (layout.datetimebarH - layout.datetimeA) / 2;
  58. layout.innenW = TFT_getStringWidth("Innen");
  59. layout.aussenW = TFT_getStringWidth("Aussen");
  60. layout.locA = TFT_getfontheight();
  61. TFT_setFont(DEJAVU18_FONT, NULL);
  62. layout.tempW = TFT_getStringWidth("-35.2");
  63. layout.degCW = TFT_getStringWidth(" C");
  64. layout.tempA = TFT_getfontheight();
  65. TFT_setFont(UBUNTU16_FONT, NULL);
  66. layout.humW = TFT_getStringWidth("25.2");
  67. layout.percentW = TFT_getStringWidth("%");
  68. layout.humA = TFT_getfontheight();
  69. layout.pressW = TFT_getStringWidth("1281");
  70. layout.pressA = TFT_getfontheight();
  71. layout.hpaW = TFT_getStringWidth("hPa");
  72. layout.innenBaseline = layout.datetimebarH + layout.borderVMargin;
  73. layout.aussenBaseline = layout.innenBaseline;
  74. layout.pressBaseline = screenH - layout.borderVMargin - layout.pressA;
  75. layout.humBaseline = layout.pressBaseline - layout.pressA - layout.margin;
  76. layout.tempBaseline = (layout.humBaseline - layout.humA + layout.innenBaseline) / 2
  77. + 0.5*layout.tempA - 1;
  78. int unitMaxW = layout.degCW;
  79. if (layout.percentW > unitMaxW) unitMaxW = layout.percentW;
  80. if (layout.hpaW > unitMaxW) unitMaxW = layout.hpaW;
  81. layout.unitW = 2*layout.margin + unitMaxW;
  82. layout.ioW = (screenW - layout.unitW) / 2;
  83. layout.unitLeft = screenW - layout.unitW + layout.margin;
  84. layout.innenLeft = layout.margin;
  85. layout.aussenLeft = layout.innenLeft + layout.ioW;
  86. ESP_LOGI("main", "innen: %d x %d, aussen: %d x %d", layout.innenW,
  87. layout.locA, layout.aussenW, layout.locA);
  88. ESP_LOGI("main", "temps: %d x %d, unit: %d x %d", layout.tempW,
  89. layout.tempA, layout.degCW, layout.tempA);
  90. ESP_LOGI("main", "hum: %d x %d, unit: %d x %d", layout.humW, layout.humA,
  91. layout.percentW, layout.humA);
  92. ESP_LOGI("main", "press: %d x %d, unit: %d x %d", layout.pressW, layout.pressA,
  93. layout.hpaW, layout.pressA);
  94. ESP_LOGI("main", "Baselines - innen: %d, aussen: %d, press: %d, hum: %d, temp: %d",
  95. layout.innenBaseline, layout.aussenBaseline,
  96. layout.pressBaseline, layout.humBaseline, layout.tempBaseline);
  97. ESP_LOGI("main", "Width - units: %d, i/o: %d", layout.unitW, layout.ioW);
  98. ESP_LOGI("main", "Left - units: %d", layout.unitLeft);
  99. return layout;
  100. }
  101. void display_data(int32_t temp_raw, uint32_t pressure_raw, uint32_t humidity_raw,
  102. int32_t temp2_raw, uint32_t pressure2_raw, uint32_t humidity2_raw)
  103. {
  104. // Calc temperature pre and post comma values
  105. int32_t temp_pre = temp_raw / 100;
  106. int32_t temp_post = (abs(temp_raw) % 100) / 10;
  107. char temp_str[12];
  108. sprintf(temp_str, "% 2.2d,%.1d", temp_pre, temp_post);
  109. int32_t temp2_pre = temp2_raw / 100;
  110. int32_t temp2_post = (abs(temp2_raw) % 100) / 10;
  111. char temp2_str[12];
  112. sprintf(temp2_str, "% 2.2d,%.1d", temp2_pre, temp2_post);
  113. // Calc humidity pre and post comma values
  114. uint32_t humid_pre = humidity_raw / 1024;
  115. uint32_t humid_post = (humidity_raw - humid_pre*1024) * 10 / 1024;
  116. char humid_str[12];
  117. sprintf(humid_str, "%2.2d,%.1d", humid_pre, humid_post);
  118. uint32_t humid2_pre = humidity2_raw / 1024;
  119. uint32_t humid2_post = (humidity2_raw - humid2_pre*1024) * 10 / 1024;
  120. char humid2_str[12];
  121. sprintf(humid2_str, "%2.2d,%.1d", humid2_pre, humid2_post);
  122. // Calc pressure values
  123. uint32_t press = pressure_raw / 100;
  124. char press_str[12];
  125. sprintf(press_str, "%d", press);
  126. uint32_t press2 = pressure2_raw / 100;
  127. char press2_str[12];
  128. sprintf(press2_str, "%d", press2);
  129. TFT_setFont(UBUNTU16_FONT, NULL);
  130. TFT_fillScreen(TFT_BLACK);
  131. tft_fg = TFT_WHITE;
  132. TFT_print("25.12.2031 08:31", layout.dateTimeLeft, layout.datetimeBaseline);
  133. TFT_drawFastHLine(0, 20, 160, TFT_WHITE);
  134. TFT_print("Innen", layout.innenLeft, layout.innenBaseline);
  135. TFT_print("Aussen", layout.aussenLeft, layout.aussenBaseline);
  136. TFT_setFont(DEJAVU18_FONT, NULL);
  137. tft_fg = TFT_RED;
  138. TFT_print(temp_str, layout.innenLeft, layout.tempBaseline);
  139. tft_fg = TFT_YELLOW;
  140. TFT_print(temp2_str, layout.aussenLeft, layout.tempBaseline);
  141. tft_fg = TFT_WHITE;
  142. TFT_print(" C", layout.unitLeft, layout.tempBaseline);
  143. TFT_drawCircle(layout.unitLeft+3, layout.tempBaseline+3, 3, TFT_WHITE);
  144. TFT_setFont(UBUNTU16_FONT, NULL);
  145. TFT_print(humid_str, layout.innenLeft, layout.humBaseline);
  146. TFT_print(humid2_str, layout.aussenLeft, layout.humBaseline);
  147. TFT_print("%", layout.unitLeft, layout.humBaseline);
  148. TFT_print(press_str, layout.innenLeft, layout.pressBaseline);
  149. TFT_print(press2_str, layout.aussenLeft, layout.pressBaseline);
  150. TFT_print("hPa", layout.unitLeft, layout.pressBaseline);
  151. }
  152. esp_err_t init_display()
  153. {
  154. tft_max_rdclock = 4000000;
  155. TFT_PinsInit();
  156. spi_lobo_device_handle_t spi;
  157. spi_lobo_bus_config_t buscfg={
  158. .miso_io_num=PIN_NUM_MISO,
  159. .mosi_io_num=PIN_NUM_MOSI,
  160. .sclk_io_num=PIN_NUM_CLK,
  161. .quadwp_io_num=-1,
  162. .quadhd_io_num=-1,
  163. .max_transfer_sz = 6*1024,
  164. };
  165. spi_lobo_device_interface_config_t devcfg={
  166. .clock_speed_hz=8000000,
  167. .mode=0,
  168. .spics_io_num=-1,
  169. .spics_ext_io_num=PIN_NUM_CS,
  170. .flags=LB_SPI_DEVICE_HALFDUPLEX,
  171. };
  172. esp_err_t ret;
  173. ret=spi_lobo_bus_add_device(SPI_BUS, &buscfg, &devcfg, &spi);
  174. if (ret != ESP_OK)
  175. {
  176. return ret;
  177. }
  178. tft_disp_spi = spi;
  179. TFT_display_init();
  180. tft_max_rdclock = find_rd_speed();
  181. spi_lobo_set_speed(spi, DEFAULT_SPI_CLOCK);
  182. tft_font_rotate = 0;
  183. tft_text_wrap = 0;
  184. tft_font_transparent = 0;
  185. tft_font_forceFixed = 0;
  186. tft_gray_scale = 0;
  187. TFT_setGammaCurve(DEFAULT_GAMMA_CURVE);
  188. TFT_setRotation(LANDSCAPE_FLIP);
  189. TFT_setFont(DEFAULT_FONT, NULL);
  190. TFT_resetclipwin();
  191. tft_image_debug = 0;
  192. layout = create_layout();
  193. return ESP_OK;
  194. }