Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| products:laboratory_iot:exp70 [2020/06/15 16:50] – labuser29 | products:laboratory_iot:exp70 [2024/12/17 18:15] (текущий) – [Программный код эксперимента] labuser30 | ||
|---|---|---|---|
| Строка 5: | Строка 5: | ||
| Но эти данные приходят в виде удобном для программы, | Но эти данные приходят в виде удобном для программы, | ||
| - | Отображать данные мы будем на TFT дисплее, | + | Для отображения иконок погоды и пользовательского интерфейса их нужно загрузить во внутреннюю память микроконтроллера. Для этого нужно создать папку '' |
| + | |||
| + | <WRAP center round download 60%> | ||
| + | {{ : | ||
| + | </ | ||
| + | |||
| + | |||
| + | Отображать данные мы будем на TFT дисплее, | ||
| ==== Схема эксперимента ==== | ==== Схема эксперимента ==== | ||
| {{ : | {{ : | ||
| - | // | + | // |
| + | |||
| + | {{ : | ||
| + | // | ||
| + | ==== Программный код эксперимента ==== | ||
| + | |||
| + | <file python Exp70.py[enable_line_numbers=" | ||
| + | from machine import Pin, SPI | ||
| + | from tft import TFT_GREEN | ||
| + | import font | ||
| + | import network | ||
| + | import gc | ||
| + | import time | ||
| + | import socket | ||
| + | |||
| + | _init() | ||
| + | gc.collect() | ||
| + | |||
| + | dc = Pin(4, Pin.OUT) | ||
| + | cs = Pin(2, Pin.OUT) | ||
| + | rst = Pin(5, Pin.OUT) | ||
| + | |||
| + | |||
| + | spi = SPI(1, baudrate=40000000, | ||
| + | tft = TFT_GREEN(128, | ||
| + | tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, | ||
| + | |||
| + | |||
| + | data = {' | ||
| + | |||
| + | wCity = data[' | ||
| + | wTemp = round(data[' | ||
| + | wTempFeels = data[' | ||
| + | wHumidity = data[' | ||
| + | wWind = data[' | ||
| + | |||
| + | pod = data[' | ||
| + | |||
| + | wCode = int(data[' | ||
| + | |||
| + | if wCode <= 233: | ||
| + | wPic = ' | ||
| + | elif (wCode >= 300 and wCode <= 520) or wCode == 522: | ||
| + | wPic = ' | ||
| + | elif wCode in (521, 600): | ||
| + | wPic = ' | ||
| + | elif wCode >= 601 and wCode <= 622: | ||
| + | wPic = ' | ||
| + | elif wCode >= 623 and wCode <= 751: | ||
| + | wPic = ' | ||
| + | elif wCode == 800: | ||
| + | wPic = ' | ||
| + | elif wCode in (801, 802): | ||
| + | wPic = ' | ||
| + | elif wCode == 803: | ||
| + | wPic = ' | ||
| + | elif wCode == 804: | ||
| + | wPic = ' | ||
| + | |||
| + | if (wTemp > 0): | ||
| + | wTempPic = ' | ||
| + | else: | ||
| + | wTempPic = ' | ||
| + | |||
| + | FontColor = tft.rgbcolor(33, | ||
| + | FontColor2 = tft.rgbcolor(8, | ||
| + | |||
| + | |||
| + | tft.clear(tft.rgbcolor(255, | ||
| + | |||
| + | |||
| + | tft.text(1, | ||
| + | |||
| + | tft.draw_bmp(34, | ||
| + | tft.draw_bmp(5, | ||
| + | |||
| + | tft.text(30, | ||
| + | |||
| + | tft.text(5, | ||
| + | tft.text(5, | ||
| + | tft.text(5, | ||
| + | </ | ||
| + | |||
| + | В этой программе мы сосредоточились на создании GUI — графического интерфейса пользователя, | ||
| + | |||
| + | Первым делом извлекаем из структуры нужные нам данные. А именно: | ||
| + | |||
| + | Название города записываем в переменную wCity | ||
| + | <code python[enable_line_numbers=" | ||
| + | wCity = data[' | ||
| + | </ | ||
| + | |||
| + | Текущую температуру записываем в переменную wTemp | ||
| + | <code python[enable_line_numbers=" | ||
| + | wTemp = round(data[' | ||
| + | </ | ||
| + | |||
| + | Ощущение температуры записываем в переменную wTempFeels. (например из-за ветра или влажности температура может ощущаться человеком как более низкая, | ||
| + | <code python[enable_line_numbers=" | ||
| + | wTempFeels = data[' | ||
| + | </ | ||
| + | |||
| + | Влажность в % записываем в переменную wHumidity | ||
| + | <code python[enable_line_numbers=" | ||
| + | wHumidity = data[' | ||
| + | </ | ||
| + | |||
| + | Скорость ветра в метрах в секунду записываем в переменную wWind | ||
| + | <code python[enable_line_numbers=" | ||
| + | wWind = data[' | ||
| + | </ | ||
| + | |||
| + | Текущее время суток записываем в переменную pod. Если сейчас день, то в ней будет значение d, а если ночь — n. Эти данные нам понадобятся для выбора правильной иконки погоды. Например, | ||
| + | <code python[enable_line_numbers=" | ||
| + | pod = data[' | ||
| + | </ | ||
| + | |||
| + | Сервис weatherbit.io среди прочих данных о погоде сообщает код текущей погоды. Это коды, которые используются именно этим сервисом. По ним можно понять какую иконку погоды нужно отобразить. [[https:// | ||
| + | <code python[enable_line_numbers=" | ||
| + | wCode = int(data[' | ||
| + | </ | ||
| + | |||
| + | Сервис поддерживает очень большое количество иконок у нас столько нет. У нас всего 18 погодных иконок — 9 дневных и 9 ночных. Поэтому нам нужно настроить соответствие кодов из сервиса нашим иконкам. Например несколько видов дождя, которые обозначаются разными кодами, | ||
| + | <code python[enable_line_numbers=" | ||
| + | if wCode <= 233: | ||
| + | wPic = ' | ||
| + | elif (wCode >= 300 and wCode <= 520) or wCode == 522: | ||
| + | wPic = ' | ||
| + | elif wCode in (521, 600): | ||
| + | wPic = ' | ||
| + | elif wCode >= 601 and wCode <= 622: | ||
| + | wPic = ' | ||
| + | elif wCode >= 623 and wCode <= 751: | ||
| + | wPic = ' | ||
| + | elif wCode == 800: | ||
| + | wPic = ' | ||
| + | elif wCode in (801, 802): | ||
| + | wPic = ' | ||
| + | elif wCode == 803: | ||
| + | wPic = ' | ||
| + | elif wCode == 804: | ||
| + | wPic = ' | ||
| + | </ | ||
| + | |||
| + | Для отображения иконки термометра на дисплее нужно определить положительная сейчас температура или отрицательная. Если температура ниже нуля, то будем отображать " | ||
| + | |||
| + | <code python[enable_line_numbers=" | ||
| + | if (wTemp > 0): | ||
| + | wTempPic = ' | ||
| + | else: | ||
| + | wTempPic = ' | ||
| + | </ | ||
| + | |||
| + | Определяем цвета для шрифтов. Один из них будет использоваться для отображения названия города и температуры, | ||
| + | <code python[enable_line_numbers=" | ||
| + | FontColor = tft.rgbcolor(33, | ||
| + | FontColor2 = tft.rgbcolor(8, | ||
| + | </ | ||
| + | |||
| + | Закрашиваем весь дисплей белым | ||
| + | <code python[enable_line_numbers=" | ||
| + | tft.clear(tft.rgbcolor(255, | ||
| + | </ | ||
| + | |||
| + | |||
| + | Выводим на дисплей название города | ||
| + | <code python[enable_line_numbers=" | ||
| + | tft.text(1, | ||
| + | </ | ||
| + | |||
| + | Рисуем иконки: | ||
| + | <code python[enable_line_numbers=" | ||
| + | tft.draw_bmp(34, | ||
| + | tft.draw_bmp(5, | ||
| + | </ | ||
| + | |||
| + | Выводим текущую температуру | ||
| + | <code python[enable_line_numbers=" | ||
| + | tft.text(30, | ||
| + | </ | ||
| + | Выводим дополнительные данные: | ||
| + | <code python[enable_line_numbers=" | ||
| + | tft.text(5, | ||
| + | tft.text(5, | ||
| + | tft.text(5, | ||
| + | </ | ||