Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный 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_CurrentValues.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 real-time humidity ********************************************************************* |
Ksenia | 0:9db07391e780 | 5 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 6 | |
Ksenia | 0:9db07391e780 | 7 | void Display::CurrentHumidity(float humidity) |
Ksenia | 0:9db07391e780 | 8 | { |
Ksenia | 0:9db07391e780 | 9 | // accelerator for x-axis data output |
Ksenia | 0:9db07391e780 | 10 | char accelerator = 6; |
Ksenia | 0:9db07391e780 | 11 | // create string including current humididty and " %" |
Ksenia | 0:9db07391e780 | 12 | CreateStringTempHum(humidityStr, humidity, 0); |
Ksenia | 0:9db07391e780 | 13 | // write the new scalable (* 1.5) data to the next available array position |
Ksenia | 0:9db07391e780 | 14 | currentHumidity_Y[currentHumidity_X] = (char)(humidity * 1.5); |
Ksenia | 0:9db07391e780 | 15 | |
Ksenia | 0:9db07391e780 | 16 | // start FT800 display list |
Ksenia | 0:9db07391e780 | 17 | StartDL(); |
Ksenia | 0:9db07391e780 | 18 | |
Ksenia | 0:9db07391e780 | 19 | // draw bottom color for graph line |
Ksenia | 0:9db07391e780 | 20 | (*_TFT).DL(COLOR_RGB(200, 200, 200)); |
Ksenia | 0:9db07391e780 | 21 | (*_TFT).DL(BEGIN(EDGE_STRIP_B)); |
Ksenia | 0:9db07391e780 | 22 | for (int i = 0; i < 68; i++) { |
Ksenia | 0:9db07391e780 | 23 | if (currentHumidity_Y[i] != 0 && i <= currentHumidity_X) { |
Ksenia | 0:9db07391e780 | 24 | (*_TFT).DL(VERTEX2F((i * accelerator + 15) * 16, (220 - currentHumidity_Y[i]) * 16)); |
Ksenia | 0:9db07391e780 | 25 | } |
Ksenia | 0:9db07391e780 | 26 | } |
Ksenia | 0:9db07391e780 | 27 | |
Ksenia | 0:9db07391e780 | 28 | // draw horisontal grid for humidity (0 .. 100) |
Ksenia | 0:9db07391e780 | 29 | HorisontalGrid_Current_Humidity(); |
Ksenia | 0:9db07391e780 | 30 | |
Ksenia | 0:9db07391e780 | 31 | // draw main graph line |
Ksenia | 0:9db07391e780 | 32 | (*_TFT).DL(COLOR_RGB(9, 0, 63)); |
Ksenia | 0:9db07391e780 | 33 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 34 | (*_TFT).DL(POINT_SIZE(25)); |
Ksenia | 0:9db07391e780 | 35 | for (int i = 0; i < 68; i++) { |
Ksenia | 0:9db07391e780 | 36 | if (currentHumidity_Y[i] != 0 && (i < currentHumidity_X || i >= currentHumidity_X + 13)) { |
Ksenia | 0:9db07391e780 | 37 | (*_TFT).DL(VERTEX2F((i * accelerator + 15) * 16, (222 - currentHumidity_Y[i]) * 16)); |
Ksenia | 0:9db07391e780 | 38 | } |
Ksenia | 0:9db07391e780 | 39 | } |
Ksenia | 0:9db07391e780 | 40 | |
Ksenia | 0:9db07391e780 | 41 | // draw subtitle for main graph line |
Ksenia | 0:9db07391e780 | 42 | (*_TFT).DL(COLOR_RGB(255, 255, 255)); |
Ksenia | 0:9db07391e780 | 43 | (*_TFT).DL(BEGIN(RECTS)); |
Ksenia | 0:9db07391e780 | 44 | (*_TFT).DL(VERTEX2II((currentHumidity_X * accelerator + 40) + 25, (200 - currentHumidity_Y[currentHumidity_X]), 0, 0)); |
Ksenia | 0:9db07391e780 | 45 | (*_TFT).DL(VERTEX2II((currentHumidity_X * accelerator + 40), (177 - currentHumidity_Y[currentHumidity_X]), 0, 0)); |
Ksenia | 0:9db07391e780 | 46 | (*_TFT).DL(COLOR_RGB(255, 0, 0)); |
Ksenia | 0:9db07391e780 | 47 | (*_TFT).Text((currentHumidity_X * accelerator + 30), (180 - currentHumidity_Y[currentHumidity_X] - 7), 28, 0, humidityStr); |
Ksenia | 0:9db07391e780 | 48 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 49 | (*_TFT).DL(LINE_WIDTH(8)); |
Ksenia | 0:9db07391e780 | 50 | (*_TFT).DL(VERTEX2F((currentHumidity_X * accelerator + 15) * 16, (220 - currentHumidity_Y[currentHumidity_X]) * 16)); |
Ksenia | 0:9db07391e780 | 51 | (*_TFT).DL(VERTEX2F((currentHumidity_X * accelerator + 35) * 16, (200 - currentHumidity_Y[currentHumidity_X]) * 16)); |
Ksenia | 0:9db07391e780 | 52 | (*_TFT).DL(COLOR_RGB(255, 30, 33)); |
Ksenia | 0:9db07391e780 | 53 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 54 | (*_TFT).DL(POINT_SIZE(33)); |
Ksenia | 0:9db07391e780 | 55 | (*_TFT).DL(VERTEX2F((currentHumidity_X * accelerator + 15) * 16, (220 - currentHumidity_Y[currentHumidity_X]) * 16)); |
Ksenia | 0:9db07391e780 | 56 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 57 | |
Ksenia | 0:9db07391e780 | 58 | // write main title |
Ksenia | 0:9db07391e780 | 59 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
Ksenia | 0:9db07391e780 | 60 | CreateStringRussian("Относительная влажность"); |
Ksenia | 0:9db07391e780 | 61 | (*_TFT).Text(15, 15, 3, 0, russianStr); |
Ksenia | 0:9db07391e780 | 62 | |
Ksenia | 0:9db07391e780 | 63 | // clean the space under the plot, create link to the main menu |
Ksenia | 0:9db07391e780 | 64 | (*_TFT).DL(SCISSOR_XY(15, 222)); |
Ksenia | 0:9db07391e780 | 65 | (*_TFT).DL(SCISSOR_SIZE(420, 53)); |
Ksenia | 0:9db07391e780 | 66 | (*_TFT).Gradient(0, 256, 0xFFFFFF, 450, 16, 0xFFFFFF); |
Ksenia | 0:9db07391e780 | 67 | MainMenuReference(); |
Ksenia | 0:9db07391e780 | 68 | |
Ksenia | 0:9db07391e780 | 69 | // finish FT800 display list |
Ksenia | 0:9db07391e780 | 70 | FinishDL(); |
Ksenia | 0:9db07391e780 | 71 | |
Ksenia | 0:9db07391e780 | 72 | // manage the index for array with real-time humidity |
Ksenia | 0:9db07391e780 | 73 | if (currentHumidity_X >= 68) { |
Ksenia | 0:9db07391e780 | 74 | currentHumidity_X = 0; |
Ksenia | 0:9db07391e780 | 75 | } else { |
Ksenia | 0:9db07391e780 | 76 | currentHumidity_X ++; |
Ksenia | 0:9db07391e780 | 77 | } |
Ksenia | 0:9db07391e780 | 78 | if (pressedButton == MENU_PRESS) { |
Ksenia | 0:9db07391e780 | 79 | for (int i = 0; i < 68; i++) { |
Ksenia | 0:9db07391e780 | 80 | currentHumidity_Y[i] = 0; |
Ksenia | 0:9db07391e780 | 81 | currentHumidity_X = 0; |
Ksenia | 0:9db07391e780 | 82 | } |
Ksenia | 0:9db07391e780 | 83 | } |
Ksenia | 0:9db07391e780 | 84 | } |
Ksenia | 0:9db07391e780 | 85 | |
Ksenia | 0:9db07391e780 | 86 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 87 | ************************** Display real-time temperature ****************************************************************** |
Ksenia | 0:9db07391e780 | 88 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 89 | |
Ksenia | 0:9db07391e780 | 90 | void Display::CurrentTemperature(float temperature) |
Ksenia | 0:9db07391e780 | 91 | { |
Ksenia | 0:9db07391e780 | 92 | // accelerator for x-axis data output |
Ksenia | 0:9db07391e780 | 93 | char accelerator = 6; |
Ksenia | 0:9db07391e780 | 94 | // create string including current temperature with decimal mark and " С" |
Ksenia | 0:9db07391e780 | 95 | char degreeOffset = CreateStringTempHum(temperatureStr, temperature, 1); |
Ksenia | 0:9db07391e780 | 96 | // write the new scalable (* 0.88 + 45) data to the next available array position |
Ksenia | 0:9db07391e780 | 97 | currentTemperature_Y[currentTemperature_X] = (char)(temperature * 0.88 + 45); |
Ksenia | 0:9db07391e780 | 98 | |
Ksenia | 0:9db07391e780 | 99 | // start FT800 display list |
Ksenia | 0:9db07391e780 | 100 | StartDL(); |
Ksenia | 0:9db07391e780 | 101 | |
Ksenia | 0:9db07391e780 | 102 | // draw bottom color for graph line |
Ksenia | 0:9db07391e780 | 103 | (*_TFT).DL(COLOR_RGB(200, 177, 199)); |
Ksenia | 0:9db07391e780 | 104 | (*_TFT).DL(BEGIN(EDGE_STRIP_B)); |
Ksenia | 0:9db07391e780 | 105 | for (int i = 0; i < 68; i++) { |
Ksenia | 0:9db07391e780 | 106 | if (currentTemperature_Y[i] != 0 && i <= currentTemperature_X) { |
Ksenia | 0:9db07391e780 | 107 | (*_TFT).DL(VERTEX2F((i * accelerator + 15) * 16, (220 - currentTemperature_Y[i]) * 16)); |
Ksenia | 0:9db07391e780 | 108 | } |
Ksenia | 0:9db07391e780 | 109 | } |
Ksenia | 0:9db07391e780 | 110 | |
Ksenia | 0:9db07391e780 | 111 | // draw horisontal grid for temperature (-50 .. +125) |
Ksenia | 0:9db07391e780 | 112 | HorisontalGrid_Current_Temperature(); |
Ksenia | 0:9db07391e780 | 113 | |
Ksenia | 0:9db07391e780 | 114 | // draw main graph line |
Ksenia | 0:9db07391e780 | 115 | (*_TFT).DL(COLOR_RGB(9, 0, 63)); |
Ksenia | 0:9db07391e780 | 116 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 117 | (*_TFT).DL(POINT_SIZE(25)); |
Ksenia | 0:9db07391e780 | 118 | for (int i = 0; i < 68; i++) { |
Ksenia | 0:9db07391e780 | 119 | if (currentTemperature_Y[i] != 0 && (i < currentTemperature_X || i >= currentTemperature_X + 13)) { |
Ksenia | 0:9db07391e780 | 120 | (*_TFT).DL(VERTEX2F((i * accelerator + 15) * 16, (222 - currentTemperature_Y[i]) * 16)); |
Ksenia | 0:9db07391e780 | 121 | } |
Ksenia | 0:9db07391e780 | 122 | } |
Ksenia | 0:9db07391e780 | 123 | |
Ksenia | 0:9db07391e780 | 124 | // draw subtitle for main graph line |
Ksenia | 0:9db07391e780 | 125 | (*_TFT).DL(COLOR_RGB(255, 255, 255)); |
Ksenia | 0:9db07391e780 | 126 | (*_TFT).DL(BEGIN(RECTS)); |
Ksenia | 0:9db07391e780 | 127 | (*_TFT).DL(VERTEX2II((currentTemperature_X * accelerator + 40) + 25, (200 - currentTemperature_Y[currentTemperature_X]), 0, 0)); |
Ksenia | 0:9db07391e780 | 128 | (*_TFT).DL(VERTEX2II((currentTemperature_X * accelerator + 40), (177 - currentTemperature_Y[currentTemperature_X]), 0, 0)); |
Ksenia | 0:9db07391e780 | 129 | (*_TFT).DL(COLOR_RGB(255, 0, 0)); |
Ksenia | 0:9db07391e780 | 130 | (*_TFT).Text((currentTemperature_X * accelerator + 25), (173 - currentTemperature_Y[currentTemperature_X]), 28, 0, temperatureStr); |
Ksenia | 0:9db07391e780 | 131 | (*_TFT).Text((currentTemperature_X * accelerator + 25) + (degreeOffset * 8 + 3), (173 - currentTemperature_Y[currentTemperature_X]) - 4, 20, 0, "o"); |
Ksenia | 0:9db07391e780 | 132 | (*_TFT).DL(BEGIN(LINES)); |
Ksenia | 0:9db07391e780 | 133 | (*_TFT).DL(LINE_WIDTH(8)); |
Ksenia | 0:9db07391e780 | 134 | (*_TFT).DL(VERTEX2F((currentTemperature_X * accelerator + 15) * 16, (220 - currentTemperature_Y[currentTemperature_X]) * 16)); |
Ksenia | 0:9db07391e780 | 135 | (*_TFT).DL(VERTEX2F((currentTemperature_X * accelerator + 35) * 16, (200 - currentTemperature_Y[currentTemperature_X]) * 16)); |
Ksenia | 0:9db07391e780 | 136 | (*_TFT).DL(COLOR_RGB(255, 30, 33)); |
Ksenia | 0:9db07391e780 | 137 | (*_TFT).DL(BEGIN(POINTS)); |
Ksenia | 0:9db07391e780 | 138 | (*_TFT).DL(POINT_SIZE(33)); |
Ksenia | 0:9db07391e780 | 139 | (*_TFT).DL(VERTEX2F((currentTemperature_X * accelerator + 15) * 16, (220 - currentTemperature_Y[currentTemperature_X]) * 16)); |
Ksenia | 0:9db07391e780 | 140 | (*_TFT).DL(END()); |
Ksenia | 0:9db07391e780 | 141 | |
Ksenia | 0:9db07391e780 | 142 | // write main title |
Ksenia | 0:9db07391e780 | 143 | (*_TFT).DL(COLOR_RGB(0, 0, 0)); |
Ksenia | 0:9db07391e780 | 144 | CreateStringRussian("Температура"); |
Ksenia | 0:9db07391e780 | 145 | (*_TFT).Text(15, 15, 3, 0, russianStr); |
Ksenia | 0:9db07391e780 | 146 | |
Ksenia | 0:9db07391e780 | 147 | // clean the space under the plot, create link to the main menu |
Ksenia | 0:9db07391e780 | 148 | (*_TFT).DL(SCISSOR_XY(15, 225)); |
Ksenia | 0:9db07391e780 | 149 | (*_TFT).DL(SCISSOR_SIZE(420, 53)); |
Ksenia | 0:9db07391e780 | 150 | (*_TFT).Gradient(0, 256, 0xFFFFFF, 450, 16, 0xFFFFFF); |
Ksenia | 0:9db07391e780 | 151 | MainMenuReference(); |
Ksenia | 0:9db07391e780 | 152 | |
Ksenia | 0:9db07391e780 | 153 | // finish FT800 display list |
Ksenia | 0:9db07391e780 | 154 | FinishDL(); |
Ksenia | 0:9db07391e780 | 155 | |
Ksenia | 0:9db07391e780 | 156 | if (currentTemperature_X >= 68) { |
Ksenia | 0:9db07391e780 | 157 | currentTemperature_X = 0; |
Ksenia | 0:9db07391e780 | 158 | } else { |
Ksenia | 0:9db07391e780 | 159 | currentTemperature_X ++; |
Ksenia | 0:9db07391e780 | 160 | } |
Ksenia | 0:9db07391e780 | 161 | if (pressedButton == MENU_PRESS) { |
Ksenia | 0:9db07391e780 | 162 | for (int i = 0; i < 68; i++) { |
Ksenia | 0:9db07391e780 | 163 | currentTemperature_Y[i] = 0; |
Ksenia | 0:9db07391e780 | 164 | currentTemperature_X = 0; |
Ksenia | 0:9db07391e780 | 165 | } |
Ksenia | 0:9db07391e780 | 166 | } |
Ksenia | 0:9db07391e780 | 167 | } |