В этом руководстве давайте подключимся к Интернету, управляя модулем Wi-Fi через UART (универсальный асинхронный приемник / передатчик).
"Оглавление"
Компоненты
- Raspberry Pi Pico - 1 шт.
- Макетная плата - 1 шт.
- Датчик DHT11 - 1 шт.
- Сетевой модуль Wi-Fi (ESP8266, модуль ESP-01) - 1 шт.
- Проволочные перемычки (типы M-M и M-F)
ESP8266 - это микроконтроллер с возможностью работы в сети Wi-Fi. Он очень популярен из-за невысокой цены. Для удобства использования он продается в виде модулей различных типов. Здесь используется модуль ESP-01, который имеет небольшие размеры и невысокую цену. В модуль обычно загружается прошивка, которая может использовать AT-команды.
Схема
Подключите ESP-01 к порту UART0, а также подключите контакт CH_PD к 3V3. И вывод OUT датчика DHT11 также подключен к GPIO15. К сожалению, модуль ESP-01 не предназначен для подключения к макетной плате. Таким образом, он должен быть подключен через перемычки типа M-F (Male-to-Female).
UART (универсальный асинхронный приемник / передатчик)
В отличие от I2C и SPI, описанных в предыдущем руководстве, UART (универсальный асинхронный приемник / передатчик) не использует вывод синхронизации. Следовательно, необходимо согласовывать скорость связи между устройствами. Это называется скоростью передачи, и наиболее часто используются 9600 бит / с и 115200 бит / с. В Pico предусмотрено два порта: UART0 и UART1. И в отличие от I2C и SPI, UART не является шиной. Следовательно, к каждому порту можно подключить только одно устройство.
В Kaluma его можно использовать через модуль uart
, как показано ниже. Передача данных возможна через функцию write()
. Но нет функции приема данных. Поскольку внешнее устройство UART не знает, когда передавать данные, полученные данные передаются через событие data
. Поскольку полученные данные относятся к типу Uint8Array
, если вы хотите распечатать их на терминале, вам необходимо преобразовать их в тип String
.
const {UART} = require('uart'); let uart0 = new UART(0); uart0.write('Hello\n'); // ... uart0.on('data', (data) => { var s = String.fromCharCode.apply(null, data); print(s); }); // ... uart0.close();
AT команда
AT Command (также известный как набор команд Hayes) - это набор команд, разработанный для ранних модемов. Команды обычно начинаются с текста «AT», поэтому они называются AT-командами, что является сокращением от «внимания». Хотя он был разработан очень давно, до недавнего времени он широко использовался в качестве команды для управления различными устройствами. ESP8266 также поддерживает эту AT-команду для управления беспроводной сетью.
Во-первых, давайте управлять ESP8266, подключенным к UART0, с помощью AT-команд, как показано на приведенной выше принципиальной схеме. Чтобы отправить AT-команды прямо с терминала на UART и распечатать полученные данные на терминале, введите (скопируйте и вставьте) приведенный ниже код построчно в терминал. Приведенный ниже код просто создает объект для порта UART 0 и выводит его на терминал при получении данных. Поскольку полученные данные относятся к типу Uint8Array
, они преобразуются в строку для удобного чтения и вывода.
> const {UART} = require('uart'); > let uart0 = new UART(0, {baudrate: 115200}); > uart0.on('data', d=>{print(String.fromCharCode.apply(null, d))});
Во-первых, давайте посмотрим, правильно ли ESP8266 подключен и нормально ли реагирует на AT-команды. Давайте отправим AT\r\n
строку через UART, как показано ниже. Тогда OK
будет получен как результат сразу после получения эха переданной команды. Обратите внимание, что \r\n
всегда нужно добавлять в конец AT-команд.
> uart0.write('AT\r\n'); undefined > AT OK
Затем давайте отправим команду для сброса ESP8266. Некоторые странные струны появляются в изобилии. Если вы видите OK
в начале и готово в конце, инициализация прошла успешно.
> uart0.write('AT+RST\r\n'); undefined > AT+RST OK ... load 0x40100000, len 1856, room 16 tail 0 chksum 0x63 load 0x3ffe8000, len 776, room 8 ... Ai-Thinker Technology Co. Ltd. ready
Наконец, давайте отправим команду для сканирования ближайших точек доступа, чтобы убедиться, что функция Wi-Fi работает нормально. Давайте проверим, хорошо ли просматриваются беспроводные сети вокруг меня.
> uart0.write('AT+CWLAP\r\n'); undefined > AT+CWLAP +CWLAP:(3,"xxxxxxxxxxx",-78,"xx:xx:xx:xx:xx:xx",1,10,0) +CWLAP:(3,"xxxxxx",-53,"xx:xx:xx:xx:xx:xx",11,-2,0) ... OK
Вы хорошо видите сети вокруг меня (в целях безопасности SSID и BSSID заменены на x
)? Этого достаточно, чтобы понять, как выполняется AT-команда ESP8266. Для получения дополнительных сведений о командах AT см. Соответствующую документацию. Для справки приведенная ниже ссылка представляет собой документ, в котором кратко описаны AT-команды ESP8266.
Запустить внешний веб-сервер
Чтобы передавать данные о температуре и влажности, измеренные Pico, в Интернет, требуется сервер, который может их получать. Теперь давайте создадим простой веб-сервер для приема данных с помощью express.js и Node.js. Создайте папку, как показано ниже, инициализируйте проект Node.js, а затем добавьте модули express
и ip
.
$ mkdir thermo-server $ cd thermo-server $ npm init -y $ npm install express, ip --save
Напишите server.js
программу, как показано ниже. Если вы подключаетесь к этому серверу с помощью браузера, отображаются текущая температура и влажность. Кроме того, предоставляется REST API метода HTTP GET, чтобы информация о температуре и влажности, измеренная датчиком DHT11 в Pico, могла передаваться на сервер как /update?t=27.5&h=45
.
Все коды можно найти по ссылке ниже
https://kaluma.io/@niklauslee/phycomjs-examples
После написания кода давайте запустим веб-сервер. Он выполняется с IP-адресом и номером порта веб-сервера, отображаемыми, как показано ниже.
$ node server App listening at http://xxx.xxx.x.xx:3000
Отправить данные на веб-сервер
Теперь все, что вам нужно сделать, это отправить данные о температуре и влажности с Pico на веб-сервер. Однако сложно раскрыть информацию, такую как пароль Wi-Fi или адрес сервера, извне. Поскольку все проекты, созданные в Kaluma, в настоящее время находятся в публичном режиме, существует риск раскрытия такой информации извне. Итак, давайте использовать Storage API для хранения информации во флэш-памяти Pico, а не раскрывать ее в коде. Прежде всего, мы сохраним SSID Wi-Fi, пароль, адрес и порт во флеш-памяти Pico. Введите в терминал следующее.
> storage.setItem('WIFI_SSID', 'xxxxxxx'); > storage.setItem('WIFI_PASSWORD', 'xxxxxxxx'); > storage.setItem('ADDRESS', 'xxx.xxx.x.xx'); > storage.setItem('PORT', '3000');
Эти сохраненные элементы можно прочитать следующим образом. Разрешив коду читать эти сохраненные элементы, вы можете предотвратить раскрытие информации.
> storage.getItem('WIFI_SSID'); > storage.getItem('WIFI_PASSWORD'); > storage.getItem('ADDRESS'); > storage.getItem('PORT');
Теперь давайте напишем приведенный ниже код и загрузим его. Мы используем модуль at
, предоставленный Kaluma, для более удобной обработки AT-команд. Используя это, вы можете очень удобно передавать AT-команды, а также легко передавать результат передачи в функцию обратного вызова. При создании класса ATCommand
передает объект UART, подключенный к модулю ESP-01, и если вы хотите видеть данные, поступающие и исходящие отсюда, вы можете установить для параметра debug
значение true
. На этапе разработки будет очень удобно просматривать отладочную информацию. См. Ссылку на модуль at
, чтобы увидеть полную функцию.
Когда код выполняется, ESP8266 инициализируется командой AT+RST
, а затем пытается подключиться к Wi-Fi с помощью команды AT+CWJAP
. При успешном соединении выполняется функция start()
для измерения температуры и влажности от датчика DHT11 каждые 10 секунд, а HTTP-запрос GET генерируется и передается на сервер.
Все коды можно найти по ссылке ниже
https://kaluma.io/@niklauslee/phycomjs-examples
После того, как Pico отправит данные о температуре и влажности на сервер, давайте теперь проверим температуру и влажность, подключившись к серверу с помощью браузера на смартфоне или ПК. Если у сервера есть статический IP-адрес, к которому можно получить доступ извне, вы можете проверить температуру и влажность в любом месте.
Использование сторонних модулей
Очень сложно напрямую составить сообщение HTTP-запроса и отправить его как AT-команду. Давайте воспользуемся простым модулем, чтобы упростить этот процесс.
Когда вам необходимо связаться с HTTP-сервером, этот модуль устраняет необходимость напрямую отправлять AT-команды, а также устраняет необходимость вручную создавать сообщения HTTP-запроса, а также автоматически анализирует полученные ответные сообщения. Используя этот модуль, вы можете очень кратко написать код следующим образом.
В этом последнем уроке мы попытались передать температуру и влажность через Интернет с помощью AT-команды. До сих пор я пытался как можно проще передать основы физических вычислений с использованием JavaScript в этом руководстве. А как насчет создания собственных интересных проектов?
Конец.
Больше контента на plainenglish.io