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