Эксперимент 71. Метеостанция

В прошлых экспериментах мы научились подключаться к беспроводной сети Wi-Fi, запрашивать данные о текущей погоде с веб-сервиса weatherbit.io и отображать красивый пользовательский интерфейс. Теперь соединим воедино эти достижения, чтобы получить полноценную погодную станцию.

Схема эксперимента

Схема эксперимента не изменилась по сравнению с предыдущей

Рисунок 1. Монтажная схема эксперимента с 8 выводами

Рисунок 2. Монтажная схема эксперимента с 11 выводами

Программный код эксперимента

Exp71.py
  1. from machine import Pin, SPI
  2. from tft import TFT_GREEN
  3. import font
  4. import network
  5. import gc
  6. import time
  7. import socket
  8. import json
  9. _init()
  10. gc.collect()
  11.  
  12. wlan_id = "Your_Wi-Fi"
  13. wlan_pass = "Your_Wi-Fi_Password"
  14.  
  15. dc = Pin(4, Pin.OUT)
  16. cs = Pin(2, Pin.OUT)
  17. rst = Pin(5, Pin.OUT)
  18.  
  19. spi = SPI(1, baudrate=40000000, polarity=0, phase=0)
  20. tft = TFT_GREEN(128, 160, spi, dc, cs, rst, rotate=0)
  21. tft.initr(tft.BGR) # tft.initr(tft.RGB) #Если вместо синего цвета отображается красный, а вместо красного синий
  22.  
  23.  
  24. FontColor = tft.rgbcolor(33,149, 82)
  25. FontColor2 = tft.rgbcolor(8,85, 41)
  26.  
  27. wlan = network.WLAN(network.STA_IF)
  28. wlan.active(True)
  29. wlan.connect(wlan_id, wlan_pass)
  30.  
  31. tft.clear(tft.rgbcolor(255,255, 255))
  32.  
  33.  
  34. while wlan.isconnected() == False:
  35. pass
  36.  
  37. print('Device IP:', wlan.ifconfig()[0])
  38.  
  39. apiKey = 'Your_Key'
  40. cityName = 'Moscow,RU'
  41.  
  42.  
  43. def http_get(url, port=80):
  44. _, _, host, path = url.split('/', 3)
  45. addr = socket.getaddrinfo(host, port)[0][-1]
  46.  
  47. s = socket.socket()
  48. s.connect(addr)
  49. s.send(bytes('GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n' % (path, host), 'utf8'))
  50.  
  51. text = ''
  52.  
  53. while True:
  54. data = s.recv(100)
  55. if data:
  56. text += str(data, 'utf8')
  57. pass
  58. else:
  59. a = text.split('\r\n\r\n', 2)[1]
  60. return a
  61. break
  62.  
  63.  
  64. json_data = http_get('http://api.weatherbit.io/v2.0/current?city=' + cityName + '&key=' + apiKey)
  65.  
  66. if not json_data:
  67. raise SystemExit
  68.  
  69. data = json.loads(json_data)
  70.  
  71. wCity = data['data'][0]['city_name']
  72. wTemp = round(data['data'][0]['temp'])
  73. wTempFeels = data['data'][0]['app_temp']
  74. wHumidity = data['data'][0]['rh']
  75. wWind = data['data'][0]['wind_spd']
  76.  
  77. pod = data['data'][0]['pod']
  78.  
  79. wCode = int(data['data'][0]['weather']['code'])
  80.  
  81. if wCode <= 233:
  82. wPic = '11'
  83. elif (wCode >= 300 and wCode <= 520) or wCode == 522:
  84. wPic = '09'
  85. elif wCode in (521, 600):
  86. wPic = '10'
  87. elif wCode >= 601 and wCode <= 622:
  88. wPic = '13'
  89. elif wCode >= 623 and wCode <= 751:
  90. wPic = '50'
  91. elif wCode == 800:
  92. wPic = '01'
  93. elif wCode in (801, 802):
  94. wPic = '02'
  95. elif wCode == 803:
  96. wPic = '03'
  97. elif wCode == 804:
  98. wPic = '04'
  99.  
  100. if (wTemp > 0):
  101. wTempPic = 'tp'
  102. else:
  103. wTempPic = 'tn'
  104.  
  105. tft.text(1,1,wCity, font.terminalfont, FontColor, 2)
  106.  
  107. tft.draw_bmp(34,16,'/weather/' + wPic + pod + '.bmp')
  108. tft.draw_bmp(5,70,'/weather/' + wTempPic + '.bmp')
  109.  
  110. tft.text(30,75, str(wTemp), font.terminalfont, FontColor, 4)
  111.  
  112. tft.text(5,120,"Feels: " + str(wTempFeels), font.terminalfont, FontColor2, 1)
  113. tft.text(5,128,"Humidity: " + str(wHumidity) + "%", font.terminalfont, FontColor2, 1)
  114. tft.text(5,136,"Wind: " + str(wWind) + "m/s", font.terminalfont, FontColor2, 1)

Не забудь заменить в коде название сети Wi-Fi и ее пароль

  1. wlan_id = "Your_Wi-Fi"
  2. wlan_pass = "Your_Wi-Fi_Password"

Не забудь заменить в коде ключ доступа к сервису weatherbit.io, который мы получили во время эксперимента 69

  1. apiKey = 'Your_Key'