Для мно­гих раз­работ­чиков Python — это язык, на котором были написа­ны их пер­вые прог­раммы: «Hello, world!» или каль­кулятор. Сей­час начина­ющие прог­раммис­ты во вре­мя обу­чения час­то пишут телег­рам‑ботов, бла­го на Python это сде­лать отно­ситель­но нес­ложно. Давай соз­дадим бота, но не прос­того, а вза­имо­дей­ству­юще­го с нашим собс­твен­ным устрой­ством для умно­го дома, которое мы самос­тоятель­но соберем и зап­рограм­миру­ем.

На мой взгляд, основное дос­тоинс­тво Python — уни­вер­саль­ность: с его помощью мож­но решить прак­тичес­ки любую задачу бла­года­ря огромно­му количес­тву сбо­рок. Это прив­носящий магию C++ Cython, бра­узер­ный Brython, поз­воля­ющий работать с Java Jython и мно­жес­тво биб­лиотек на все слу­чаи жиз­ни.

Но до срав­нитель­но недав­него вре­мени, если Python-прог­раммист хотел сде­лать девайс для умно­го дома или машин­ку на ради­оуп­равле­нии, он был вынуж­ден либо исполь­зовать Arduino и волей‑неволей учить C++, либо доволь­ство­вать­ся мик­рокомпь­юте­ром вро­де Raspberry Pi и искать (а порой и писать свои) биб­лиоте­ки для управле­ния теми или ины­ми китай­ски­ми модуля­ми. Иног­да вооб­ще при­ходи­лось соз­давать хто­ничес­ких чудовищ, под­клю­чая про­водом Arduino к Raspberry и опра­шивая дат­чики через serial port, но все рав­но при этом нуж­но было писать про­шив­ку для Arduino или дру­гого кон­трол­лера на C++.

Но уже при­мер­но пять лет, если судить по дате моей статьи про MicroPython, мож­но занимать­ся DIY-про­екта­ми, не перек­люча­ясь с одно­го язы­ка прог­рамми­рова­ния на дру­гой. За это вре­мя мно­гое в мире MicroPython поменя­лось, выш­ли новые сбор­ки, появи­лись одни биб­лиоте­ки и пол­ностью перес­тали под­держи­вать­ся дру­гие, а Arduino офи­циаль­но при­няла MicroPython в свою эко­сис­тему.

С каж­дым годом чис­ло под­держи­вающих MicroPython плат рас­тет, но зна­читель­ный их про­цент все еще базиру­ется на ESP32. И дей­стви­тель­но, у это­го кон­трол­лера мас­са дос­тоинств, таких как встро­енные Wi-Fi и BLE, а еще, если говорить чес­тно, отсутс­твие кон­курен­тов в том же ценовом диапа­зоне. Но вот что каса­ется плат, базиру­ющих­ся на этом кон­трол­лере, — тут гла­за раз­бега­ются. Это и базовые вер­сии от WeMos, целые наборы и модули от M5Stack и LILYGO. Не отста­ют, кста­ти, и рос­сий­ские инже­неры: магазин iArduino не так дав­но выпус­тил свою отла­доч­ную пла­ту Piranha.

К тому же нель­зя забывать про Великий Китай­ский Ноунейм, которым завален «Али­экс­пресс». Кста­ти, в нашем про­екте мы будем исполь­зовать одну из таких плат — ESP32-CAM (я так и не смог разоб­рать­ся, кто же ее офи­циаль­ный про­изво­дитель). Как нес­ложно догадать­ся по наз­ванию, это модуль на осно­ве ESP32 с под­клю­чен­ной камерой, чаще все­го это OV2640, но если ты хочешь добить­ся луч­шего качес­тва, то мож­но под­клю­чить и дру­гие.

Pinout Map
Pinout Map

Вот спи­сок необ­ходимо­го ПО:

  • твоя любимая IDE для раз­работ­ки — я исполь­зую PyCharm;
  • ESP32 MPY-Jama — кросс‑плат­формен­ная IDE для MicroPython;
  • Telegram.

Итак, что же мы будем делать? Как ты уже, навер­ное, догадал­ся, судя по тому, что я выб­рал пла­ту с камерой, — сис­тему виде­онаб­людения. Но не прос­тую, с пос­тоян­ной тран­сля­цией, а с воз­можностью мгно­вен­но получить фотог­рафию. Управлять ею мы будем через Telegram-бота, а что­бы не приш­лось покупать ста­тичес­кий IP-адрес, для обще­ния бота и девай­са исполь­зуем про­токол MQTT.

info

MQTT (Message Queuing Telemetry Transport) — это лег­ковес­ный про­токол переда­чи сооб­щений, который исполь­зует­ся для обме­на дан­ными меж­ду устрой­ства­ми в интерне­те вещей (IoT). Он приз­ван обес­печивать надеж­ную связь меж­ду мно­жес­твом устрой­ств, которые работа­ют с огра­ничен­ными ресур­сами и могут быть под­клю­чены к интерне­ту толь­ко вре­мен­но или с пери­оди­чес­кими задер­жка­ми.

MQTT работа­ет по прин­ципу «изда­тель — под­писчик», где одни устрой­ства могут пуб­ликовать сооб­щения в топики (topics), а дру­гие под­писывать­ся на них, что­бы получать сооб­щения, которые им нуж­ны. Про­токол пре­дос­тавля­ет гиб­кий и прос­той спо­соб переда­чи сооб­щений, что дела­ет его иде­аль­ным для исполь­зования в сис­темах IoT, где устрой­ства могут иметь раз­ные фун­кци­ональ­ные воз­можнос­ти и огра­ниче­ния.

 

Настройка инфраструктуры

Пе­ред тем как непос­редс­твен­но перей­ти к прог­рамми­рова­нию, необ­ходимо нас­тро­ить так называ­емый MQTT-бро­кер. Это сер­вер, на котором рас­полага­ются топики и к которо­му под­клю­чают­ся под­писчи­ки и изда­тели.

Ра­зуме­ется, мож­но нас­тро­ить его самос­тоятель­но, нап­ример исполь­зуя Mosquitto. Но сто­ит толь­ко подумать, что, кро­ме самого бро­кера, при­дет­ся нас­тра­ивать сер­вер, бес­поко­ить­ся о его безопас­ности и так далее, как желание занимать­ся про­ектом куда‑то про­пада­ет.

Так что в качес­тве бро­кера мы будем исполь­зовать сер­вис shiftr.io. Его бес­плат­ного тарифа нам хва­тит с головой. Сре­ди дос­тоинств это­го сер­виса — инту­итив­но понят­ный интерфейс, под­робная докумен­тация и визу­али­зация всей сис­темы. На глав­ной стра­нице тво­его про­екта мож­но уви­деть, какие топики соз­даны и какое в них было пос­леднее сооб­щение, какие устрой­ства под­клю­чены, а ког­да нач­нутся рас­сылки пакетов — их тоже будет вид­но!

Пример, как может все отображаться
При­мер, как может все отоб­ражать­ся

Что­бы наши устрой­ства — телег­рам‑бот и ESP32-CAM — мог­ли вза­имо­дей­ство­вать с нашим MQTT-бро­кером, необ­ходимо выпус­тить токен. Это мож­но сде­лать в нас­трой­ках тво­его прос­транс­тва.

Пос­ле это­го в спис­ке токенов появит­ся такой эле­мент: mqtt://xakep:utBmi6LTWS7b4l5@xakep.cloud.shiftr.io, где xakep — это логин, а utBmi6LTWS7b4l5 — пароль. Запом­ни их, они нам еще при­годят­ся. Инфраструк­тура нас­тро­ена, мож­но прис­тупать к прог­рамми­рова­нию.

 

ESP32-CAM

Для прог­рамми­рова­ния ESP32 на MicroPython сущес­тву­ет нес­коль­ко IDE. Я оста­новил свой выбор на ESP32 MPY-Jama — опен­сор­сном решении со мно­жес­твом удоб­ных фун­кций.

Од­на из них — гра­фичес­кий интерфейс для ути­литы esptool. Которую, впро­чем, все рав­но нуж­но уста­новить через pip: pip install esptool.

Так выглядит загрузчик
Так выг­лядит заг­рузчик

Мы будем исполь­зовать спе­циаль­ную про­шив­ку для ESP32-CAM, она дос­тупна в этом GitHub-репози­тории. Ска­чива­ем файл про­шив­ки и, исполь­зуя IDE, про­шива­ем, не забыв перед этим отформа­тиро­вать Flash-память.

Те­перь мы можем под­клю­чить­ся и заг­рузить необ­ходимые фай­лы на нашу пла­ту. Для работы, кро­ме встро­енных биб­лиотек, нам понадо­бят­ся биб­лиоте­ки micropython-umqtt.robust и micropython-umqtt.simple. Их мож­но уста­новить с помощью встро­енно­го менед­жера пакетов upip. Для это­го под­клю­чись к интерне­ту через Wi-Fi, а затем выпол­ни сле­дующие коман­ды:

import network
import upip
# Не забудь вставить имя своей Wi-Fi-сети и пароль от нее
def wifi_setup():
global sta_if
sta_if.active(True)
sta_if.scan()
sta_if.connect('SSID', 'PASSWORD')
print("Waiting for Wifi connection")
while not sta_if.isconnected(): time.sleep(1)
print("Connected to WiFi")
wifi_setup()
upip.install("micropython-umqtt.robust")
upip.install("micropython-umqtt.simple")

Те­перь у нас все готово для работы. Что­бы облегчить задачу, я написал неболь­шую биб­лиотеч­ку — со все­ми необ­ходимы­ми фун­кци­ями. Давай пос­мотрим, что в нее вхо­дит.

Вна­чале импорти­руем необ­ходимые биб­лиоте­ки:

  • network — для под­клю­чения к интерне­ту;
  • umqtt.robust — для вза­имо­дей­ствия с MQTT-бро­кером;
  • camera — в этой биб­лиоте­ке находят­ся фун­кции для работы с камерой;
  • time — похож на одно­имен­ную биб­лиоте­ку из обыч­ного Python;
  • machine — это базовый модуль MicroPython, поз­воля­ющий управлять пинами.
# Импорт библиотек
import network
from umqtt.robust import MQTTClient
import camera
import time
import machine
# Инициализация глобальных переменных
sta_if = network.WLAN(network.STA_IF); # Wi-Fi-модуль
camera.init(0, format=camera.JPEG, fb_location=camera.PSRAM) # Непосредственно камера
mqtt_client = None # Заготовка для MQTT-клиента
led = machine.Pin(4, machine.Pin.OUT) # Встроенный светодиод

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

Продолжение доступно только участникам

Вариант 1. Присоединись к сообществу «Xakep.ru», чтобы читать все материалы на сайте

Членство в сообществе в течение указанного срока откроет тебе доступ ко ВСЕМ материалам «Хакера», позволит скачивать выпуски в PDF, отключит рекламу на сайте и увеличит личную накопительную скидку! Подробнее

Вариант 2. Открой один материал

Заинтересовала статья, но нет возможности стать членом клуба «Xakep.ru»? Тогда этот вариант для тебя! Обрати внимание: этот способ подходит только для статей, опубликованных более двух месяцев назад.


  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    4 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии