Управление GPIO Raspberry Pi через Node.js
В этом уроке мы разберём, как управлять выводами GPIO Raspberry Pi через веб-сервер с помощью Node.js и socket.io.
Комплектующие
Для данного урока потребуется минимум оборудования — по сути, всего одно устройство, зато весьма мощное:
Raspberry Pi 3
Из этого руководства вы узнаете, как управлять выводами GPIO на Raspberry Pi через веб-сервер на базе Node.js и socket.io. На веб-странице мы разместим кнопки для включения и выключения подключённого светодиода. Прежде чем приступить к созданию веб-сервера, необходимо установить несколько пакетов.
Установка Node.js на Raspberry Pi
Первым делом нужно обновить систему Raspberry Pi.
sudo apt-get update
После этого введите следующую команду для обновления всех установленных пакетов до актуальных версий.
sudo apt-get dist-upgrade
Выполните приведённую ниже команду, чтобы установить последнюю версию Node на Raspberry Pi.
curl -sL https://deb.nodesource.com/setup_8.x | sudo -E bash -
Теперь, когда репозиторий пакетов NodeSource добавлен, можно перейти к установке Node.js.
sudo apt-get install -y nodejs
Для проверки успешности установки Node.js выполните команду, которая покажет текущую версию.
node -v
Установка onoff модуля
Для управления выводами GPIO Raspberry Pi через Node.js потребуется модуль «onoff». Установите его следующей командой:
npm install onoff
Установка socket.io для Node.js
Далее установите модуль веб-сокетов для Node.js, который обеспечит управление выводами GPIO Raspberry Pi прямо с веб-страницы.
npm install socket.io --save
Создание веб-сервера и файла HTML
Все необходимые пакеты установлены, и теперь пора создать веб-сервер и HTML-файл. Оба файла должны располагаться в одном каталоге.
Index.html
Начнём с HTML-файла, который сформирует кнопки управления в веб-браузере. Создайте файл командой nano index.html и вставьте в него приведённый ниже код.
<!DOCTYPE html>
<html>
<title>GPIO Control</title>
<body>
<h2>Control GPIO 4</h2>
<button type="button" id="state" onclick="LEDOn()" style="background-color:green;">ON</button>
<button type="button" id="state" onclick="LEDOff()" style="background-color:red;">OFF</button>
<script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.0.3/socket.io.js"></script>
<script>
var socket = io.connect(); //load socket.io-client and connect to the host
function LEDOn() {
socket.emit("state", 1); //send button state to server
}
function LEDOff() {
socket.emit("state", 0); //send button state to server
}
</script>
</html>
</body>
</html>
Подключение светодиода к Raspberry Pi
Теперь подсоедините светодиод к GPIO 4, используя резистор номиналом 220 Ом, как изображено на схеме ниже:
Создание веб-сервера
Перейдём к настройке веб-сервера. Файл Node.js будет открывать запрошенный ресурс и возвращать его содержимое, а в случае ошибки — отдавать код 404.
Создайте файл командой nano webserver.js и вставьте приведённый ниже код.
var Gpio = require('onoff').Gpio; //require onoff to control GPIO
var LEDPin = new Gpio(4, 'out'); //declare GPIO4 an output
var fs = require('fs'); //require filesystem to read html files
var http = require('http').createServer(function handler(req, res) { //create server
fs.readFile(__dirname + '/index.html', function (err, data) { //read html file
if (err) {
res.writeHead(500);
return res.end('Error loading socket.io.html');
}
res.writeHead(200);
res.end(data);
});
});
var io = require('socket.io')(http) //require socket.io module and pass the http object
http.listen(8080); //listen to port 8080
io.sockets.on('connection', function (socket) {// WebSocket Connection
var buttonState = 0; //variable to store button state
socket.on('state', function (data) { //get button state from client
buttonState = data;
if (buttonState != LEDPin.readSync()) { //Change LED state if button state is changed
LEDPin.writeSync(buttonState); //turn LED on or off
}
});
});
Веб-сервер и HTML-файл готовы, поэтому можно запустить сервер и приступить к управлению выводами GPIO Raspberry Pi.
Введите в терминале следующую команду для запуска веб-сервера:
node webserver.js
Затем откройте браузер и перейдите по адресу [Raspberrypi-ip]:8080
В моём случае это: 192.168.4.1:8080
На экране отобразятся две кнопки, и при нажатии на них светодиод, подключённый к GPIO4 Raspberry Pi, будет включаться или выключаться.