Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный 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.StringsTransform.cpp@0:9db07391e780, 2016-10-07 (annotated)
- Committer:
- Ksenia
- Date:
- Fri Oct 07 11:03:16 2016 +0000
- Revision:
- 0:9db07391e780
- Child:
- 1:8ca8a4ecbe6b
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 | ************************** Transform humiditity / temperature float value to string *************************************** |
Ksenia | 0:9db07391e780 | 5 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 6 | // If isTemp = 0, resulting string includes |
Ksenia | 0:9db07391e780 | 7 | // 1. current humididty |
Ksenia | 0:9db07391e780 | 8 | // 3. " %" |
Ksenia | 0:9db07391e780 | 9 | |
Ksenia | 0:9db07391e780 | 10 | // If isTemp = 1, resulting string includes |
Ksenia | 0:9db07391e780 | 11 | // 1. "-" (optional), |
Ksenia | 0:9db07391e780 | 12 | // 2. current temperature with decimal mark |
Ksenia | 0:9db07391e780 | 13 | // 3. " С" |
Ksenia | 0:9db07391e780 | 14 | |
Ksenia | 0:9db07391e780 | 15 | // Returns offset using for placing degree sign |
Ksenia | 0:9db07391e780 | 16 | char Display::CreateStringTempHum(char *str, float number, bool isTemp) |
Ksenia | 0:9db07391e780 | 17 | { |
Ksenia | 0:9db07391e780 | 18 | char offsetForDegreeSign; |
Ksenia | 0:9db07391e780 | 19 | short int multipedNumber = (short int)(number * 100); |
Ksenia | 0:9db07391e780 | 20 | char strCnt = 0; |
Ksenia | 0:9db07391e780 | 21 | if (isTemp) { |
Ksenia | 0:9db07391e780 | 22 | if (multipedNumber < 0) { |
Ksenia | 0:9db07391e780 | 23 | multipedNumber = -multipedNumber; |
Ksenia | 0:9db07391e780 | 24 | str[strCnt] = '-'; |
Ksenia | 0:9db07391e780 | 25 | strCnt++; |
Ksenia | 0:9db07391e780 | 26 | } |
Ksenia | 0:9db07391e780 | 27 | } |
Ksenia | 0:9db07391e780 | 28 | if (multipedNumber >= 10000) { |
Ksenia | 0:9db07391e780 | 29 | str[strCnt] = '0' + (multipedNumber % 100000) / 10000; |
Ksenia | 0:9db07391e780 | 30 | strCnt++; |
Ksenia | 0:9db07391e780 | 31 | } |
Ksenia | 0:9db07391e780 | 32 | if (multipedNumber >= 1000) { |
Ksenia | 0:9db07391e780 | 33 | str[strCnt] = '0' + (multipedNumber % 10000) / 1000; |
Ksenia | 0:9db07391e780 | 34 | strCnt++; |
Ksenia | 0:9db07391e780 | 35 | } |
Ksenia | 0:9db07391e780 | 36 | if (multipedNumber >= 100) { |
Ksenia | 0:9db07391e780 | 37 | str[strCnt] = '0' + (multipedNumber % 1000) / 100; |
Ksenia | 0:9db07391e780 | 38 | strCnt++; |
Ksenia | 0:9db07391e780 | 39 | } |
Ksenia | 0:9db07391e780 | 40 | if (isTemp) { |
Ksenia | 0:9db07391e780 | 41 | str[strCnt] = '.'; |
Ksenia | 0:9db07391e780 | 42 | strCnt++; |
Ksenia | 0:9db07391e780 | 43 | str[strCnt] = '0' + (multipedNumber % 100) / 10; |
Ksenia | 0:9db07391e780 | 44 | strCnt++; |
Ksenia | 0:9db07391e780 | 45 | str[strCnt] = ' '; |
Ksenia | 0:9db07391e780 | 46 | strCnt++; |
Ksenia | 0:9db07391e780 | 47 | offsetForDegreeSign = strCnt; |
Ksenia | 0:9db07391e780 | 48 | str[strCnt] = 'C'; |
Ksenia | 0:9db07391e780 | 49 | strCnt++; |
Ksenia | 0:9db07391e780 | 50 | } else { |
Ksenia | 0:9db07391e780 | 51 | str[strCnt] = '%'; |
Ksenia | 0:9db07391e780 | 52 | strCnt++; |
Ksenia | 0:9db07391e780 | 53 | } |
Ksenia | 0:9db07391e780 | 54 | str[strCnt] = 0; |
Ksenia | 0:9db07391e780 | 55 | |
Ksenia | 0:9db07391e780 | 56 | return offsetForDegreeSign; |
Ksenia | 0:9db07391e780 | 57 | } |
Ksenia | 0:9db07391e780 | 58 | |
Ksenia | 0:9db07391e780 | 59 | |
Ksenia | 0:9db07391e780 | 60 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 61 | ************************** Transform multiplied temperature value to string *********************************************** |
Ksenia | 0:9db07391e780 | 62 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 63 | // Resulting string includes |
Ksenia | 0:9db07391e780 | 64 | // 1. "-" (optional), |
Ksenia | 0:9db07391e780 | 65 | // 2. current temperature with decimal mark |
Ksenia | 0:9db07391e780 | 66 | void Display::CreateStringMultipliedTemp(char *str, short int number) |
Ksenia | 0:9db07391e780 | 67 | { |
Ksenia | 0:9db07391e780 | 68 | char strCnt = 0; |
Ksenia | 0:9db07391e780 | 69 | if (number < 0) { |
Ksenia | 0:9db07391e780 | 70 | number = -number; |
Ksenia | 0:9db07391e780 | 71 | str[strCnt] = '-'; |
Ksenia | 0:9db07391e780 | 72 | strCnt++; |
Ksenia | 0:9db07391e780 | 73 | } |
Ksenia | 0:9db07391e780 | 74 | if (number >= 1000) { |
Ksenia | 0:9db07391e780 | 75 | str[strCnt] = '0' + (number % 10000) / 1000; |
Ksenia | 0:9db07391e780 | 76 | strCnt++; |
Ksenia | 0:9db07391e780 | 77 | } |
Ksenia | 0:9db07391e780 | 78 | if (number >= 100) { |
Ksenia | 0:9db07391e780 | 79 | str[strCnt] = '0' + (number % 1000) / 100; |
Ksenia | 0:9db07391e780 | 80 | strCnt++; |
Ksenia | 0:9db07391e780 | 81 | } |
Ksenia | 0:9db07391e780 | 82 | if (number >= 10) { |
Ksenia | 0:9db07391e780 | 83 | str[strCnt] = '0' + (number % 100) / 10; |
Ksenia | 0:9db07391e780 | 84 | strCnt++; |
Ksenia | 0:9db07391e780 | 85 | } |
Ksenia | 0:9db07391e780 | 86 | str[strCnt] = '.'; |
Ksenia | 0:9db07391e780 | 87 | strCnt++; |
Ksenia | 0:9db07391e780 | 88 | str[strCnt] = '0' + (number % 100) / 10; |
Ksenia | 0:9db07391e780 | 89 | strCnt++; |
Ksenia | 0:9db07391e780 | 90 | str[strCnt] = 0; |
Ksenia | 0:9db07391e780 | 91 | } |
Ksenia | 0:9db07391e780 | 92 | |
Ksenia | 0:9db07391e780 | 93 | |
Ksenia | 0:9db07391e780 | 94 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 95 | ************************** Transform number of seconds to HH:MM:SS string ************************************************* |
Ksenia | 0:9db07391e780 | 96 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 97 | void Display::CreateStringTime(char *str, uint32_t numberOfSeconds) |
Ksenia | 0:9db07391e780 | 98 | { |
Ksenia | 0:9db07391e780 | 99 | char hrs = (numberOfSeconds / 3600); |
Ksenia | 0:9db07391e780 | 100 | if (hrs < 10) { |
Ksenia | 0:9db07391e780 | 101 | str[0] = '0'; |
Ksenia | 0:9db07391e780 | 102 | } else { |
Ksenia | 0:9db07391e780 | 103 | str[0] = '0' + hrs / 10; |
Ksenia | 0:9db07391e780 | 104 | } |
Ksenia | 0:9db07391e780 | 105 | str[1] = '0' + hrs % 10; |
Ksenia | 0:9db07391e780 | 106 | str[2] = ':'; |
Ksenia | 0:9db07391e780 | 107 | char minutes = (numberOfSeconds / 60) % 60; |
Ksenia | 0:9db07391e780 | 108 | if (minutes < 10) { |
Ksenia | 0:9db07391e780 | 109 | str[3] = '0'; |
Ksenia | 0:9db07391e780 | 110 | } else { |
Ksenia | 0:9db07391e780 | 111 | str[3] = '0' + minutes / 10; |
Ksenia | 0:9db07391e780 | 112 | } |
Ksenia | 0:9db07391e780 | 113 | str[4] = '0' + minutes % 10; |
Ksenia | 0:9db07391e780 | 114 | str[5] = ':'; |
Ksenia | 0:9db07391e780 | 115 | char sec = numberOfSeconds % 60; |
Ksenia | 0:9db07391e780 | 116 | if (sec < 10) { |
Ksenia | 0:9db07391e780 | 117 | str[6] = '0'; |
Ksenia | 0:9db07391e780 | 118 | } else { |
Ksenia | 0:9db07391e780 | 119 | str[6] = '0' + sec / 10; |
Ksenia | 0:9db07391e780 | 120 | } |
Ksenia | 0:9db07391e780 | 121 | str[7] = '0' + sec % 10; |
Ksenia | 0:9db07391e780 | 122 | str[8] = 0; |
Ksenia | 0:9db07391e780 | 123 | } |
Ksenia | 0:9db07391e780 | 124 | |
Ksenia | 0:9db07391e780 | 125 | void Display::CreateStringRussian(const string rustext) |
Ksenia | 0:9db07391e780 | 126 | { |
Ksenia | 0:9db07391e780 | 127 | // CHANGED ASCII: |
Ksenia | 0:9db07391e780 | 128 | // 0123456789АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюя .,:-°±%<>rHYTICS |
Ksenia | 0:9db07391e780 | 129 | int len = rustext.length(); |
Ksenia | 0:9db07391e780 | 130 | int j = 0; |
Ksenia | 0:9db07391e780 | 131 | for (int i = 0; i < len; i ++) { |
Ksenia | 0:9db07391e780 | 132 | uint16_t res = uint8_t(rustext[i]); |
Ksenia | 0:9db07391e780 | 133 | if (res > 0x7F) { |
Ksenia | 0:9db07391e780 | 134 | res = res << 8 | uint8_t(rustext[i + 1]); |
Ksenia | 0:9db07391e780 | 135 | // АБВ ... ноп |
Ksenia | 0:9db07391e780 | 136 | if ((res >= 0xD090) && (res <= 0xD0BF)) { |
Ksenia | 0:9db07391e780 | 137 | char offset = (char)(res - 0xD090); |
Ksenia | 0:9db07391e780 | 138 | russianStr[j] = offset + 32 + 11; |
Ksenia | 0:9db07391e780 | 139 | // рст ... эюя |
Ksenia | 0:9db07391e780 | 140 | } else if ((res >= 0xD180) && (res <= 0xD18F)) { |
Ksenia | 0:9db07391e780 | 141 | char offset = (char)(res - 0xD180); |
Ksenia | 0:9db07391e780 | 142 | russianStr[j] = offset + 32 + 59; |
Ksenia | 0:9db07391e780 | 143 | } |
Ksenia | 0:9db07391e780 | 144 | // Degree sign |
Ksenia | 0:9db07391e780 | 145 | else if (res == 0xC2B0) { |
Ksenia | 0:9db07391e780 | 146 | russianStr[j] = 80 + 32; |
Ksenia | 0:9db07391e780 | 147 | } |
Ksenia | 0:9db07391e780 | 148 | // Plus-minus sign |
Ksenia | 0:9db07391e780 | 149 | else if (res == 0xC2B1) { |
Ksenia | 0:9db07391e780 | 150 | russianStr[j] = 81 + 32; |
Ksenia | 0:9db07391e780 | 151 | } |
Ksenia | 0:9db07391e780 | 152 | i++; |
Ksenia | 0:9db07391e780 | 153 | } else { |
Ksenia | 0:9db07391e780 | 154 | // Numbers |
Ksenia | 0:9db07391e780 | 155 | if (res >= 0x30 && res <= 0x39) { |
Ksenia | 0:9db07391e780 | 156 | russianStr[j] = (res - 0x30) + 1 + 32; |
Ksenia | 0:9db07391e780 | 157 | } |
Ksenia | 0:9db07391e780 | 158 | // Space |
Ksenia | 0:9db07391e780 | 159 | else if (res == 0x20) { |
Ksenia | 0:9db07391e780 | 160 | russianStr[j] = 75 + 32; |
Ksenia | 0:9db07391e780 | 161 | } |
Ksenia | 0:9db07391e780 | 162 | // Dot |
Ksenia | 0:9db07391e780 | 163 | else if (res == 0x2E) { |
Ksenia | 0:9db07391e780 | 164 | russianStr[j] = 76 + 32; |
Ksenia | 0:9db07391e780 | 165 | } |
Ksenia | 0:9db07391e780 | 166 | // Coma |
Ksenia | 0:9db07391e780 | 167 | else if (res == 0x2C) { |
Ksenia | 0:9db07391e780 | 168 | russianStr[j] = 77 + 32; |
Ksenia | 0:9db07391e780 | 169 | } |
Ksenia | 0:9db07391e780 | 170 | // : |
Ksenia | 0:9db07391e780 | 171 | else if (res == 0x3A) { |
Ksenia | 0:9db07391e780 | 172 | russianStr[j] = 78 + 32; |
Ksenia | 0:9db07391e780 | 173 | } |
Ksenia | 0:9db07391e780 | 174 | // % |
Ksenia | 0:9db07391e780 | 175 | else if (res == 0x25) { |
Ksenia | 0:9db07391e780 | 176 | russianStr[j] = 82 + 32; |
Ksenia | 0:9db07391e780 | 177 | } |
Ksenia | 0:9db07391e780 | 178 | // < |
Ksenia | 0:9db07391e780 | 179 | else if (res == 0x3C) { |
Ksenia | 0:9db07391e780 | 180 | russianStr[j] = 83 + 32; |
Ksenia | 0:9db07391e780 | 181 | } |
Ksenia | 0:9db07391e780 | 182 | // Hyphen / minus |
Ksenia | 0:9db07391e780 | 183 | else if (res == 0x2D) { |
Ksenia | 0:9db07391e780 | 184 | russianStr[j] = 79 + 32; |
Ksenia | 0:9db07391e780 | 185 | } |
Ksenia | 0:9db07391e780 | 186 | // "r" |
Ksenia | 0:9db07391e780 | 187 | else if (res == 0x72) { |
Ksenia | 0:9db07391e780 | 188 | russianStr[j] = 85 + 32; |
Ksenia | 0:9db07391e780 | 189 | } |
Ksenia | 0:9db07391e780 | 190 | // "H" |
Ksenia | 0:9db07391e780 | 191 | else if (res == 0x48) { |
Ksenia | 0:9db07391e780 | 192 | russianStr[j] = 86 + 32; |
Ksenia | 0:9db07391e780 | 193 | } |
Ksenia | 0:9db07391e780 | 194 | // "Y" |
Ksenia | 0:9db07391e780 | 195 | else if (res == 0x59) { |
Ksenia | 0:9db07391e780 | 196 | russianStr[j] = 87 + 32; |
Ksenia | 0:9db07391e780 | 197 | } |
Ksenia | 0:9db07391e780 | 198 | // "T" |
Ksenia | 0:9db07391e780 | 199 | else if (res == 0x54) { |
Ksenia | 0:9db07391e780 | 200 | russianStr[j] = 88 + 32; |
Ksenia | 0:9db07391e780 | 201 | } |
Ksenia | 0:9db07391e780 | 202 | // "I" |
Ksenia | 0:9db07391e780 | 203 | else if (res == 0x49) { |
Ksenia | 0:9db07391e780 | 204 | russianStr[j] = 89 + 32; |
Ksenia | 0:9db07391e780 | 205 | } |
Ksenia | 0:9db07391e780 | 206 | // "C" |
Ksenia | 0:9db07391e780 | 207 | else if (res == 0x43) { |
Ksenia | 0:9db07391e780 | 208 | russianStr[j] = 90 + 32; |
Ksenia | 0:9db07391e780 | 209 | } |
Ksenia | 0:9db07391e780 | 210 | // "S" |
Ksenia | 0:9db07391e780 | 211 | else if (res == 0x53) { |
Ksenia | 0:9db07391e780 | 212 | russianStr[j] = 91 + 32; |
Ksenia | 0:9db07391e780 | 213 | } |
Ksenia | 0:9db07391e780 | 214 | } |
Ksenia | 0:9db07391e780 | 215 | j++; |
Ksenia | 0:9db07391e780 | 216 | } |
Ksenia | 0:9db07391e780 | 217 | russianStr[j] = 0; |
Ksenia | 0:9db07391e780 | 218 | } |