Цель урока
Сегодня мы напишем сетевую карточную игру на двух игроков. Какую игру написать? Давайте напишем популярную карточную игру "Дурак", цель которой — избавиться от всех карт. Подробнее о правилах Вы можете узнать здесь.
Рисунок 1.
User
Сегодня мы напишем сетевую карточную игру на двух игроков. Какую игру написать? Давайте напишем популярную карточную игру "Дурак", цель которой — избавиться от всех карт. Подробнее о правилах Вы можете узнать здесь.
Рисунок 1.
Привет! Сегодня мы познакомимся с такой штукой как M5 UI. Благодаря M5 UI Вы можете с помощью пары строк кода подключать всевозможные поля, кнопки, ползунки и переключатели, создавать условные слоя. Несмотря на то, что процесс подключения элементов UI очень прост, Вы также можете воспользоваться наглядным инструментом M5 UI Designer for Arduino IDE.
Рисунок 1
Рисунок 1
Сегодня практически отсутствуют Интернет-ресурсы, которым бы был не нужен Ваш номер телефона. Верификация номера проходит обычно путём получения SMS с кодом или звонком, где последние цифры номера являются аргументом для подтверждения. Если Вы занимаетесь бизнесом, то наверняка сталкивались с тем, что для совершения тех или иных банковских операций необходимо подписывать их с помощью кода из SMS. Всё хорошо, когда находитесь в домашнем регионе и получить код не составит труда, гораздо сложней ситуация обстоит, если Вы находитесь в другом регионе, где роуминг не работает, т. к. Ваш телефон или SIM-карта не поддерживается местными сотовыми операторами. Одним из элегантных решений является данный проект (рисунок 1). В домашнем регионе Вы оставляете M5Stack с установленной SIM-картой, получаете белый IP у оператора, открываете порт и получаете доступ к журналу входящих SMS и звонков онлайн с любой точки мира, где есть Интернет.
SPIFFS – (Serial Peripheral Interface Flash File System) файловая система флеш-памяти, подключаемой по последовательному периферийному интерфейсу. Простыми словами: есть микроконтроллер ESP32 (рисунок 1), у него есть встроенная перезаписываемая энергонезависимая NOR-память, в которой хранятся: настройки (Preferences), загрузчик (Bootloader), микропрограмма (скомпилированный скетч), файловая система (SPIFFS) и ещё что-нибудь, типа обновления "по воздуху" (OTA).
У меня была детская мечта — выдать каждому бытовому «безВайФайному» устройству билет в сеть, т. е. IP-адрес и порт. Спустя какое-то время я понял, что не стоит откладывать. Надо взять и сделать.
Сделать шлюзом M5Stack с установленным Модулем LoRa (рисунок 1). Шлюз будет подключён к Wi-Fi-сети, в которой получит по DHCP локальный IP-адрес. Шлюз с определённой периодичностью будет вещать в «LoRa-эфир» своё имя (аналог SSID для Wi-Fi) и диапазон допустимых портов, чтоб другие устройства знали, что есть такая сеть, к которой можно подключиться и в каком диапазоне можно «повыбирать» свободный порт. Поскольку это будет прототип, аутентификация не в этот раз. Новые устройства-клиенты будут находить доступную LoRa-сеть и передавать ей выбранный порт. После того, как шлюз получил от нового клиента порт, проверяет свободен ли он, если да, то регистрирует нового клиента и начинает слушать данный порт на собственном асинхронном UDP-сервере. После регистрации клиент получит согласие или отказ на использование заявленного порта. Порядок работы отображён в таблице 1.
Рисунок 1
Таблица 1
сторона | направление и данные | сторона | сеанс |
---|---|---|---|
[ клиент ] | <— сигнал-маяк — | [ шлюз ] | 0xA1 |
[ клиент ] | — выбранный порт —> | [ шлюз ] | 0xB1 |
[ клиент ] | <— согласие или отказ — | [ шлюз ] | 0xA2 |
[ клиент ] | — UPD-пакет —> | [ шлюз ] | 0xB2 |
[ клиент ] | <— UPD-пакет — | [ шлюз ] | 0xA3 |
[ сеть ] | <— UPD-пакет — | [ шлюз ] | 0xC1 |
Передо мной на столе лежат всякие Модули для M5Stack и скучают. Давайте возьмем LoR’у и развлечёмся с ней. Сама концепция модулей прекрасна! Что тут скажешь? Но, модули у меня первой ревизии, в которых ужаснейшая встроенная антенна, выполненная на гибкой печатной плате и приклеенная к боковой стенке корпуса. Я проводил однажды полевые тесты таких модулей (можно посмотреть на русскоязычном канале на YouTube):
Естественно, пришлось удалить эти рудименты и впаять стандартные спиралевидные антенны, которые идут в комплекте с Ra-01. После такой кастомизации дальность связи заметно улучшилась, но появился побочный момент — антенна имеет диаметр больший, чем допустимое расстояние между модулями. Пришлось отказаться от Завершающего модуля на время проекта.
Привет! Если Вам посчастливилось подержать в руках микроконтроллер ESP32 (мне посчастливилось больше и у меня в руках M5Stack) от китайской компании ESPRESSIF, то этот пост, возможно, будет полезен.
Бывает ситуация, когда необходимо сохранить какие-то параметры в энергонезависимой памяти (например: подсчитывать количество включений устройства за всё время или сохранять настройки Wi-Fi). Это можно сделать с лёгкостью с помощью библиотеки Preferences.
Объявим экземпляр класса Preferences, а там видно будет...
Первое, что мы должны сделать — это создать связку ключей путём вызова метода begin с парой аргументов (но можно только с одним первым): именем связки и флагом "только для чтения".
Чтобы сохранить строковое значение в памяти, нужно передать ключ и само значение в метод, имя которого состоит из двух частей: первой — put и второй — имени типа, например: String. Всё ясно и понятно. Правда, есть ещё "сырые" байты без обжарки, которым никто не хочет присвоить тип. В таком случае метод принимает ещё и третий аргумент с количеством этих байтов. С этой процедурой вроде всё.
После того, как значение было записано, можно его прочесть с помощью метода (имя которого аналогично предыдущему), где первая часть будет get. Данный метод возвращает значение для ключа соответственного типа. Помните про случай с байтами? Если Вы не знаете (или не помните) сколько байт лежит по ключу, то дёргайте метод getBytesLength с единственным аргументом — ключом, она всё посчитает и вернёт количество в size_t.
Если Вы хотите удалить определённый ключ из связки, то отдайте его единственным аргументом методу remove.
Хотите навести настоящий марафет и очистить ВСЮ связку? Вызывайте без всяких аргументов метод clear!
Когда Вы пожелаете завершить работу со связкой, то вызовите метод end без каких-либо аргументов.