Отображение веб-API на ЖК-дисплее Arduino с помощью Node.js
Июль 17, 2018
ЖК-дисплеи. Они веселые. Это один из самых крутых способов донести голос до вашего Arduino, поскольку он говорит светящимся текстом. В этой статье мы рассмотрим, как вводить данные из веб-API и отображать их на ЖК-дисплее вашего Arduino с помощью Node.js.
Моя любимая встреча каждого месяца здесь, в Сиднее, это встреча IoT Sydney . Это отличная встреча (вы должны прийти!). В конце каждой встречи проводится случайный розыгрыш призов для тех, кто прошел RSVP. Я подумал, что пришло время сделать это в истинном стиле IoT, поэтому я собрал быструю настройку Arduino LCD, которая получает информацию RSVP о событии Meetup.com, а затем случайным образом выбирает счастливого участника. Думаю, это может быть приятным сюрпризом и намного проще, чем рисовать имена из шляпы!
Это также хорошо согласуется с текущей серией статей об Интернете вещей, которые я пишу здесь, в SitePoint. Я изучаю множество различных возможностей IoT для различных устройств. На прошлой неделе я смотрел на использование данных IoT в игровом движке Unity, а перед этим я смотрел, как получить данные из Jawbone Up .
Давайте начнем!
Ваш Arduino Sketch
Эскиз, который мы будем использовать для этого примера, выглядит так:
Это слегка измененная версия той, что вы найдете в Sparkfun Inventors Kit. Существуют и другие варианты ЖК-скетчей, которые вы можете найти в Интернете, которые перестраивают, как все связано, но будут работать так же. Возможно, вам просто нужно настроить, какие контакты вы определяете в JavaScript ниже.
Наш код JavaScript
В нашем файле JavaScript Node.js мы включаем следующее:
var express =require('express'), app =express(), server =require('http').Server(app), port =5000, five =require('johnny-five'), request =require('request'), _ =require('underscore'), board =newfive.Board(), lcd; board.on('ready',function(){ lcd =newfive.LCD({ pins:[12,11,5,4,3,2], rows:2, cols:16});this.repl.inject({ lcd: lcd });}); app.get('/chooseMember/:event_id',function(req, resp){request({ url:'https://api.meetup.com/2/rsvps?key=474cc9332345ea7d7e135f50653c&event_id='+req.params.event_id, json:true},function(error, response, body){var members = _.pluck(body.results,'member'), randomMember = members[_.random(members.length-1)]; resp.json(randomMember);console.log(randomMember.name); lcd.clear().print(randomMember.name);});}); server.listen(port,function(){console.log('Listening on '+ port);});
Настройка это шаг за шагом
Если вы хорошо знакомы с Node.js, большая часть этого кода уже будет иметь для вас смысл. Я объясню каждый бит просто для того, чтобы убедиться, что все находятся на одной странице, и предоставлю рекомендации по всем остальным, что нам нужно настроить.
Для начала мы настроим переменные нашего экспресс-сервера для подготовки к запуску сервера localhost через порт 5000:
var express =require('express'), app =express(), server =require('http').Server(app), port =5000,
Тогда у нас есть довольно важная вещь, Джонни-пять. Это библиотека npm, которая дает нам доступ к функциям, которые нам нужны для управления нашим Arduino через Node.js.
five =require('johnny-five'),
После этого мы включаем модуль request . Мы будем использовать это для отправки http-запросов от нашего сервера Node.js к API Meetup.
request =require('request'),
Для простоты и простоты мы будем использовать underscore для просмотра массивов данных.
_ =require('underscore'),
Последние две переменные — это переменные board и lcd которые мы будем использовать для хранения объектов Arduino, которые создает johnny-Five.
board =newfive.Board(), lcd;
Мы начинаем с ожидания, когда наша доска Arduino будет готова к доступу, johnny-5 отправляет событие «ready», когда наша доска готова к работе.
board.on('ready',function(){
Когда наша плата будет готова к работе, мы дадим Джонни-пять знать, к какому ЖК-дисплею мы подключились. Мы определяем контакты сверху вниз в массиве:
Мы также определяем, сколько строк и столбцов имеет наш ЖК-дисплей. В моем случае это ЖК-дисплей 2 × 16. Все это выглядит так:
Затем у нас есть код, который является необязательным (но удобным для включения), который позволит нам получать доступ к функциям ЖК-дисплея из нашей командной строки во время ее работы (я покажу это в действии позже в этой статье):
this.repl.inject({ lcd: lcd });
Затем у нас есть один-единственный запрос GET, который мы создали. В этом запросе мы ожидаем идентификатор события в URL. Например: http://localhost:5000/chooseMember/221960710 . Идентификатор события — это тот, который вы найдете в адресной строке при посещении страницы мероприятия:
Наш запрос GET для поиска этого идентификатора выглядит так:
Тогда мы перейдем к сложному фрагменту кода! Наш фактический HTTP-запрос к Meetup API. Мы получаем доступ к этому через функцию request . Здесь мы передаем две вещи: наши опции http для запроса и нашу функцию обратного вызова.
Опции для нашего вызова http содержат наш url и логическое значение, чтобы запрос знал, что мы ожидаем возвращение объекта JSON. Это выглядит так:
Внимательные наблюдатели заметят, что мы передаем наш идентификатор события из строки URL в URL запроса, используя req.params.event_id . Однако там есть еще одна строка символов, которую я не объяснил. Для доступа к API Meetup вам потребуется ключ API. Вы можете найти один из них по адресу https://secure.meetup.com/meetup_api/key/ :
Наконец, у нас есть функция обратного вызова, которая использует возвращенные данные JSON. Я сохранил это простым и без обработки ошибок, однако, если это серьезное создание производственного уровня — добавьте проверку для переменной error .
Вывод JSON, который обратный вызов вернет в нашей переменной body выглядит следующим образом:
Мы отфильтровываем многое из этого, используя _.pluck() в подчеркивании. Это поможет нам сосредоточиться на важной части нашего API — участниках, которые RSVPed. Функция _.pluck() просматривает массив results и получает только информацию о членах каждого из них.
function(error, response, body){var members = _.pluck(body.results,'member'),
Затем мы используем _.members() подчеркивания _.members() чтобы случайным образом выбрать элемент из полученного массива.
Мы возвращаем эти данные через наш экспресс-сервер как JSON-ответ на запрос GET и записываем имя в нашу консоль, чтобы мы могли видеть, кто был выбран:
Затем мы используем объект lcd johnny-Five, который мы установили ранее, чтобы распечатать имя члена на нашем ЖК-дисплее. Мы начнем с использования lcd.clear() чтобы очистить ЖК-дисплей от всего, что в данный момент находится на нем, а затем используем lcd.print() для печати lcd.print() символов.
lcd.clear().print(randomMember.name);});
Когда вы запустите это, вы заметите, что некоторые длинные имена будут обрезаны, а не переносятся на другую строку. Если вы хотите обернуть вещи во вторую строку, попробуйте разделить ваше randomMember.name на две строки по 16 символов, выведите первую строку и затем используйте lcd.cursor(1, 0); перейти ко второй строке перед печатью второй. В моем случае это было не нужно, так как все, что нам действительно нужно, это уметь определить, чье имя было нарисовано — несколько пропущенных символов обычно не вызывают проблем здесь.
Получив, что работает на вашем Arduino
У нас есть готовый код Node.js. Теперь подключите Arduino и убедитесь, что на нем загружен эскиз StandardFirmata:
Нам также нужно убедиться, что у нас все зависимости разобраны. Мой файл package.json выглядит так:
{"name":"MeetupRSVPSelector","version":"1.0.0","description":"Connecting the Meetup API to our Arduino LCD","main":"rsvp-selector.js","author":,"dependencies":{"express":"^4.12.3","johnny-five":"^0.8.34","request":"^2.55.0","underscore":"^1.8.3"}}
Не стесняйтесь адаптировать это к вашему собственному проекту, главное, что вам нужно — это зависимости.
Затем, как только вы разобрались с файлом package.json , откройте консоль и перейдите в расположение вашего кода. Запустите эту замечательную команду:
Если вы запустите его снова, появится новый rsvp. Если все идет хорошо, эти имена должны появиться на ЖК-дисплее вашего Arduino!
То, что мы повторили
Мы включили немного кода, который сказал this.repl.inject на нашем сервере Node.js ранее. Это позволяет вам запускать команды из терминала, в то время как ваш сервер Node.js работает, чтобы установить, что будет отображаться на ЖК-экране:
Если мы lcd.print() мы получим что-то волшебное:
Ну … наше сообщение почти соответствует по крайней мере!
Вывод
Мы успешно получили случайно выбранного члена группы событий, который появляется на нашем ЖК-дисплее! Эта же идея может быть применена к любому количеству других API, просто отрегулируйте вызов request и способ обработки данных. Оставляйте жуткие сообщения на ЖК-дисплее для соседей по дому, следите за последними результатами матчей плей-офф NBA или любыми другими вещами, которые вам нравятся!
Сделать что-нибудь веселое на основе этого кода? Оставьте заметку в комментариях и поделитесь ей, я бы очень хотел ее увидеть!