В этом уроке мы узнаем как управлять выводом 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.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-файл, который будет создавать кнопки в веб-браузере. Создайте 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, включится или выключится.