Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный TFT
Dependencies: FT800_2 HYT mbed
Компоненты
- Датчик температуры и относительной влажности HYT-271 / HYT-221 / HYT-939 от компании IST-AG
- TFT-модуль серии uxTouch от компании Riverdi
- Плата-переходник Break Out Board 20 от компании Riverdi
- Любая отладочная плата с поддержкой mbed, интерфейсами I2C и SPI interface двумя свободными линиями для сигналов PD и INT
Подключение
Отладочная плата к TFT-модулю
Отладочная плата подключается к модулю через переходник Break Out Board 20. На плате-переходнике используется 6 сигналов: SCK, MOSI, MISO, SS (интерфейс SPI), PD (powerdown) и INT (interrupt).
Питание должно быть подано не только на VDD, но и на BLVDD - подсветку экрана. Соответствующие выводы можно просто соединить между собой:
Отладочная плата к датчику серии HYT
К датчику отладочная плата подключается по I2C. Не забываем про подтяжку к питанию:
Демонстрация работы
Процесс создания приложения подробно описан тут: https://habrahabr.ru/users/uuuulala/topics/
TFT/display.Draw_30minStatistics.cpp@0:9db07391e780, 2016-10-07 (annotated)
- Committer:
- Ksenia
- Date:
- Fri Oct 07 11:03:16 2016 +0000
- Revision:
- 0:9db07391e780
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ksenia | 0:9db07391e780 | 1 | #include "display.h" |
Ksenia | 0:9db07391e780 | 2 | |
Ksenia | 0:9db07391e780 | 3 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 4 | ************************** Display data about humidity in the 30-minutes interval ***************************************** |
Ksenia | 0:9db07391e780 | 5 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 6 | |
Ksenia | 0:9db07391e780 | 7 | void Display::StatHumidity_30min(volatile uint64_t seconds, short int statistics24hrs[3][288], uint64_t gridSecondsOffset) |
Ksenia | 0:9db07391e780 | 8 | { |
Ksenia | 0:9db07391e780 | 9 | // start FT800 display list |
Ksenia | 0:9db07391e780 | 10 | StartDL(); |
Ksenia | 0:9db07391e780 | 11 | |
Ksenia | 0:9db07391e780 | 12 | // mark the plot area as touch input (to return to 24-hrs statistics) |
Ksenia | 0:9db07391e780 | 13 | (*_TFT).DL(COLOR_RGB(213, 213, 213)); |
Ksenia | 0:9db07391e780 | 14 | (*_TFT).DL(TAG_MASK(1)); |
Ksenia | 0:9db07391e780 | 15 | (*_TFT).DL(TAG(STAT_HUM_PRESS)); |
Ksenia | 0:9db07391e780 | 16 | (*_TFT).DL(BEGIN(RECTS)); |
Ksenia | 0:9db07391e780 | 17 | (*_TFT).DL(VERTEX2II(25, 100, 0, 0)); |
Ksenia | 0:9db07391e780 | 18 | (*_TFT).DL(VERTEX2II(433, 200, 0, 0)); |
Ksenia | 0:9db07391e780 | 19 | (*_TFT).DL(TAG_MASK(0)); |
Ksenia | 0:9db07391e780 | 20 | |
Ksenia | 0:9db07391e780 | 21 | // create time string, GridLines, link to main menu |
Ksenia | 0:9db07391e780 | 22 | TimeSinceTurnOn(seconds); |
Ksenia | 0:9db07391e780 | 23 | VerticalGrid30min(gridSecondsOffset); |
Ksenia | 0:9db07391e780 | 24 | HorisontalGrid_Statistics_Humidity(); |
Ksenia | 0:9db07391e780 | 25 | MainMenuReference(); |
Ksenia | 0:9db07391e780 | 26 | |
Ksenia | 0:9db07391e780 | 27 | // draw graph line |
Ksenia | 0:9db07391e780 | 28 | for (int i = 0; i < 6; i++) { |
Ksenia | 0:9db07391e780 | 29 | char currentValue = statistics24hrs[0][i + timePoint3hrs + timePoint30min]; |
Ksenia | 0:9db07391e780 | 30 | char currentMinValue = statistics24hrs[1][i + timePoint3hrs + timePoint30min]; |
Ksenia | 0:9db07391e780 | 31 | char currentMaxValue = statistics24hrs[2][i + timePoint3hrs + timePoint30min]; |
Ksenia | 0:9db07391e780 | 32 | if (currentValue != INIT_STATISTICS_NUMBER && (i + timePoint3hrs + timePoint30min) != 0) { |
Ksenia | 0:9db07391e780 | 33 | if (currentMaxValue - currentMinValue >= DELTA_HUMIDITY) { |
Ksenia | 0:9db07391e780 | 34 | (*_TFT).DL(COLOR_RGB(207, 45, 13)); |
Ksenia | 0:9db07391e780 | 35 | (*_TFT).Number(i * 68, 200 - currentMaxValue - 15, 26, 0, currentMaxValue); |
Ksenia | 0:9db07391e780 | 36 | (*_TFT).Number(i * 68, 200 - currentMinValue + 1, 26, 0, currentMinValue); |
Ksenia | 0:9db07391e780 | 37 | (*_TFT).Number(i * 68 + 43, 200 - currentValue - 7, 26, 0, currentValue); |
Ksenia | 0:9db07391e780 | 38 | } else { |
Ksenia | 0:9db07391e780 | 39 | (*_TFT).DL(COLOR_RGB(9, 0, 63)); |
Ksenia | 0:9db07391e780 | 40 | (*_TFT).Number(i * 68 + 43, 200 - currentValue - 7, 26, 0, currentValue); |
Ksenia | 0:9db07391e780 | 41 | } |
Ksenia | 0:9db07391e780 | 42 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 43 | (*_TFT).DL(LINE_WIDTH(16)); |
Ksenia | 0:9db07391e780 | 44 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentValue) * 16)); |
Ksenia | 0:9db07391e780 | 45 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentMaxValue) * 16)); |
Ksenia | 0:9db07391e780 | 46 | (*_TFT).DL(VERTEX2F((i * 68 + 10) * 16, (200 - currentMaxValue) * 16)); |
Ksenia | 0:9db07391e780 | 47 | (*_TFT).DL(VERTEX2F((i * 68 + 40) * 16, (200 - currentMaxValue) * 16)); |
Ksenia | 0:9db07391e780 | 48 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 49 | |
Ksenia | 0:9db07391e780 | 50 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 51 | (*_TFT).DL(LINE_WIDTH(16)); |
Ksenia | 0:9db07391e780 | 52 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentValue) * 16)); |
Ksenia | 0:9db07391e780 | 53 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentMinValue) * 16)); |
Ksenia | 0:9db07391e780 | 54 | (*_TFT).DL(VERTEX2F((i * 68 + 10) * 16, (200 - currentMinValue) * 16)); |
Ksenia | 0:9db07391e780 | 55 | (*_TFT).DL(VERTEX2F((i * 68 + 40) * 16, (200 - currentMinValue) * 16)); |
Ksenia | 0:9db07391e780 | 56 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 57 | |
Ksenia | 0:9db07391e780 | 58 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 59 | (*_TFT).DL(POINT_SIZE(70)); |
Ksenia | 0:9db07391e780 | 60 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentValue) * 16)); |
Ksenia | 0:9db07391e780 | 61 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 62 | |
Ksenia | 0:9db07391e780 | 63 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 64 | (*_TFT).DL(LINE_WIDTH(24)); |
Ksenia | 0:9db07391e780 | 65 | (*_TFT).DL(VERTEX2F((i * 68 + 15) * 16, (200 - currentValue) * 16)); |
Ksenia | 0:9db07391e780 | 66 | (*_TFT).DL(VERTEX2F((i * 68 + 35) * 16, (200 - currentValue) * 16)); |
Ksenia | 0:9db07391e780 | 67 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 68 | } |
Ksenia | 0:9db07391e780 | 69 | if (timePoint3hrs + timePoint30min == 0) { |
Ksenia | 0:9db07391e780 | 70 | (*_TFT).DL(COLOR_RGB(9, 0, 63)); |
Ksenia | 0:9db07391e780 | 71 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 72 | (*_TFT).DL(POINT_SIZE(70)); |
Ksenia | 0:9db07391e780 | 73 | (*_TFT).DL(VERTEX2F(25 * 16, (200 - statistics24hrs[0][0]) * 16)); |
Ksenia | 0:9db07391e780 | 74 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 75 | } |
Ksenia | 0:9db07391e780 | 76 | } |
Ksenia | 0:9db07391e780 | 77 | |
Ksenia | 0:9db07391e780 | 78 | // write main title |
Ksenia | 0:9db07391e780 | 79 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
Ksenia | 0:9db07391e780 | 80 | CreateStringRussian("Отн. влажность за 30 минут"); |
Ksenia | 0:9db07391e780 | 81 | (*_TFT).Text(15, 15, 3, 0, russianStr); |
Ksenia | 0:9db07391e780 | 82 | |
Ksenia | 0:9db07391e780 | 83 | // finish FT800 display list |
Ksenia | 0:9db07391e780 | 84 | FinishDL(); |
Ksenia | 0:9db07391e780 | 85 | } |
Ksenia | 0:9db07391e780 | 86 | |
Ksenia | 0:9db07391e780 | 87 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 88 | ************************** Display data about temperature in the 30-minutes interval ************************************** |
Ksenia | 0:9db07391e780 | 89 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 90 | |
Ksenia | 0:9db07391e780 | 91 | void Display::StatTemperature_30min(volatile uint64_t seconds, short int statistics24hrs[3][288], uint64_t gridSecondsOffset) |
Ksenia | 0:9db07391e780 | 92 | { |
Ksenia | 0:9db07391e780 | 93 | // strings needed to output temperature values with decimal mark |
Ksenia | 0:9db07391e780 | 94 | char currentValueStr[8], currentMinValueStr[8], currentMaxValueStr[8]; |
Ksenia | 0:9db07391e780 | 95 | |
Ksenia | 0:9db07391e780 | 96 | // start FT800 display list |
Ksenia | 0:9db07391e780 | 97 | StartDL(); |
Ksenia | 0:9db07391e780 | 98 | |
Ksenia | 0:9db07391e780 | 99 | // mark the plot area as touch input (to return to 24-hrs statistics) |
Ksenia | 0:9db07391e780 | 100 | (*_TFT).DL(COLOR_RGB(213, 213, 213)); |
Ksenia | 0:9db07391e780 | 101 | (*_TFT).DL(TAG_MASK(1)); |
Ksenia | 0:9db07391e780 | 102 | (*_TFT).DL(TAG(STAT_TEMP_PRESS)); |
Ksenia | 0:9db07391e780 | 103 | (*_TFT).DL(BEGIN(RECTS)); |
Ksenia | 0:9db07391e780 | 104 | (*_TFT).DL(VERTEX2II(25, 100, 0, 0)); |
Ksenia | 0:9db07391e780 | 105 | (*_TFT).DL(VERTEX2II(433, 200, 0, 0)); |
Ksenia | 0:9db07391e780 | 106 | (*_TFT).DL(TAG_MASK(0)); |
Ksenia | 0:9db07391e780 | 107 | |
Ksenia | 0:9db07391e780 | 108 | // create time string, GridLines, link to main menu |
Ksenia | 0:9db07391e780 | 109 | TimeSinceTurnOn(seconds); |
Ksenia | 0:9db07391e780 | 110 | VerticalGrid30min(gridSecondsOffset); |
Ksenia | 0:9db07391e780 | 111 | HorisontalGrid_Statistics_Temperature(); |
Ksenia | 0:9db07391e780 | 112 | MainMenuReference(); |
Ksenia | 0:9db07391e780 | 113 | |
Ksenia | 0:9db07391e780 | 114 | // draw graph line |
Ksenia | 0:9db07391e780 | 115 | // Temperature values are multiplied by 10 in the statistics data array. |
Ksenia | 0:9db07391e780 | 116 | // To receive "normal" temperature with decimal mark we have to divide it |
Ksenia | 0:9db07391e780 | 117 | for (int i = 0; i < 6; i++) { |
Ksenia | 0:9db07391e780 | 118 | char currentValue_toDraw = (statistics24hrs[0][i + timePoint3hrs + timePoint30min] / TEMPERATURE_MULTIPLIER + 50) * 0.57; |
Ksenia | 0:9db07391e780 | 119 | char currentMinValue_toDraw = (statistics24hrs[1][i + timePoint3hrs + timePoint30min] / TEMPERATURE_MULTIPLIER + 50) * 0.57; |
Ksenia | 0:9db07391e780 | 120 | char currentMaxValue_toDraw = (statistics24hrs[2][i + timePoint3hrs + timePoint30min] / TEMPERATURE_MULTIPLIER + 50) * 0.57; |
Ksenia | 0:9db07391e780 | 121 | |
Ksenia | 0:9db07391e780 | 122 | short int currentValue_multiplied = statistics24hrs[0][i + timePoint3hrs + timePoint30min]; |
Ksenia | 0:9db07391e780 | 123 | CreateStringMultipliedTemp(currentValueStr, currentValue_multiplied); |
Ksenia | 0:9db07391e780 | 124 | short int currentMinValue_multiplied = statistics24hrs[1][i + timePoint3hrs + timePoint30min]; |
Ksenia | 0:9db07391e780 | 125 | CreateStringMultipliedTemp(currentMinValueStr, currentMinValue_multiplied); |
Ksenia | 0:9db07391e780 | 126 | short int currentMaxValue_multiplied = statistics24hrs[2][i + timePoint3hrs + timePoint30min]; |
Ksenia | 0:9db07391e780 | 127 | CreateStringMultipliedTemp(currentMaxValueStr, currentMaxValue_multiplied); |
Ksenia | 0:9db07391e780 | 128 | |
Ksenia | 0:9db07391e780 | 129 | short int delta = currentMaxValue_multiplied - currentMinValue_multiplied; |
Ksenia | 0:9db07391e780 | 130 | if (currentValue_multiplied != INIT_STATISTICS_NUMBER && (i + timePoint3hrs + timePoint30min) != 0) { |
Ksenia | 0:9db07391e780 | 131 | if (delta >= DELTA_TEMPERATURE * TEMPERATURE_MULTIPLIER) { |
Ksenia | 0:9db07391e780 | 132 | (*_TFT).DL(COLOR_RGB(207, 45, 13)); |
Ksenia | 0:9db07391e780 | 133 | (*_TFT).Text(i * 68 + 5, 200 - currentMaxValue_toDraw - 17, 20, 0, currentMaxValueStr); |
Ksenia | 0:9db07391e780 | 134 | (*_TFT).Text(i * 68 + 5, 200 - currentMinValue_toDraw + 3, 20, 0, currentMinValueStr); |
Ksenia | 0:9db07391e780 | 135 | (*_TFT).Text(i * 68 + 43, 200 - currentValue_toDraw - 7, 26, 0, currentValueStr); |
Ksenia | 0:9db07391e780 | 136 | } else { |
Ksenia | 0:9db07391e780 | 137 | (*_TFT).DL(COLOR_RGB(9, 0, 63)); |
Ksenia | 0:9db07391e780 | 138 | (*_TFT).Text(i * 68 + 43, 200 - currentValue_toDraw - 7, 26, 0, currentValueStr); |
Ksenia | 0:9db07391e780 | 139 | } |
Ksenia | 0:9db07391e780 | 140 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 141 | (*_TFT).DL(LINE_WIDTH(16)); |
Ksenia | 0:9db07391e780 | 142 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 143 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentMaxValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 144 | (*_TFT).DL(VERTEX2F((i * 68 + 10) * 16, (200 - currentMaxValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 145 | (*_TFT).DL(VERTEX2F((i * 68 + 40) * 16, (200 - currentMaxValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 146 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 147 | |
Ksenia | 0:9db07391e780 | 148 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 149 | (*_TFT).DL(LINE_WIDTH(16)); |
Ksenia | 0:9db07391e780 | 150 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 151 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentMinValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 152 | (*_TFT).DL(VERTEX2F((i * 68 + 10) * 16, (200 - currentMinValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 153 | (*_TFT).DL(VERTEX2F((i * 68 + 40) * 16, (200 - currentMinValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 154 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 155 | |
Ksenia | 0:9db07391e780 | 156 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 157 | (*_TFT).DL(POINT_SIZE(70)); |
Ksenia | 0:9db07391e780 | 158 | (*_TFT).DL(VERTEX2F((i * 68 + 25) * 16, (200 - currentValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 159 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 160 | |
Ksenia | 0:9db07391e780 | 161 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 162 | (*_TFT).DL(LINE_WIDTH(24)); |
Ksenia | 0:9db07391e780 | 163 | (*_TFT).DL(VERTEX2F((i * 68 + 15) * 16, (200 - currentValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 164 | (*_TFT).DL(VERTEX2F((i * 68 + 35) * 16, (200 - currentValue_toDraw) * 16)); |
Ksenia | 0:9db07391e780 | 165 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 166 | } |
Ksenia | 0:9db07391e780 | 167 | if (timePoint3hrs + timePoint30min == 0) { |
Ksenia | 0:9db07391e780 | 168 | (*_TFT).DL(COLOR_RGB(9, 0, 63)); |
Ksenia | 0:9db07391e780 | 169 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 170 | (*_TFT).DL(POINT_SIZE(70)); |
Ksenia | 0:9db07391e780 | 171 | (*_TFT).DL(VERTEX2F(25 * 16, (200 - statistics24hrs[0][0]) * 16)); |
Ksenia | 0:9db07391e780 | 172 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 173 | } |
Ksenia | 0:9db07391e780 | 174 | } |
Ksenia | 0:9db07391e780 | 175 | |
Ksenia | 0:9db07391e780 | 176 | // write main title |
Ksenia | 0:9db07391e780 | 177 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
Ksenia | 0:9db07391e780 | 178 | CreateStringRussian("Температура за 30 минут"); |
Ksenia | 0:9db07391e780 | 179 | (*_TFT).Text(15, 15, 3, 0, russianStr); |
Ksenia | 0:9db07391e780 | 180 | |
Ksenia | 0:9db07391e780 | 181 | // finish FT800 display list |
Ksenia | 0:9db07391e780 | 182 | FinishDL(); |
Ksenia | 0:9db07391e780 | 183 | } |