Русифицированная версия программы для измерения температуры и отн. влажности и вывода информации на сенсорный 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/
main.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 "mbed.h" |
Ksenia | 0:9db07391e780 | 2 | #include "FT_Platform.h" |
Ksenia | 0:9db07391e780 | 3 | #include "HYT.h" |
Ksenia | 0:9db07391e780 | 4 | #include "display.h" |
Ksenia | 0:9db07391e780 | 5 | #include "statistics.h" |
Ksenia | 0:9db07391e780 | 6 | |
Ksenia | 0:9db07391e780 | 7 | Ticker timeKeeping; |
Ksenia | 0:9db07391e780 | 8 | volatile uint64_t seconds = 0; |
Ksenia | 0:9db07391e780 | 9 | uint64_t secondsOffset = 0; |
Ksenia | 0:9db07391e780 | 10 | |
Ksenia | 0:9db07391e780 | 11 | HYT SENSOR (PD6, PD7); // sda, scl [SLSTK3400A] |
Ksenia | 0:9db07391e780 | 12 | FT800 TFT (PE10, PE11, PE12, PE13, PB11, PD4); // mosi, miso, sck, ss, int, pd [SLSTK3400A] |
Ksenia | 0:9db07391e780 | 13 | //HYT SENSOR (D14, D15); // sda, scl [WIZwiki-W7500P] |
Ksenia | 0:9db07391e780 | 14 | //FT800 TFT (D11, D12, D13, D10, D9, D8); // mosi, miso, sck, ss, int, pd [WIZwiki-W7500P] |
Ksenia | 0:9db07391e780 | 15 | //HYT SENSOR (PA08, PA09); // sda, scl [ATSAMD21-XPRO] |
Ksenia | 0:9db07391e780 | 16 | //FT800 TFT (PA18, PA16, PA19, PA17, PA20, PA21); // mosi, miso, sck, ss, int, pd [ATSAMD21-XPRO] |
Ksenia | 0:9db07391e780 | 17 | |
Ksenia | 0:9db07391e780 | 18 | Display disp(&TFT); |
Ksenia | 0:9db07391e780 | 19 | Statistics stat; |
Ksenia | 0:9db07391e780 | 20 | |
Ksenia | 0:9db07391e780 | 21 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 22 | ************************** Update statistics data every second ************************************************************ |
Ksenia | 0:9db07391e780 | 23 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 24 | void secondsCallback(void) |
Ksenia | 0:9db07391e780 | 25 | { |
Ksenia | 0:9db07391e780 | 26 | if (seconds != 0) { |
Ksenia | 0:9db07391e780 | 27 | secondsOffset = stat.UpdateStatistics(SENSOR.humidity, SENSOR.temperature, seconds, secondsOffset); |
Ksenia | 0:9db07391e780 | 28 | } else { |
Ksenia | 0:9db07391e780 | 29 | stat.InitValues(SENSOR.humidity, SENSOR.temperature); |
Ksenia | 0:9db07391e780 | 30 | } |
Ksenia | 0:9db07391e780 | 31 | seconds ++; |
Ksenia | 0:9db07391e780 | 32 | } |
Ksenia | 0:9db07391e780 | 33 | |
Ksenia | 0:9db07391e780 | 34 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 35 | ************************** HYT sensor polling cycle *********************************************************************** |
Ksenia | 0:9db07391e780 | 36 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 37 | void dataUpdate(void) |
Ksenia | 0:9db07391e780 | 38 | { |
Ksenia | 0:9db07391e780 | 39 | SENSOR.MRCommand(); |
Ksenia | 0:9db07391e780 | 40 | wait_ms(100); |
Ksenia | 0:9db07391e780 | 41 | SENSOR.DFCommand(); |
Ksenia | 0:9db07391e780 | 42 | } |
Ksenia | 0:9db07391e780 | 43 | |
Ksenia | 0:9db07391e780 | 44 | /************************************************************************************************************************** |
Ksenia | 0:9db07391e780 | 45 | ************************** Main function ********************************************************************************** |
Ksenia | 0:9db07391e780 | 46 | **************************************************************************************************************************/ |
Ksenia | 0:9db07391e780 | 47 | int main() |
Ksenia | 0:9db07391e780 | 48 | { |
Ksenia | 0:9db07391e780 | 49 | timeKeeping.attach(&secondsCallback, 1.0f); |
Ksenia | 0:9db07391e780 | 50 | |
Ksenia | 0:9db07391e780 | 51 | disp.LoadImagesAndFonts(); |
Ksenia | 0:9db07391e780 | 52 | disp.HandleAllBitmaps(); |
Ksenia | 0:9db07391e780 | 53 | disp.Calibration(); |
Ksenia | 0:9db07391e780 | 54 | |
Ksenia | 0:9db07391e780 | 55 | disp.activeScreen = MENU_SCREEN; |
Ksenia | 0:9db07391e780 | 56 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 57 | |
Ksenia | 0:9db07391e780 | 58 | // change active screen depending on pressed area |
Ksenia | 0:9db07391e780 | 59 | while(1) { |
Ksenia | 0:9db07391e780 | 60 | dataUpdate(); |
Ksenia | 0:9db07391e780 | 61 | disp.pressedButton = disp.GetTouch(); |
Ksenia | 0:9db07391e780 | 62 | |
Ksenia | 0:9db07391e780 | 63 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 64 | // Main menu screen |
Ksenia | 0:9db07391e780 | 65 | if (disp.activeScreen == MENU_SCREEN) { |
Ksenia | 0:9db07391e780 | 66 | disp.MainMenu(SENSOR.humidity, SENSOR.temperature); |
Ksenia | 0:9db07391e780 | 67 | if (disp.pressedButton) { |
Ksenia | 0:9db07391e780 | 68 | wait_ms(150); |
Ksenia | 0:9db07391e780 | 69 | if (disp.pressedButton == CURR_TEMP_PRESS) { |
Ksenia | 0:9db07391e780 | 70 | disp.activeScreen = CURR_TEMP_SCREEN; |
Ksenia | 0:9db07391e780 | 71 | } else if (disp.pressedButton == CURR_HUM_PRESS) { |
Ksenia | 0:9db07391e780 | 72 | disp.activeScreen = CURR_HUM_SCREEN; |
Ksenia | 0:9db07391e780 | 73 | } else if (disp.pressedButton == STAT_HUM_PRESS) { |
Ksenia | 0:9db07391e780 | 74 | disp.activeScreen = HUM_24HRS_SCREEN; |
Ksenia | 0:9db07391e780 | 75 | } else if (disp.pressedButton == STAT_TEMP_PRESS) { |
Ksenia | 0:9db07391e780 | 76 | disp.activeScreen = TEMP_24HRS_SCREEN; |
Ksenia | 0:9db07391e780 | 77 | } else if (disp.pressedButton == ABOUT_PRESS) { |
Ksenia | 0:9db07391e780 | 78 | disp.activeScreen = ABOUT_SCREEN; |
Ksenia | 0:9db07391e780 | 79 | } |
Ksenia | 0:9db07391e780 | 80 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 81 | } |
Ksenia | 0:9db07391e780 | 82 | |
Ksenia | 0:9db07391e780 | 83 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 84 | // Any other screen |
Ksenia | 0:9db07391e780 | 85 | } else { |
Ksenia | 0:9db07391e780 | 86 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 87 | // You can back to main menu from any screen |
Ksenia | 0:9db07391e780 | 88 | if (disp.pressedButton == MENU_PRESS) { |
Ksenia | 0:9db07391e780 | 89 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 90 | disp.activeScreen = MENU_SCREEN; |
Ksenia | 0:9db07391e780 | 91 | } else { |
Ksenia | 0:9db07391e780 | 92 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 93 | // Screen with current temperature |
Ksenia | 0:9db07391e780 | 94 | if (disp.activeScreen == CURR_TEMP_SCREEN) { |
Ksenia | 0:9db07391e780 | 95 | disp.CurrentTemperature(SENSOR.temperature); |
Ksenia | 0:9db07391e780 | 96 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 97 | // Screen with current humidity |
Ksenia | 0:9db07391e780 | 98 | } else if (disp.activeScreen == CURR_HUM_SCREEN) { |
Ksenia | 0:9db07391e780 | 99 | disp.CurrentHumidity(SENSOR.humidity); |
Ksenia | 0:9db07391e780 | 100 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 101 | // Screens with humidity statistics |
Ksenia | 0:9db07391e780 | 102 | } else if (disp.activeScreen == HUM_24HRS_SCREEN) { |
Ksenia | 0:9db07391e780 | 103 | disp.StatHumidity_24hrs(seconds, stat.humidity24hrs, secondsOffset); |
Ksenia | 0:9db07391e780 | 104 | if (disp.pressedButton >= ZONE_1_PRESS && disp.pressedButton <= ZONE_8_PRESS) { |
Ksenia | 0:9db07391e780 | 105 | wait_ms(150); |
Ksenia | 0:9db07391e780 | 106 | disp.activeScreen = HUM_3HRS_SCREEN; |
Ksenia | 0:9db07391e780 | 107 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 108 | } |
Ksenia | 0:9db07391e780 | 109 | } else if (disp.activeScreen == HUM_3HRS_SCREEN) { |
Ksenia | 0:9db07391e780 | 110 | disp.StatHumidity_3hrs(seconds, stat.humidity24hrs, secondsOffset); |
Ksenia | 0:9db07391e780 | 111 | if (disp.pressedButton >= ZONE_1_PRESS && disp.pressedButton <= ZONE_6_PRESS) { |
Ksenia | 0:9db07391e780 | 112 | wait_ms(150); |
Ksenia | 0:9db07391e780 | 113 | disp.activeScreen = HUM_30MIN_SCREEN; |
Ksenia | 0:9db07391e780 | 114 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 115 | } |
Ksenia | 0:9db07391e780 | 116 | } else if (disp.activeScreen == HUM_30MIN_SCREEN) { |
Ksenia | 0:9db07391e780 | 117 | disp.StatHumidity_30min(seconds, stat.humidity24hrs, secondsOffset); |
Ksenia | 0:9db07391e780 | 118 | if (disp.pressedButton == STAT_HUM_PRESS) { |
Ksenia | 0:9db07391e780 | 119 | disp.activeScreen = HUM_24HRS_SCREEN; |
Ksenia | 0:9db07391e780 | 120 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 121 | } |
Ksenia | 0:9db07391e780 | 122 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 123 | // Screens with humidity statistics |
Ksenia | 0:9db07391e780 | 124 | } else if (disp.activeScreen == TEMP_24HRS_SCREEN) { |
Ksenia | 0:9db07391e780 | 125 | disp.StatTemperature_24hrs(seconds, stat.temperature24hrs, secondsOffset); |
Ksenia | 0:9db07391e780 | 126 | if (disp.pressedButton >= ZONE_1_PRESS && disp.pressedButton <= ZONE_8_PRESS) { |
Ksenia | 0:9db07391e780 | 127 | wait_ms(150); |
Ksenia | 0:9db07391e780 | 128 | disp.activeScreen = TEMP_3HRS_SCREEN; |
Ksenia | 0:9db07391e780 | 129 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 130 | } |
Ksenia | 0:9db07391e780 | 131 | } else if (disp.activeScreen == TEMP_3HRS_SCREEN) { |
Ksenia | 0:9db07391e780 | 132 | disp.StatTemperature_3hrs(seconds, stat.temperature24hrs, secondsOffset); |
Ksenia | 0:9db07391e780 | 133 | if (disp.pressedButton >= ZONE_1_PRESS && disp.pressedButton <= ZONE_6_PRESS) { |
Ksenia | 0:9db07391e780 | 134 | wait_ms(150); |
Ksenia | 0:9db07391e780 | 135 | disp.activeScreen = TEMP_30MIN_SCREEN; |
Ksenia | 0:9db07391e780 | 136 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 137 | } |
Ksenia | 0:9db07391e780 | 138 | } else if (disp.activeScreen == TEMP_30MIN_SCREEN) { |
Ksenia | 0:9db07391e780 | 139 | disp.StatTemperature_30min(seconds, stat.temperature24hrs, secondsOffset); |
Ksenia | 0:9db07391e780 | 140 | if (disp.pressedButton == STAT_TEMP_PRESS) { |
Ksenia | 0:9db07391e780 | 141 | disp.activeScreen = TEMP_24HRS_SCREEN; |
Ksenia | 0:9db07391e780 | 142 | disp.pressedButton = NONE_PRESS; |
Ksenia | 0:9db07391e780 | 143 | } |
Ksenia | 0:9db07391e780 | 144 | // ---------------------------------------------------------------------------------------------- |
Ksenia | 0:9db07391e780 | 145 | // Screens with information about sensor |
Ksenia | 0:9db07391e780 | 146 | } else if (disp.activeScreen == ABOUT_SCREEN) { |
Ksenia | 0:9db07391e780 | 147 | disp.AboutSensor(); |
Ksenia | 0:9db07391e780 | 148 | } |
Ksenia | 0:9db07391e780 | 149 | } |
Ksenia | 0:9db07391e780 | 150 | } |
Ksenia | 0:9db07391e780 | 151 | } |
Ksenia | 0:9db07391e780 | 152 | } |