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