В этом руководстве давайте подключимся к Интернету, управляя модулем 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