Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный 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_24hrsStatistics.cpp@1:8ca8a4ecbe6b, 2016-10-12 (annotated)
- Committer:
- Ksenia
- Date:
- Wed Oct 12 10:53:35 2016 +0000
- Revision:
- 1:8ca8a4ecbe6b
- Parent:
- 0:9db07391e780
?????? ??????? ? ?????? ?????????
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 24-hour interval ******************************************** |
| Ksenia | 0:9db07391e780 | 5 | **************************************************************************************************************************/ |
| Ksenia | 0:9db07391e780 | 6 | |
| Ksenia | 0:9db07391e780 | 7 | void Display::StatHumidity_24hrs(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 8 areas for touch input (for zoom in), |
| Ksenia | 0:9db07391e780 | 13 | // make each every second zone gray, make the active zone green |
| Ksenia | 0:9db07391e780 | 14 | char ZonesCnt = 0; |
| Ksenia | 0:9db07391e780 | 15 | for (int i = 25; i < 433; i += 17 * 3) { |
| Ksenia | 0:9db07391e780 | 16 | (*_TFT).DL(COLOR_RGB(255, 255, 255)); |
| Ksenia | 0:9db07391e780 | 17 | if (ZonesCnt % 2 == 0) { |
| Ksenia | 0:9db07391e780 | 18 | (*_TFT).DL(COLOR_RGB(233, 233, 233)); |
| Ksenia | 0:9db07391e780 | 19 | } |
| Ksenia | 0:9db07391e780 | 20 | if (pressedButton - ZONE_1_PRESS == ZonesCnt) { |
| Ksenia | 0:9db07391e780 | 21 | (*_TFT).DL(COLOR_RGB(200, 255, 200)); |
| Ksenia | 0:9db07391e780 | 22 | timePoint3hrs = 36 * ZonesCnt; |
| Ksenia | 0:9db07391e780 | 23 | } |
| Ksenia | 0:9db07391e780 | 24 | (*_TFT).DL(TAG_MASK(1)); |
| Ksenia | 0:9db07391e780 | 25 | (*_TFT).DL(TAG(ZONE_1_PRESS + ZonesCnt)); |
| Ksenia | 0:9db07391e780 | 26 | (*_TFT).DL(BEGIN(RECTS)); |
| Ksenia | 0:9db07391e780 | 27 | (*_TFT).DL(VERTEX2II(i, 100, 0, 0)); |
| Ksenia | 0:9db07391e780 | 28 | (*_TFT).DL(VERTEX2II(i + 17 * 3, 200, 0, 0)); |
| Ksenia | 0:9db07391e780 | 29 | (*_TFT).DL(TAG_MASK(0)); |
| Ksenia | 0:9db07391e780 | 30 | ZonesCnt++; |
| Ksenia | 0:9db07391e780 | 31 | } |
| Ksenia | 0:9db07391e780 | 32 | |
| Ksenia | 0:9db07391e780 | 33 | // create time string, GridLines, link to main menu |
| Ksenia | 0:9db07391e780 | 34 | TimeSinceTurnOn(seconds); |
| Ksenia | 0:9db07391e780 | 35 | VerticalGrid24hrs(gridSecondsOffset); |
| Ksenia | 0:9db07391e780 | 36 | HorisontalGrid_Statistics_Humidity(); |
| Ksenia | 0:9db07391e780 | 37 | MainMenuReference(); |
| Ksenia | 0:9db07391e780 | 38 | |
| Ksenia | 0:9db07391e780 | 39 | // draw graph line |
| Ksenia | 0:9db07391e780 | 40 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
| Ksenia | 0:9db07391e780 | 41 | for (int i = 1; i < 287; i++) { |
| Ksenia | 0:9db07391e780 | 42 | short int currentValue = statistics24hrs[0][i]; |
| Ksenia | 0:9db07391e780 | 43 | if (currentValue != INIT_STATISTICS_NUMBER) { |
| Ksenia | 0:9db07391e780 | 44 | char previousValue = statistics24hrs[0][i - 1]; |
| Ksenia | 0:9db07391e780 | 45 | char delta = statistics24hrs[2][i] - statistics24hrs[1][i]; |
| Ksenia | 0:9db07391e780 | 46 | if (delta >= DELTA_HUMIDITY) { |
| Ksenia | 0:9db07391e780 | 47 | (*_TFT).DL(COLOR_RGB(255, 0, 0)); |
| Ksenia | 0:9db07391e780 | 48 | (*_TFT).DL(BEGIN(LINES)); |
| Ksenia | 0:9db07391e780 | 49 | (*_TFT).DL(LINE_WIDTH(8)); |
| Ksenia | 0:9db07391e780 | 50 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (200 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 51 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (180 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 52 | (*_TFT).DL(END()); |
| Ksenia | 0:9db07391e780 | 53 | (*_TFT).DL(BEGIN(POINTS)); |
| Ksenia | 0:9db07391e780 | 54 | (*_TFT).DL(POINT_SIZE(33)); |
| Ksenia | 0:9db07391e780 | 55 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (180 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 56 | (*_TFT).DL(END()); |
| Ksenia | 0:9db07391e780 | 57 | } |
| Ksenia | 0:9db07391e780 | 58 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
| Ksenia | 0:9db07391e780 | 59 | (*_TFT).DL(BEGIN(LINES)); |
| Ksenia | 0:9db07391e780 | 60 | (*_TFT).DL(LINE_WIDTH(16)); |
| Ksenia | 0:9db07391e780 | 61 | (*_TFT).DL(VERTEX2F((i - 1) * 23 + 25 * 16, (200 - previousValue) * 16)); |
| Ksenia | 0:9db07391e780 | 62 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (200 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 63 | (*_TFT).DL(END()); |
| Ksenia | 0:9db07391e780 | 64 | } |
| Ksenia | 0:9db07391e780 | 65 | } |
| Ksenia | 0:9db07391e780 | 66 | |
| Ksenia | 0:9db07391e780 | 67 | // write main title |
| Ksenia | 0:9db07391e780 | 68 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
| Ksenia | 0:9db07391e780 | 69 | CreateStringRussian("Отн. влажность за 24 часа"); |
| Ksenia | 0:9db07391e780 | 70 | (*_TFT).Text(15, 15, 3, 0, russianStr); |
| Ksenia | 0:9db07391e780 | 71 | |
| Ksenia | 0:9db07391e780 | 72 | // finish FT800 display list |
| Ksenia | 0:9db07391e780 | 73 | FinishDL(); |
| Ksenia | 0:9db07391e780 | 74 | } |
| Ksenia | 0:9db07391e780 | 75 | |
| Ksenia | 0:9db07391e780 | 76 | /************************************************************************************************************************** |
| Ksenia | 0:9db07391e780 | 77 | ************************** Display data about temperature in the 24-hour interval ***************************************** |
| Ksenia | 0:9db07391e780 | 78 | **************************************************************************************************************************/ |
| Ksenia | 0:9db07391e780 | 79 | |
| Ksenia | 0:9db07391e780 | 80 | void Display::StatTemperature_24hrs(volatile uint64_t seconds, short int statistics24hrs[3][288], uint64_t gridSecondsOffset) |
| Ksenia | 0:9db07391e780 | 81 | { |
| Ksenia | 0:9db07391e780 | 82 | // start FT800 display list |
| Ksenia | 0:9db07391e780 | 83 | StartDL(); |
| Ksenia | 0:9db07391e780 | 84 | |
| Ksenia | 0:9db07391e780 | 85 | // mark 8 areas for touch input (for zoom in), |
| Ksenia | 0:9db07391e780 | 86 | // make each every second zone gray, make the active zone green |
| Ksenia | 0:9db07391e780 | 87 | char ZonesCnt = 0; |
| Ksenia | 0:9db07391e780 | 88 | for (int i = 25; i < 433; i += 17 * 3) { |
| Ksenia | 0:9db07391e780 | 89 | (*_TFT).DL(COLOR_RGB(255, 255, 255)); |
| Ksenia | 0:9db07391e780 | 90 | if (ZonesCnt % 2 == 0) { |
| Ksenia | 0:9db07391e780 | 91 | (*_TFT).DL(COLOR_RGB(233, 233, 233)); |
| Ksenia | 0:9db07391e780 | 92 | } |
| Ksenia | 0:9db07391e780 | 93 | if (pressedButton - ZONE_1_PRESS == ZonesCnt) { |
| Ksenia | 0:9db07391e780 | 94 | (*_TFT).DL(COLOR_RGB(200, 255, 200)); |
| Ksenia | 0:9db07391e780 | 95 | timePoint3hrs = 36 * ZonesCnt; |
| Ksenia | 0:9db07391e780 | 96 | } |
| Ksenia | 0:9db07391e780 | 97 | (*_TFT).DL(TAG_MASK(1)); |
| Ksenia | 0:9db07391e780 | 98 | (*_TFT).DL(TAG(ZONE_1_PRESS + ZonesCnt)); |
| Ksenia | 0:9db07391e780 | 99 | (*_TFT).DL(BEGIN(RECTS)); |
| Ksenia | 0:9db07391e780 | 100 | (*_TFT).DL(VERTEX2II(i, 100, 0, 0)); |
| Ksenia | 0:9db07391e780 | 101 | (*_TFT).DL(VERTEX2II(i + 17 * 3, 200, 0, 0)); |
| Ksenia | 0:9db07391e780 | 102 | (*_TFT).DL(TAG_MASK(0)); |
| Ksenia | 0:9db07391e780 | 103 | ZonesCnt++; |
| Ksenia | 0:9db07391e780 | 104 | } |
| Ksenia | 0:9db07391e780 | 105 | |
| Ksenia | 0:9db07391e780 | 106 | // create time string, GridLines, link to main menu |
| Ksenia | 0:9db07391e780 | 107 | TimeSinceTurnOn(seconds); |
| Ksenia | 0:9db07391e780 | 108 | VerticalGrid24hrs(gridSecondsOffset); |
| Ksenia | 0:9db07391e780 | 109 | HorisontalGrid_Statistics_Temperature(); |
| Ksenia | 0:9db07391e780 | 110 | MainMenuReference(); |
| Ksenia | 0:9db07391e780 | 111 | |
| Ksenia | 0:9db07391e780 | 112 | // draw graph line |
| Ksenia | 0:9db07391e780 | 113 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
| Ksenia | 0:9db07391e780 | 114 | for (int i = 1; i < 287; i++) { |
| Ksenia | 0:9db07391e780 | 115 | char previousValue = (statistics24hrs[0][i - 1] / TEMPERATURE_MULTIPLIER + 50) * 0.57; |
| Ksenia | 0:9db07391e780 | 116 | char currentValue = (statistics24hrs[0][i] / TEMPERATURE_MULTIPLIER + 50) * 0.57; |
| Ksenia | 0:9db07391e780 | 117 | char delta = statistics24hrs[2][i] - statistics24hrs[1][i]; |
| Ksenia | 0:9db07391e780 | 118 | if (statistics24hrs[0][i] != INIT_STATISTICS_NUMBER) { |
| Ksenia | 0:9db07391e780 | 119 | if (delta >= DELTA_TEMPERATURE * TEMPERATURE_MULTIPLIER) { |
| Ksenia | 0:9db07391e780 | 120 | (*_TFT).DL(COLOR_RGB(255, 0, 0)); |
| Ksenia | 0:9db07391e780 | 121 | (*_TFT).DL(BEGIN(LINES)); |
| Ksenia | 0:9db07391e780 | 122 | (*_TFT).DL(LINE_WIDTH(8)); |
| Ksenia | 0:9db07391e780 | 123 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (200 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 124 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (180 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 125 | (*_TFT).DL(END()); |
| Ksenia | 0:9db07391e780 | 126 | (*_TFT).DL(BEGIN(POINTS)); |
| Ksenia | 0:9db07391e780 | 127 | (*_TFT).DL(POINT_SIZE(33)); |
| Ksenia | 0:9db07391e780 | 128 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (180 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 129 | (*_TFT).DL(END()); |
| Ksenia | 0:9db07391e780 | 130 | } |
| Ksenia | 0:9db07391e780 | 131 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
| Ksenia | 0:9db07391e780 | 132 | (*_TFT).DL(BEGIN(LINES)); |
| Ksenia | 0:9db07391e780 | 133 | (*_TFT).DL(LINE_WIDTH(16)); |
| Ksenia | 0:9db07391e780 | 134 | (*_TFT).DL(VERTEX2F((i - 1) * 23 + 25 * 16, (200 - previousValue) * 16)); |
| Ksenia | 0:9db07391e780 | 135 | (*_TFT).DL(VERTEX2F(i * 23 + 25 * 16, (200 - currentValue) * 16)); |
| Ksenia | 0:9db07391e780 | 136 | } |
| Ksenia | 0:9db07391e780 | 137 | } |
| Ksenia | 0:9db07391e780 | 138 | |
| Ksenia | 0:9db07391e780 | 139 | // write main title |
| Ksenia | 0:9db07391e780 | 140 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
| Ksenia | 0:9db07391e780 | 141 | CreateStringRussian("Температура за 24 часа"); |
| Ksenia | 0:9db07391e780 | 142 | (*_TFT).Text(15, 15, 3, 0, russianStr); |
| Ksenia | 0:9db07391e780 | 143 | |
| Ksenia | 0:9db07391e780 | 144 | // finish FT800 display list |
| Ksenia | 0:9db07391e780 | 145 | FinishDL(); |
| Ksenia | 0:9db07391e780 | 146 | } |