筆者:魔法少女
マイコン「ESP32」と小型コンピュータボード「Raspberry Pi」を使って本格的なIoT(Internet of Things、モノのインターネット)環境を構築してみましょう。本企画では、3軸の加速度センサーを用いて簡易地震計を作成し、リアルタイムに揺れをグラフで表示します。
シェルスクリプトマガジン Vol.78は以下のリンク先でご購入できます。![]()
![]()
図4 Eclipse Mosquittoの設定スクリプト(mosquitto_setting.sh)
| 
					 1 2 3 4 5 6 7 8 9  | 
						#!/bin/sh sudo tee /etc/mosquitto/conf.d/confer.conf << EOF >dev/null listener 1883 allow_anonymous true listener 8081 protocol websockets sudo systemctl reload mosquitto  | 
					
図18 ESP32搭載ボートの起動時に無線LANに接続するプログラム(boot.py)
| 
					 1 2 3 4 5 6 7 8 9  | 
						import network SSID = 'SSID' PASSWORD = 'パスワード' wlan_if = network.WLAN(network.STA_IF) wlan_if.active(True) wlan_if.connect(SSID, PASSWORD)  | 
					
図19 パブリッシャのプログラム(main.py)
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25  | 
						import time from machine import Pin, SoftI2C import mpu6050 from umqtt.simple import MQTTClient import json mqtt_topic = "home/seismometer1" publisher_id = "place_esp32" broker_address = "192.168.1.100" interval_time = "1" i2c = SoftI2C(scl=Pin(22), sda=Pin(21)) accelerometer = mpu6050.accel(i2c) time.sleep(5) while True:   iot_value = accelerometer.get_values()   iot_value_json = json.dumps(iot_value)   print(iot_value_json)   publisher = MQTTClient(publisher_id,broker_address)   publisher.connect()   publisher.publish(mqtt_topic, msg=str(iot_value_json))   publisher.disconnect()   time.sleep(int(interval_time))  | 
					
図24 ブスクライバとなるJavaScriptプログラムを含んだHTMLファイル(seismometer.html)
| 
					 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78  | 
						<!DOCTYPE html> <html lang="en"> <head>   <meta charset="utf-8">   <title>簡易地震計</title>   <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.9.3/Chart.bundle.min.js"></script>   <script src="https://cdn.jsdelivr.net/npm/chartjs-plugin-streaming@1.9.0"></script>   <script src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script> </head> <body>   <canvas id="myChart"></canvas>   <script>     const client = mqtt.connect('ws://raspibroker.local:8081');     const ctx = document.getElementById('myChart').getContext('2d');     var chart = new Chart(ctx, {       type: 'line',       data: {         datasets: [{           data: [],           label: 'X軸',           borderColor: 'rgb(255, 0, 255)',           backgroundColor: 'rgba(255, 255, 255, 0)',           lineTension: 0,         }, {           data: [],           label: 'Y軸',           borderColor: 'rgb(0, 255, 0)',           backgroundColor: 'rgba(255, 255, 255, 0)',           lineTension: 0,         }, {           data: [],           label: 'Z軸',           borderColor: 'rgb(0, 0, 255)',           backgroundColor: 'rgba(255, 255, 255, 0)',           lineTension: 0,         }]       },       options: {         scales: {           xAxes: [{             type: 'realtime',             realtime: {               delay: 2000,             },           }],           yAxes: [{             ticks: {               min: -32767,               max: 32767             }           }]         }       }     });     client.on('connect', () => {       console.log('connected');       client.subscribe('home/seismometer1');     });     client.on('message', (topic, message) => {       console.log(message.toString());       acc_json = JSON.parse(message.toString());       chart.data.datasets[0].data.push({         x: Date.now(),         y: acc_json.AcX       });       chart.data.datasets[1].data.push({         x: Date.now(),         y: acc_json.AcY       });       chart.data.datasets[2].data.push({         x: Date.now(),         y: acc_json.AcZ - 16384       });       chart.update();     });   </script> </body> </html>  |