ESP8266:Примеры/Как запросить курс биткоина при помощи ESP8266
Как запросить курс биткоина при помощи ESP8266[1]
Эта статья рассказывает, как создать простой HTTP-клиент на базе WiFi-модуля ESP8266. Этот клиент будет подключаться к сети и запрашивать информацию о курсе биткоина. Другими словами, это пример того, как извлекать из глобальной сети какие-то данные.
Перед тем, как продолжить, рекомендую пройти вот эти руководства:
- Как начать работать с трансиверным WiFi-модулем на базе ESP8266
- Как собрать веб-сервер на базе ESP8266
- Как загрузить на ESP8266 прошивку NodeMCU
Справочная информация
Основы программирования на Lua
Это скриптовый язык программирования, написанный на C. Разработка этого проекта началась в 1993 году силами Роберту Иерузалимски, Луиша Энрике де Фигейреду и Валдемара Келе, работавшими тогда в подразделении Tecgraf при Католическом университете Рио-де-Жанейро.
Более подробно об этом языке программирования можно почитать в «Википедии».
Прошивка NodeMCU для ESP8266 основана на Lua, поэтому если вы хотите писать собственные скрипты для ESP8266, вам важно знать основы этого языка.
Переменные
Переменные в языке Lua не делятся по типу данных, но делятся по области видимости. Это значит, что переменные в Lua могут быть глобальными или локальными.
- Глобальные переменные. Все переменные по умолчанию считаются глобальными (если в коде специально не задано, что они локальные).
pin = 3 test = "It works!"
- Локальные переменные. Если переменная задана локальной, область ее видимости будет ограничена лишь ее функцией.
local pin = 3 local test = "It works!"
- Поля таблиц. Это особый тип переменных, в которых может храниться все, за исключением «nil» (мы это затрагивать не будем).
Типы данных (типы значений)
Lua – это язык с динамической типизацией, поэтому у переменных нет типов данных. Типы данных есть только у значений. Значения могут храниться в переменных, передаваться в виде параметров и возвращаться в виде результатов.
В таблице ниже показаны типы данных для значений в языке Lua.
Тип значения | Описание |
---|---|
Строка (string) | Массив символов |
Число (number) | Действительное (двойной точности с плавающей запятой) число |
Булево значение (boolean) | Значение «true» или «false». Как правило, используется для проверки выполнения условий |
Функция (function) | Функция, написанная на Lua |
Неопределенное значение (nil) | В такой переменной не хранится никаких данных |
Таблица (table), пользовательские данные (userdata) и поток (thread) | Эти три типа данных мы затрагивать не будем |
Вот примеры некоторых из этих типов значений:
print(type("Hello world!")) –- строка
print(type(7)) -- число
print(type(true)) -- булево значение
print(type(print)) -- функция
print(type(nil)) -- неопределенное значение
Комментарии
Комментарии – это просто текст, в котором программист объясняет, как работает его код. Если какой-то фрагмент кода помечен как комментарий, то ESP-модуль проигнорирует его и не будет обрабатывать. Комментарии начинаются с двух тире («--»). Вот два типа комментариев:
- Однострочные комментарии:
print("Hello World!") –- комментарий в одну строчку
- Многострочные комментарии:
--[[ print("Hello World!") – это многострочный комментарий --]]
Операторы
Оператор – это символ, который говорит интерпретатору выполнить определенное математическое или логическое действие. В язык Lua встроено много операторов разных типов:
- Арифметические операторы;
- Операторы сравнения;
- Логические операторы;
- Прочие операторы;
Читая таблицы и примеры ниже, представьте, что имеете дело с двумя переменными: «А», в которой хранится значение «1», и «B», в которой хранится значение «2».
A = 1
B = 2
Арифметические операторы
Оператор | Пример | Результат |
---|---|---|
+ | A + B | 3 |
- | A - B | -1 |
* | A * B | 2 |
/ | B / A | 2 |
% | B % A | 0 |
^ | B^2 | 4 |
- | -A | -1 |
Операторы сравнения
Оператор | Пример | Результат |
---|---|---|
== | (A == B) | false |
~= | (A ~= B) | true |
> | (A > B) | false |
< | (A < B) | true |
>= | (A >= B) | false |
<= | (A <= B) | true |
Логические операторы
Оператор | Пример | Результат |
---|---|---|
and (и) | (A and B) | false |
or (или) | (A or B) | true |
not (не) | !(A and B) | true |
Оператор конкатенации
Теперь представьте, что у нас две новые переменные:
a = "Hello!"
b = "World!"
Оператор | Пример | Результат |
---|---|---|
.. | a..b | "Hello World!" |
Циклы
Цикл позволяет выполнить блок кода несколько раз, пока выполняется заданное условие. Во фрагменте кода ниже – пока значением в переменной «boolean_value» является «true».
-- цикл while
while boolean_value
do
-- код будет выполняться, пока в «boolean_value» будет «true»
end
-- и цикл for
for min, max, increment
do
-- код будет выполняться, пока не будет достигнуто макс. значение
end
Операторы if… else
Операторы if... else (т.е. «если... иначе») – один из самых важных инструментов для управления программой. Они используются следующим образом:
if boolean_value then
-- если в переменной «boolean_value» значение «true»
else
-- если в переменной «boolean_value» значение «false»
end
Названия этих операторов говорят сами за себя. Если выполнено условие «boolean_value=true», то программа выполнит код, идущий после «if». Но если условием является «boolean_value=false», то программа выполнит код, идущий после «else».
Функции
Функции – отличный способ организации кода. Если вы хотите сделать в программе что-либо несколько раз, вам необязательно по несколько раз прописывать этот код. Можно просто создать отдельную функцию, содержащую этот код, а затем вызывать ее, когда вам нужно.
Ниже показано, как создать новую функцию, принимающую один параметр (температуру в градусах Кельвина) и преобразующую это значение в градусы Цельсия и Фаренгейта.
function displayTemperature(kelvin)
celsius = kelvin – 273.15
print("Temperature in Celsius is: ", celsius)
fahrenheit = (celsius*9/5+32)
print("Temperature in Fahrenheit is: ", fahrenheit)
end
k = 294 –- температура в градусах Кельвина
displayTemperature(k) –- эта строчка вызывает функцию, созданную выше
Загрузка прошивки NodeMCU на ESP8266
NodeMCU – это прошивка, позволяющая программировать модули ESP8266 скриптами формата LUA, и это очень похоже на программирование Arduino. Скрипты NodeMCU, как и скетчи для Arduino, позволяют настроить WiFi-соединение, управлять GPIO-контактами, превратить ESP8266 в веб-сервер и многое другое. О том, как загрузить на ESP8266 прошивку NodeMCU, читайте тут.
Схема для подключения к 3,3-вольтовому программатору
Чтобы загружать скрипты на ESP8266, между ним и программатором FTDI нужно установить последовательное соединение. Вот так выглядит распиновка ESP8266:
Чтобы подсоединить ESP8266 и программатор, нужно подключить друг к другу следующие контакты:
- Контакт RX на ESP8266 – к контакту TX на программаторе FTDI
- Контакт TX – к контакту RX
- Контакт CH_PD – к контакту 3.3V
- Контакт VCC – к контакту 3.3V
- Контакт GND – к контакту GND
Загрузка ESPlorer IDE
Для записи LUA-файлов на ESP8266 рекомендую использовать программу ESPlorer IDE, написанную пользователем 4refr0nt. Чтобы скачать и установить ESPlorer IDE, проделайте следующее:
- Кликните здесь, чтобы загрузить ZIP-архив с ESPlorer IDE
- Распакуйте ZIP-архив
- Пройдите в папку «dist» (она находится по маршруту «ESPlorer-master\ESPlorer\dist»)
- Запустите файл «ESPlorer.jar». Это программа на JAVA, поэтому JAVA должна быть установлена на вашем компьютере.
- Откройте ESplorer IDE
В результате должно открыться вот такое окно:
Как отправлять команды на ESP8266
Открыв ESPlorer IDE, проделайте следующее:
- Подключите программатор FTDI к компьютеру
- Выберите порт, к которому подключен программатор FTDI (например, COM8)
- Нажмите кнопку «Open/Close»
- Выберите вкладку «NodeMCU+MicroPython»
- Скопируйте в ESPlorer IDE скрипт, показанный ниже
Примечание: Впишите во вторую строчку данные, соответствующие вашей сети.
wifi.setmode(wifi.STATION)
wifi.sta.config("YOUR_NETWORK_NAME","YOUR_NETWORK_PASSWORD")
print(wifi.sta.getip())
conn=net.createConnection(net.TCP, 0)
conn:on("receive", function(conn, payload) print(payload) end )
conn:connect(80,"api.coindesk.com")
conn:send("GET /v1/bpi/currentprice.json HTTP/1.1\r\nHost: api.coindesk.com\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n")
Затем просто нажмите на кнопку «Save to ESP». После этого в правой части ESPlorer IDE должен курс биткоина и другая информация. Все элементы ESPlorer IDE, необходимые для этих действий и содержащие нужные данные, выделены на картинке ниже красным цветом:
Извлеченные данные
Доступ к данным, которые запрашивает ESP8266, можно получить и через браузер – вот они. Это курс биткоина в американских долларах, фунтах стерлингов и евро:
{"time":{"updated":"May 16, 2017 13:11:00 UTC","updatedISO":"2017-05-16T13:11:00+00:00","updateduk":"May 16, 2017 at 14:11 BST"},"disclaimer":"This data was produced from the CoinDesk Bitcoin Price Index (USD). Non-USD currency data converted using hourly conversion rate from openexchangerates.org","chartName":"Bitcoin","bpi":{"USD":{"code":"USD","symbol":"$","rate":"1,705.9225","description":"United States Dollar","rate_float":1705.9225},"GBP":{"code":"GBP","symbol":"£","rate":"1,322.6256","description":"British Pound Sterling","rate_float":1322.6256},"EUR":{"code":"EUR","symbol":"€","rate":"1,539.9823","description":"Euro","rate_float":1539.9823}}}
Возможные проблемы
Иногда ESP8266 не успевает отправить HTTP-запрос, когда вы нажимаете на кнопку «Send to ESP», и в итоге никаких данных не извлекает. В этом случае можно воспользоваться функцией «Send current line to ESP8266». Она отправляет строчки скрипта не сразу, а поочередно.
Что дальше
Итак, мы научились извлекать данные о курсе биткоина, но это кажется не слишком нужным и полезным, верно? Нет! Потому что при помощи ESP8266 из сети можно извлекать совершенно разную информацию. К примеру, данные о погоде или финансах, спортивную статистику и т.д. Просто поищите в интернете «weather api», «finances api» и т.д.
См.также
Внешние ссылки
ESP8266 AT-команды | |
---|---|
Список AT-команд | |
Базовые команды |
|
Команды для WiFi |
|
Команды для TCP/IP |
|