Maixduino で温度、pHデータをUDP送信 ーエッジAI活用への道 10ー
素晴らしき金魚水槽システムの実現を目指し、 Sipeed Maixduino で金魚水槽の 温度、pH値 を取得してUDP送信し、それをブラウザ表示、データベース保存までを実施しております。また水草育成促進のためにLED照射も実施しています。
データのUDP送信のご報告が抜けておりましたので、ここでさせていただきます。
目次
構成
Arduinoマイコンにセンサを接続してUARTでデータをMaixduinoに送信して搭載されたESP32のWiFiでUDP送信しています。
部品
- Sipeed Maixduino
-
Adafruit Metro Mini 328 – 5V 16MHz
- 防水温度センサ DS18B20
- pHセンサ PH-4502C
-
フルカラーLED Neopixel (WS2812B ) 48セル
Adafruit コード
Arduino IDEでコーディングできるマイコンのAdafruit Metro Mini 328を使用して温度とpH値、pHセンサの電圧を取得して1分おきにMaixduinoへUART送信します。
Adafruit Metro Mini 328はArduino IDEにおいてAruino UNOとして振る舞いボードライブラリのインストールなどは必要ありません。
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 |
#include <OneWire.h> #include <DallasTemperature.h> #define ONE_WIRE_BUS 11 // 温度センサデータ線(黄) #define SENSER_BIT 13 // 精度の設定bit OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); float x = 0.0; char temp[10], pH[10], Vol[10]; const int analogInPin = A0; int sensorValue = 0; unsigned long int avgValue; float b; int buf[10],tmp; float pHVol = 0.0; float y = 0.0; void setup(void){ Serial.begin(9600); sensors.begin(); sensors.setResolution(SENSER_BIT); } void loop(void){ sensors.requestTemperatures(); // 温度取得要求 x = sensors.getTempCByIndex(0); dtostrf(x, 6, 2, temp); for(int i=0;i<10;i++) { buf[i]=analogRead(analogInPin); delay(10); } for(int i=0;i<9;i++){ for(int j=i+1;j<10;j++){ if(buf[i]>buf[j]){ tmp=buf[i]; buf[i]=buf[j]; buf[j]=tmp; } } } avgValue=0; for(int i=2;i<8;i++) avgValue+=buf[i]; pHVol=(float)avgValue*5.0/1024/6; y = -5.804 * pHVol + 21.928; dtostrf(y, 6, 2, pH); dtostrf(pHVol, 6, 2, Vol); Serial.println(temp); Serial.println(pH); Serial.println(Vol); delay(60000); } |
Maixduinoコード
MicroPythonでコーディングし、MaixPy IDEで書き込みました。
MaixduinoによるUDP送信は以下のサンプルコードを参考にしております。
https://github.com/sipeed/MaixPy_scripts/blob/master/network/demo_esp32_socket%20_udp_cli.py
Adafruit Metro Mini 328からのセンサデータをUARTで受信し、値をディスプレイ表示し、WiFiでUDP送信します。
LEDテープは急に点灯すると金魚ちゃんがビックリするとお母ちゃんに言われたので、電源投入後データ受信(1分)ごとに少しづつ輝度を上げて最終輝度に達するようにしています。
あくまで金魚ファーストです。
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 |
import network, socket import time import lcd from Maix import GPIO from fpioa_manager import fm, board_info from machine import UART from board import board_info from modules import ws2812 WIFI_SSID = "SSID" WIFI_PASSWD = "パスワード" SERVER_ADDR = "xxx.xxx.xxx.255" SERVER_PORT = 1234 lcd.init() ledNum = 48 bright = 0 class_ws2812 = ws2812(board_info.D[4],ledNum) fm.register(board_info.D[2], fm.fpioa.UART1_RX, force=True) uart_1 = UART(UART.UART1, 9600,8,0,0, timeout=1000, read_buf_len=4096) # IO map for ESP32 on Maixduino fm.register(25,fm.fpioa.GPIOHS10)#cs fm.register(8,fm.fpioa.GPIOHS11)#rst fm.register(9,fm.fpioa.GPIOHS12)#rdy fm.register(28,fm.fpioa.GPIOHS13)#mosi fm.register(26,fm.fpioa.GPIOHS14)#miso fm.register(27,fm.fpioa.GPIOHS15)#sclk nic = network.ESP32_SPI(cs=fm.fpioa.GPIOHS10,rst=fm.fpioa.GPIOHS11,rdy=fm.fpioa.GPIOHS12, mosi=fm.fpioa.GPIOHS13,miso=fm.fpioa.GPIOHS14,sclk=fm.fpioa.GPIOHS15) print("ESP32_SPI firmware version:", nic.version()) err = 0 while 1: try: nic.connect(WIFI_SSID, WIFI_PASSWD) except Exception: err += 1 print("Connect AP failed, now try again") if err > 3: raise Exception("Conenct AP fail") continue break print(nic.ifconfig()) print(nic.isconnected()) sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) sock.settimeout(1) while 1: read_data = uart_1.read() if read_data: res = read_data.split() print(res) lcd.draw_string(0, 0, res[0] + " deg", lcd.WHITE, lcd.BLACK) lcd.draw_string(0, 20, "pH", lcd.WHITE, lcd.BLACK) lcd.draw_string(25, 20, res[1], lcd.WHITE, lcd.BLACK) lcd.draw_string(0, 40, res[2] + " V", lcd.WHITE, lcd.BLACK) sock.sendto(res[0] + ", " + res[1] + "\n".encode(),(SERVER_ADDR, SERVER_PORT)) bright = 3 + bright if bright > 20: bright = 20 for i in range(ledNum): a = class_ws2812.set_led(i,(bright,bright,bright)) a=class_ws2812.display() sock.close() |
動作
水温とpHが送信されPC上でUDP送信を確認できました。
以下の動画では1秒ごとに送信してNode-REDで受信して確認しています。
#Maixduino 搭載の #ESP32 で水温とpHをUDP送信#maix #sipeed #エッジAI活用への道 pic.twitter.com/FnngXz3DaY
— HomeMadeGarbage (@H0meMadeGarbage) November 13, 2019
おわりに
どんどん金魚水槽が理想のシステムに近づいてまいりました!引き続き頑張りましょう 🙂
それでは次の道でお会いいましょう。