JavaScript в мире Embedded: от лампочки до IoT

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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-устройство начинает об

Блоги

Рекомендаций по книгам