筆者:魔法少女
マイコン「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> |