Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный 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/
statistics.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 "statistics.h" |
Ksenia | 0:9db07391e780 | 2 | |
Ksenia | 0:9db07391e780 | 3 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 4 | ************************** Main function called every second ************************************************************** |
Ksenia | 0:9db07391e780 | 5 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 6 | uint64_t Statistics::UpdateStatistics(float humidity, float temperature, uint64_t seconds, uint64_t changeSecondsOffset) |
Ksenia | 0:9db07391e780 | 7 | { |
Ksenia | 0:9db07391e780 | 8 | short int secondsIn5min = (seconds % 300); // 0..299 |
Ksenia | 0:9db07391e780 | 9 | if (secondsIn5min == 0) { |
Ksenia | 0:9db07391e780 | 10 | changeSecondsOffset = Update24hrsData(changeSecondsOffset); |
Ksenia | 0:9db07391e780 | 11 | } |
Ksenia | 0:9db07391e780 | 12 | CalculateHumididty(humidity, secondsIn5min); |
Ksenia | 0:9db07391e780 | 13 | CalculateTemperature(temperature, secondsIn5min); |
Ksenia | 0:9db07391e780 | 14 | |
Ksenia | 0:9db07391e780 | 15 | // changeSecondsOffset is nessesary for changing time-grid if more then 24 hours left since devise was turned on |
Ksenia | 0:9db07391e780 | 16 | return changeSecondsOffset; |
Ksenia | 0:9db07391e780 | 17 | } |
Ksenia | 0:9db07391e780 | 18 | |
Ksenia | 0:9db07391e780 | 19 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 20 | ************************** Update average, minimum and maximum humidity in current five-minute interval **************** |
Ksenia | 0:9db07391e780 | 21 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 22 | void Statistics::CalculateHumididty(float humidity, short int secondsIn5min) |
Ksenia | 0:9db07391e780 | 23 | { |
Ksenia | 0:9db07391e780 | 24 | humidity5min[secondsIn5min] = humidity; |
Ksenia | 0:9db07391e780 | 25 | humidity5minSum += humidity5min[secondsIn5min]; |
Ksenia | 0:9db07391e780 | 26 | humidity5minAverage = humidity5minSum / (secondsIn5min + 1); |
Ksenia | 0:9db07391e780 | 27 | |
Ksenia | 0:9db07391e780 | 28 | if (humidity5min[secondsIn5min] > humidity5minMax || humidity5minMax == INIT_STATISTICS_NUMBER) { |
Ksenia | 0:9db07391e780 | 29 | humidity5minMax = humidity5min[secondsIn5min]; |
Ksenia | 0:9db07391e780 | 30 | } |
Ksenia | 0:9db07391e780 | 31 | if (humidity5min[secondsIn5min] < humidity5minMin || humidity5minMin == INIT_STATISTICS_NUMBER) { |
Ksenia | 0:9db07391e780 | 32 | humidity5minMin = humidity5min[secondsIn5min]; |
Ksenia | 0:9db07391e780 | 33 | } |
Ksenia | 0:9db07391e780 | 34 | } |
Ksenia | 0:9db07391e780 | 35 | |
Ksenia | 0:9db07391e780 | 36 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 37 | ************************** Update average, minimum and maximum temperature in current five-minute interval **************** |
Ksenia | 0:9db07391e780 | 38 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 39 | void Statistics::CalculateTemperature(float temperature, short int secondsIn5min) |
Ksenia | 0:9db07391e780 | 40 | { |
Ksenia | 0:9db07391e780 | 41 | // we use TEMPERATURE_MULTIPLIER = 10 for store temperatures tenths in integer values |
Ksenia | 0:9db07391e780 | 42 | temperature5min[secondsIn5min] = temperature * TEMPERATURE_MULTIPLIER; |
Ksenia | 0:9db07391e780 | 43 | temperature5minSum += temperature5min[secondsIn5min]; |
Ksenia | 0:9db07391e780 | 44 | temperature5minAverage = temperature5minSum / (secondsIn5min + 1); |
Ksenia | 0:9db07391e780 | 45 | |
Ksenia | 0:9db07391e780 | 46 | if (temperature5min[secondsIn5min] > temperature5minMax || temperature5minMax == INIT_STATISTICS_NUMBER) { |
Ksenia | 0:9db07391e780 | 47 | temperature5minMax = temperature5min[secondsIn5min]; |
Ksenia | 0:9db07391e780 | 48 | } |
Ksenia | 0:9db07391e780 | 49 | if (temperature5min[secondsIn5min] < temperature5minMin || temperature5minMin == INIT_STATISTICS_NUMBER) { |
Ksenia | 0:9db07391e780 | 50 | temperature5minMin = temperature5min[secondsIn5min]; |
Ksenia | 0:9db07391e780 | 51 | } |
Ksenia | 0:9db07391e780 | 52 | } |
Ksenia | 0:9db07391e780 | 53 | |
Ksenia | 0:9db07391e780 | 54 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 55 | ************************** Update humidity24hrs[][] and temperature24hrs[][] after each five-minute interval ************** |
Ksenia | 0:9db07391e780 | 56 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 57 | uint64_t Statistics::Update24hrsData(uint64_t changeSecondsOffset) |
Ksenia | 0:9db07391e780 | 58 | { |
Ksenia | 0:9db07391e780 | 59 | // after each five-minute interval we moving to next value if it's availiable |
Ksenia | 0:9db07391e780 | 60 | // OR shifting the entire array and update just last value if 24 hrs are already gone |
Ksenia | 0:9db07391e780 | 61 | if (Counter24hrs < 287) { |
Ksenia | 0:9db07391e780 | 62 | Counter24hrs ++; |
Ksenia | 0:9db07391e780 | 63 | } else { |
Ksenia | 0:9db07391e780 | 64 | for (int i = 0; i < 288; i++) { |
Ksenia | 0:9db07391e780 | 65 | humidity24hrs[0][i] = humidity24hrs[0][i + 1]; |
Ksenia | 0:9db07391e780 | 66 | humidity24hrs[1][i] = humidity24hrs[1][i + 1]; |
Ksenia | 0:9db07391e780 | 67 | humidity24hrs[2][i] = humidity24hrs[2][i + 1]; |
Ksenia | 0:9db07391e780 | 68 | temperature24hrs[0][i] = temperature24hrs[0][i + 1]; |
Ksenia | 0:9db07391e780 | 69 | temperature24hrs[1][i] = temperature24hrs[1][i + 1]; |
Ksenia | 0:9db07391e780 | 70 | temperature24hrs[2][i] = temperature24hrs[2][i + 1]; |
Ksenia | 0:9db07391e780 | 71 | } |
Ksenia | 0:9db07391e780 | 72 | Counter24hrs = 287; |
Ksenia | 0:9db07391e780 | 73 | changeSecondsOffset += 300; |
Ksenia | 0:9db07391e780 | 74 | } |
Ksenia | 0:9db07391e780 | 75 | |
Ksenia | 0:9db07391e780 | 76 | // update the current value |
Ksenia | 0:9db07391e780 | 77 | humidity24hrs[0][Counter24hrs] = humidity5minAverage; |
Ksenia | 0:9db07391e780 | 78 | humidity24hrs[1][Counter24hrs] = humidity5minMin; |
Ksenia | 0:9db07391e780 | 79 | humidity24hrs[2][Counter24hrs] = humidity5minMax; |
Ksenia | 0:9db07391e780 | 80 | temperature24hrs[0][Counter24hrs] = temperature5minAverage; |
Ksenia | 0:9db07391e780 | 81 | temperature24hrs[1][Counter24hrs] = temperature5minMin; |
Ksenia | 0:9db07391e780 | 82 | temperature24hrs[2][Counter24hrs] = temperature5minMax; |
Ksenia | 0:9db07391e780 | 83 | |
Ksenia | 0:9db07391e780 | 84 | // initialize all values using for calculations "inside" five-minute interval |
Ksenia | 0:9db07391e780 | 85 | for (int i = 0; i < 300; i++) { |
Ksenia | 0:9db07391e780 | 86 | humidity5min[i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 87 | temperature5min[i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 88 | } |
Ksenia | 0:9db07391e780 | 89 | humidity5minSum = 0; |
Ksenia | 0:9db07391e780 | 90 | humidity5minMax = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 91 | humidity5minMin = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 92 | temperature5minSum = 0; |
Ksenia | 0:9db07391e780 | 93 | temperature5minMax = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 94 | temperature5minMin = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 95 | |
Ksenia | 0:9db07391e780 | 96 | // changeSecondsOffset is nessesary for changing time-grid if more then 24 hours left since devise was turned on |
Ksenia | 0:9db07391e780 | 97 | return changeSecondsOffset; |
Ksenia | 0:9db07391e780 | 98 | } |
Ksenia | 0:9db07391e780 | 99 | |
Ksenia | 0:9db07391e780 | 100 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 101 | ************************** Initialization for all statistics values and arrays ******************************************** |
Ksenia | 0:9db07391e780 | 102 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 103 | void Statistics::InitValues(float humidity, float temperature) |
Ksenia | 0:9db07391e780 | 104 | { |
Ksenia | 0:9db07391e780 | 105 | for (int i = 0; i < 300; i++) { |
Ksenia | 0:9db07391e780 | 106 | humidity5min[i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 107 | temperature5min[i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 108 | } |
Ksenia | 0:9db07391e780 | 109 | for (int i = 0; i < 288; i++) { |
Ksenia | 0:9db07391e780 | 110 | humidity24hrs[0][i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 111 | humidity24hrs[1][i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 112 | humidity24hrs[2][i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 113 | temperature24hrs[0][i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 114 | temperature24hrs[1][i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 115 | temperature24hrs[2][i] = INIT_STATISTICS_NUMBER; |
Ksenia | 0:9db07391e780 | 116 | } |
Ksenia | 0:9db07391e780 | 117 | humidity5min[0] = humidity; |
Ksenia | 0:9db07391e780 | 118 | humidity5minMin = humidity; |
Ksenia | 0:9db07391e780 | 119 | humidity5minMax = humidity; |
Ksenia | 0:9db07391e780 | 120 | humidity24hrs[0][0] = humidity; |
Ksenia | 0:9db07391e780 | 121 | humidity24hrs[1][0] = humidity; |
Ksenia | 0:9db07391e780 | 122 | humidity24hrs[2][0] = humidity; |
Ksenia | 0:9db07391e780 | 123 | |
Ksenia | 0:9db07391e780 | 124 | temperature5min[0] = temperature * TEMPERATURE_MULTIPLIER; |
Ksenia | 0:9db07391e780 | 125 | temperature5minMin = temperature * TEMPERATURE_MULTIPLIER; |
Ksenia | 0:9db07391e780 | 126 | temperature5minMax = temperature * TEMPERATURE_MULTIPLIER; |
Ksenia | 0:9db07391e780 | 127 | temperature24hrs[0][0] = temperature * TEMPERATURE_MULTIPLIER; |
Ksenia | 0:9db07391e780 | 128 | temperature24hrs[1][0] = temperature * TEMPERATURE_MULTIPLIER; |
Ksenia | 0:9db07391e780 | 129 | temperature24hrs[2][0] = temperature * TEMPERATURE_MULTIPLIER; |
Ksenia | 0:9db07391e780 | 130 | |
Ksenia | 0:9db07391e780 | 131 | Counter24hrs = 0; |
Ksenia | 0:9db07391e780 | 132 | } |