Рис. 12.6. Получение информации о погоде от веб-службы
Скетч для этого примера получился очень коротким, всего 45 строк кода (sketch_12_03_web_request). Наибольший интерес для нас представляет функция hitWebPage:
void hitWebPage()
{
if (client.connect("api.openweathermap.org", 80))
{
client.println("GET /data/2.5/weather?q=Manchester,uk HTTP/1.0");
client.println();
while (client.connected())
{
if (client.available())
{
client.findUntil("description\":\"", "\0");
String description = client.readStringUntil('\"');
Serial.println(description);
}
}
client.stop();
}
}
Прежде всего необходимо подключить клиента к порту 80 сервера. Если соединение благополучно установлено, серверу посылается заголовок запроса:
client.println("GET /data/2.5/weather?q=Manchester,uk HTTP/1.0");
Дополнительная команда println нужна, чтобы отметить конец заголовка запроса и побудить сервер прислать ответ.
Далее в цикле while инструкция if проверяет получение данных от сервера, пока соединение с ним не закрыто. Непосредственное чтение данных из потока помогает избежать необходимости сохранять все данные в памяти. Данные поступают в формате JSON:
{"coord":{"lon":-2.23743,"lat":53.480949},
"sys":{"country":"GB","sunrise":1371094771,
"sunset":1371155927},"weather":[{"id":520, "main":"Rain",
"description":"light intensity shower rain", "icon": "09d"}]
"humidity":87,"temp_min":283.15,"temp_max":285.93},
"wind":{"speed:5.1,"deg":270},"rain":{"1h":0.83},
"clouds":{"all":40},"dt":1371135000,"id":3643123,
"name":"Manchester","cod":200}
Функция hitWebPage с помощью функций findUntil и readStringUntil извлекает фрагмент текста, следующий за словом «description», с двоеточием и двойной кавычкой до следующей двойной кавычки.
Функция findUntil просто игнорирует все, пока не встретит указанную строку. Затем функция readStringUntil читает текст из потока, пока не встретит двойную кавычку.
Библиотека WiFi
Библиотека WiFi, как можно было ожидать, очень похожа на библиотеку Ethernet. Если в скетче заменить Ethernet на WiFi, EthernetServer на WiFiServer и EthernetClient на WiFiClient, остальной код останется почти неизменным.
Создание соединения
Главное отличие библиотеки WiFi от Ethernet заключается в подключении к сети. Прежде всего нужно импортировать библиотеку WiFi:
#include <SPI.h>
#include <WiFi.h>
Чтобы установить соединение с сетью, следует вызвать команду WiFi.begin и передать ей имя беспроводной сети и пароль:
WiFi.begin("MY-NETWORK-NAME", "mypassword");
Пример в разделе «Пример использования WiFi» иллюстрирует еще одно отличие, о котором вы должны знать.
Особые функции в библиотеке WiFi
Библиотека WiFi включает несколько специальных функций. Они перечислены в табл. 12.1.
Полное описание библиотеки WiFi можно найти по адресу http://arduino.cc/en/Reference/WiFi11.
Таблица 12.1. Специальные функции в библиотеке WiFi
Функция
Описание
WiFi.config
Позволяет установить статические IP-адреса платы, сервера имен (DNS) и шлюза
WiFi.SSID
Возвращает строку идентификатора беспроводной сети SSID
WiFi.RSSI
Возвращает значение мощности сигнала типа long
WiFi.encriptionType
Возвращает числовой код, соответствующий методу шифрования
WiFi.scanNetworks
Возвращает количество найденных сетей, но никакой дополнительной информации о них не возвращается
WiFi.macAddress
Помещает MAC-адрес адаптера WiFi в шестибайтный массив, переданный как параметр
Пример использования WiFi
Для этого примера я изменил скетч sketch_12_02_server, адаптировав его для работы с платой расширения WiFi. Полный исходный код можно найти в скетче sketch_12_04_server_wifi. Я не буду повторять пример целиком, только отмечу отличия от оригинальной версии.
Чтобы подключиться к беспроводной точке доступа, нужно указать имя беспроводной сети и пароль:
char ssid[] = "My network name"; // имя сети (SSID)
char pass[] = "mypassword"; // пароль для доступа к сети
Также нужно изменить имена классов сервера и клиента, EthernetServer и EthernetClient, на WiFiServer и WiFiClient:
WiFiServer server(80);
WiFiClient client;
При определении объекта сервера все так же требуется указать номер порта 80.
Следующее ракзличие между двумя платами заключается в инициализации подключения. В данном случае должна использоваться команда
WiFi.begin(ssid, pass);
Прочий код остался почти без изменений. В функции loop вы увидите команду delay(1) перед остановкой клиента, она дает клиенту время завершить чтение до того, как соединение будет закрыто. В версии на основе библиотеки Ethernet такая задержка не нужна. Обратите также внимание на то, что кое-где я объединил несколько вызовов client.print в один, чтобы каждый вызов выводил более длинные строки. Этот прием увеличивает скорость взаимодействий, потому что плата WiFi крайне неэффективно обрабатывает короткие строки. Но не забывайте, что каждый отдельный вызов client.print или client.println не может обрабатывать строки длиннее 90 байт — они просто не будут отправлены.
Версия программы на основе библиотеки WiFi работает заметно медленнее версии на основе библиотеки Ethernet и тратит на загрузку около 45 секунд. Плата расширения WiFi поддерживает возможность изменения прошивки, и если в будущем разработчики Arduino повысят эффективность работы платы WiFi, вам определенно стоит подумать об обновлении прошивки в своей плате расширения. Инструкции по прошивке платы WiFi можно найти на странице http://arduino.cc/en/Main/ArduinoWiFiShield.
В заключение
В этой главе мы познакомились с разными способами подключения платы Arduino к сети и выполнения некоторых сетевых операций с использованием плат расширения Ethernet и WiFi. Здесь вы также узнали, как использовать Arduino в качестве веб-сервера и веб-клиента.
В следующей главе вы познакомитесь с цифровой обработкой сигналов (Digital Signal Processing, DSP) с помощью Arduino.
10 Перевод на русский язык: http://arduino.ua/ru/prog/Ethernet. — Примеч. пер.
11 Перевод на русский язык: http://arduino.ua/ru/prog/WiFi. — Примеч. пер.
13. Цифровая обработка сигналов
Плата Arduino способна выполнять простую обработку сигналов. В этой главе обсуждаются разные способы такой обработки, от фильтрации сигнала, поступающего на аналоговый вход, с применением программного обеспечения вместо внешних электронных устройств до вычисления относительной величины различных частотных сигналов с применением быстрого преобразования Фурье.
Введение в цифровую обработку сигналов
Принимая информацию с датчика, вы фактически измеряете сигнал. Сигналы принято отображать в виде линии (обычно извилистой), идущей слева направо с течением времени. Именно так отображаются электрические сигналы на экране осциллографа. Ось y отражает амплитуду сигнала (его силу), а ось x — время. На рис. 13.1 изображен сигнал, соответствующий воспроизведению музыкального фрагмента длительностью 1/4 секунды, который был захвачен с помощью осциллографа.