Micropython - это просто. Часть четвёртая

20 марта 2020


В прошлых статьях, мы познакомились с базовыми понятиями Micropython-а, а это значит, что можно приступать к интересным проектам. Сегодня мы сделаем часы, которые будут своё местоположение, а соотвественно и время, через интернет.

В этой статье мы рассмотрим как создать устройство на основе ESP32, которое будет подключаться к различным API, для получения информации о погоде и о месторасположении

Начинаем

Для начала, уточним, что такое API. API - application programming interface, это интерфейс какого-либо приложения, чаще всего веб-приложения, который доступен разработчикам. В этом проекте мы будем использовать аж 3 API:

  • http://worldtimeapi.org - вообще-то это API для определения времени, но мы будем его использовать для получения глобального IP-адреса, который нужен для определения местоположения
  • https://ipstack.com/ - этот API помогает определить, где расположен пользователь с заданным IP-адресом
  • http://www.7timer.info -  это приложение позволяет определить температуру в заданной точке.

Необходимые модули

Для отображения температуры - будем использовать семисегментный индикатор, а для отображения дополнительной информации - страны и города - LCD дисплей. Для отображения температуры - будем использовать семисегментный индикатор, а для отображения дополнительной информации, страны и города, LCD дисплей. В одном из модулей ESP32 LCD уже интегрирован, и он доступен на 4 и 5 пинах. Для подключения индикатора будем использовать 13 и 15 пины. Их необходимо подключить к CLK и DIO пинам модуля индикатора.

Узнаём погоду

Вся программа состоит из нескольких блоков. Первый блок - это подключение нашего модуля ESP32 к интернету. Эта функция представлена в документации, и ничего особо интересного в ней нет. Главное - не забудьте исправить SSID и пароль на свои.

def do_connect():
    import network
    sta_if = network.WLAN(network.STA_IF)
    if not sta_if.isconnected():
        print('connecting to network...')
        sta_if.active(True)
        sta_if.connect('<essid>', '<password>')
        while not sta_if.isconnected():
            pass
    print('network config:', sta_if.ifconfig())

 

Основная функция - это функция которая получает всю необходимую нам информацию. На ней и остановимся.

import urequests as requests
import json

def get_temp(API_KEY = None):
  # Получаем IP - адрес
  data = requests.get('http://worldtimeapi.org/api/ip')
  ip = json.loads(data.text)['client_ip']
  
  # Получаем название страны, города и координаты
  data = requests.get('http://api.ipstack.com/{}?access_key={}'.format(ip, API_KEY))
  ltmp = json.loads(data.text)
  lat,long,cntr,city = float(ltmp['longitude']),float(ltmp['latitude']),ltmp['country_name'],ltmp['city']
  
  # Узнаём погоду
  data = requests.get('http://www.7timer.info/bin/astro.php?lon={}&lat={}&ac=0&unit=metric&output=json'.format(long,lat))
 
  return int(json.loads(data.text)['dataseries'][-1]['temp2m']),cntr,city

Для работы с API очень часто используются GET и POST запросы. Функции, позволяющие их выполнять, находятся в модуле urequests, а что бы с результатом можно было работать как со словарём необходимо воспользоваться функцией json.loads из модуля json.

В качестве параметра в эту функцию поступает API_KEY, это ключ, необходимый для работы с одним из API - https://ipstack.com/, что бы его получить, необходимо зарегистрироваться на их сайте, это быстро и бесплатно.

Затем, поочерёдно обращаясь к каждому из API, мы узнаём сначала IP-адрес, затем по нему определяем страну, город и координаты, а затем по координатам узнаём погоду.

Выводим информацию

После того, как мы получили погоду, необходимо во-первых вывести её на наши экраны, а во-вторых периодически обновлять информацию.

Для работы с экранами нам понадобятся соотвествующие библиотеки: tm1637.py - для семисегментного индикатора и ssd1306.py - для LCD дисплея.

Импортируем необходимые библиотеки и инициализируем экраны:

import tm1637
from machine import Pin
import ssd1306

tm = tm1637.TM1637(clk=Pin(13), dio=Pin(15))
i2c = machine.I2C(scl=Pin(4), sda=Pin(5))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)

Напишем небольшую вспомогательную функцию, задача которой выводить на LCD-дисплей страну и город.

def country_city(ol,cnt,cit):
    ol.fill(0)
    ol.text(cnt, 0, 20)
    ol.text(cit, 0, 40)
    ol.show()

А теперь основная часть программы. В ней происходит периодический вызов нашей функции, и вывод на экраны информации.

while True:
    data = get_temp(API = '')
    tm.temperature(data[0])
    country_city(oled,data[1],data[2])
    time.sleep(3600)
    tm.write([0, 0, 0, 0])
    tm.show('LOAD')

Каждый час, происходит обновление температуры. Во время загрузки информации с сайтов, на семисегментном дисплее отображается строка LOAD.


Заключение

Использование различных API, в связке с элегантностью Micropython-а позволяет получать и отображать различную информацию. Кроме того, с помощью API можно обрабатывать информацию поступающую непосредственно с устройства, например температуру или влажность.


Данная статья является собственностью Amperkot.ru. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.


Поделиться: