JavaScript в мире Embedded: от лампочки до IoT
Когда мы слышим «встраиваемые системы» (embedded systems), в голове обычно всплывают ассоциации с языками C, C++ или, на худой конец, Python на Raspberry Pi. Но что, если я скажу вам, что JavaScript — тот самый язык, на котором вы пишете фронтенд и бэкенд, — всё активнее проникает в мир микроконтроллеров, датчиков и умных устройств?
Да, вы не ослышались. Embedded разработка на JavaScript — это не шутка, а вполне себе рабочий тренд, который набирает обороты благодаря появлению таких фреймворков, как Espruino и Johnny-Five. Сегодня мы разберёмся, как заставить вашего «железного друга» мигать светодиодами, читать данные с датчиков и отправлять их в облако — и всё это на чистом JavaScript.
Почему JavaScript в embedded? Три весомых причины
Казалось бы, зачем тащить скриптовый язык в мир ограниченных ресурсов? Вот три аргумента, которые переворачивают представление:
- Низкий порог входа. Если вы уже знаете JS (а кто его сейчас не знает?), вам не нужно учить C и разбираться с указателями. Весь ваш опыт — с фронтенда или Node.js — переносится на железо.
- Быстрое прототипирование. Написать прошивку на JS можно за вечер. Не нужно ждать компиляции, перепрошивки — многие платформы поддерживают live-загрузку кода через Wi-Fi или USB.
- IoT-экосистема. JavaScript идеально ложится в архитектуру «умных» устройств: вы легко интегрируетесь с MQTT, HTTP, WebSockets и облачными сервисами (AWS IoT, Google Cloud IoT).
Конечно, для продакшена с жёсткими требованиями по энергопотреблению и скорости C++ остаётся королём. Но для прототипов, хобби-проектов и образовательных задач embedded JavaScript — это настоящая находка.
Инструментарий: с чем работаем
Прежде чем писать код, давайте определимся с «железом». Самые популярные варианты для embedded на JS:
- Espruino — микроконтроллер, который «из коробки» понимает JavaScript. Работает на STM32, имеет интерпретатор JS прямо на борту. Идеален для обучения.
- Raspberry Pi Pico + Espruino — недорогой микроконтроллер (всего $4), на который можно залить прошивку Espruino.
- Johnny-Five + Arduino — классика. Вы пишете JS на компьютере, а Johnny-Five через Firmata-протокол управляет Arduino. Подходит для тех, у кого уже есть Arduino.
- Node.js на Raspberry Pi (полноценный Linux) — если вам нужно не просто мигать светодиодом, а поднять веб-сервер, управлять GPIO и камерами — берите Pi 4/5.
В этой статье мы сфокусируемся на Espruino и Johnny-Five, так как они дают максимально чистый JS-опыт без лишних прослоек.
Пишем код: мигаем светодиодом на JS
Давайте начнём с «Hello, World!» в мире embedded — мигающего светодиода. Подключите светодиод (с резистором 220 Ом) к пину D13 на Espruino (или к пину 13 на Arduino).
Пример 1: Espruino (нативный JS)
// Подключаем пин D13 как выход
var led = LED1; // Встроенный светодиод на Espruino
// Функция мигания
function blink() {
led.toggle(); // Переключаем состояние
console.log('LED is', led.read() ? 'ON' : 'OFF');
}
// Устанавливаем интервал 500 мс
setInterval(blink, 500);
Загрузите этот код через Espruino Web IDE (или через терминал). Светодиод начнёт мигать с частотой 1 Гц. Обратите внимание: мы используем setInterval — точно так же, как в браузере или Node.js. Никаких регистров, таймеров и прерываний на C — просто JS.
Пример 2: Johnny-Five + Arduino
Если у вас Arduino, установите библиотеку Johnny-Five через npm:
npm install johnny-five
Теперь напишем скрипт для Node.js:
const { Board, Led } = require('johnny-five');
const board = new Board();
board.on('ready', function() {
// Создаём объект светодиода на пине 13
const led = new Led(13);
// Мигаем каждые 500 мс
led.blink(500);
// Через 5 секунд останавливаем мигание
this.wait(5000, function() {
led.stop().off();
console.log('Blinking stopped');
});
});
Johnny-Five предоставляет высокоуровневый API: Led.blink(500) — это целый таймерный движок под капотом. Вы можете управлять сервоприводами, моторами, датчиками — всё через простые JS-объекты.
Читаем данные с датчика температуры (DHT11)
Теперь перейдём к более полезному сценарию — считываем температуру и влажность с датчика DHT11. Подключите датчик к пину D4 (Espruino) или к цифровому пину 2 (Arduino).
Espruino + DHT11
// Подключаем модуль DHT
var dht = require('DHT11').connect(D4);
// Функция чтения
function readSensor() {
dht.read(function(data) {
console.log('Temperature:', data.temp, '°C');
console.log('Humidity:', data.humidity, '%');
});
}
// Читаем каждые 2 секунды
setInterval(readSensor, 2000);
Обратите внимание: мы используем require('DHT11') — точно так же, как подключаем модули в Node.js. Espruino имеет встроенную библиотеку для популярных датчиков.
Johnny-Five + DHT11
const { Board, Sensor } = require('johnny-five');
const board = new Board();
board.on('ready', function() {
// Создаём датчик температуры (пин A0 — аналоговый)
const tempSensor = new Sensor({
pin: 'A0',
freq: 2000 // опрос каждые 2 секунды
});
tempSensor.on('data', function() {
// Преобразуем аналоговое значение в температуру
var voltage = this.value * 5.0 / 1023;
var temperature = (voltage - 0.5) * 100;
console.log('Temperature:', temperature.toFixed(2), '°C');
});
});
Конечно, для DHT11 лучше использовать специальную библиотеку johnny-five-dht, но для демонстрации подойдёт и аналоговый датчик LM35.
IoT в действии: отправляем данные в облако
Самое интересное начинается, когда embedded-устройство начинает об