[Node.js x MQTT] ラスパイをMQTTクライアントにしてリモートからGPIOを制御する
※ 当ページには【広告/PR】を含む場合があります。
2020/09/20
サブスクライバー側の実装
+ メインスイッチを押す度にON/OFF
+ 3段階の風量調節(弱/中/強)
+ リズムモードの切り替え
+ タイマー4段階(オフ/1時間/2時間/4時間)
GPIO5:
電源のオンオフ
GPIO6:
回転速度の切り替え
GPIO7:
運転モード(連続/リズム)の切り替え
GPIO8:
タイマー時間の切り替え
$ pinout
,--------------------------------.
| oooooooooooooooooooo J8 +====
| 1ooooooooooooooooooo PoE | USB
| Wi oo +====
| Fi Pi Model 3B+ V1.3 oo |
| ,----. +====
| |D| |SoC | | USB
| |S| | | +====
| |I| `----' |
| |C| +======
| |S| | Net
| pwr |HDMI| |I||A| +======
`-| |--------| |----|V|-------'
Revision : a020d3
SoC : BCM2837
RAM : 1024Mb
Storage : MicroSD
USB ports : 4 (excluding power)
Ethernet ports : 1
Wi-fi : True
Bluetooth : True
Camera ports (CSI) : 1
Display ports (DSI): 1
J8:
3V3 (1) (2) 5V
GPIO2 (3) (4) 5V
GPIO3 (5) (6) GND
GPIO4 (7) (8) GPIO14
GND (9) (10) GPIO15
GPIO17 (11) (12) GPIO18
GPIO27 (13) (14) GND
GPIO22 (15) (16) GPIO23
3V3 (17) (18) GPIO24
GPIO10 (19) (20) GND
GPIO9 (21) (22) GPIO25
GPIO11 (23) (24) GPIO8
GND (25) (26) GPIO7
GPIO0 (27) (28) GPIO1
GPIO5 (29) (30) GND
GPIO6 (31) (32) GPIO12
GPIO13 (33) (34) GND
GPIO19 (35) (36) GPIO16
GPIO26 (37) (38) GPIO20
GND (39) (40) GPIO21
For further information, please refer to https://pinout.xyz/
package.json
{
"name": "mqtt-sub",
"version": "0.0.1",
"dependencies": {
"mqtt": "~4.2.0",
"pigpio": "^3.2.1"
}
}
$ npm install
#OR
$ yarn install
subscrive.js
subscrive.js
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://192.168.0.200');
const Gpio = require('pigpio').Gpio;
const topic = 'gpio';
const gpio5 = new Gpio(5, {mode: Gpio.OUTPUT});
const gpio3 = new Gpio(6, {mode: Gpio.OUTPUT});
const gpio4 = new Gpio(7, {mode: Gpio.OUTPUT});
const gpio5 = new Gpio(8, {mode: Gpio.OUTPUT});
const switch_timeout = 500;
client.on('connect', () => {
console.log('Subscriber connected.');
});
client.subscribe(topic, (err, granted) => {
console.log('Subscriber subscribed.');
});
client.on('message', (topic_, message) => {
console.log(
'Subscriber received topic:',
topic_, 'message:', message.toString()
);
const gpioState = message.toString();
if (gpioState == 'power') {
setTimeout(() => gpio5.digitalWrite(0), switch_timeout);
gpio5.digitalWrite(1);
} else if (gpioState == 'speed') {
setTimeout(() => gpio6.digitalWrite(0), switch_timeout);
gpio6.digitalWrite(1);
} else if (gpioState == 'mode') {
setTimeout(() => gpio7.digitalWrite(0), switch_timeout);
gpio7.digitalWrite(1);
} else if (gpioState == 'timer') {
setTimeout(() => gpio8.digitalWrite(0), switch_timeout);
gpio8.digitalWrite(1);
}
});
192.168.0.200
gpio
'power' / 'speed' / 'mode' / 'timer'
//...
setTimeout(() => gpio.digitalWrite(0), 500);
gpio.digitalWrite(1);
//...
digitalWrite(1)
digitalWrite(0)
$ node subscrive.js
パブリッシャー側の実装
package.json
{
"name": "mqtt-pub",
"version": "0.0.1",
"dependencies": {
"mqtt": "~4.2.0",
"argparse": "^2.0.1"
}
}
'power' / 'speed' / 'mode' / 'timer'
$ npm install
#OR
$ yarn install
publish.js
const mqtt = require('mqtt');
const client = mqtt.connect('mqtt://192.168.0.200');
const { ArgumentParser } = require('argparse');
const parser = new ArgumentParser({
description: 'command options for mqtt publisher'
});
parser.add_argument('-c', '--cmd', { defaultValue: 'power', help: 'Command sets to control a fan.' });
const topic = 'gpio';
client.on('connect', () => {
console.log('Publisher sends a command.');
client.publish(topic, parser.parse_args().cmd);
setTimeout(() => process.exit(0), 500);
});
#扇風機のオン・オフ
$ node publish.js
#回転速度(弱・中・強)の切り替え
$ node publish.js -c speed
#運転モード(連続・リズム)の切り替え
$ node publish.js -c mode
#タイマーモード(オフ・1時間・2時間・4時間)の切り替え
$ node publish.js -c timer
まとめ
記事を書いた人
ナンデモ系エンジニア
電子工作を身近に知っていただけるように、材料調達からDIYのハウツーまで気になったところをできるだけ細かく記事にしてブログ配信してます。
カテゴリー