В прошлых статьях, мы познакомились с базовыми понятиями 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. При перепечатке данного материала активная ссылка на первоисточник, не закрытая для индексации поисковыми системами, обязательна.
Комментарии