ส่ง Sensor Data ผ่านเครือข่าย Helium IoT
1.อุปกรณ์ที่ใช้
- Heltec Wifi LoRa OLED V.2 เลือกเอาที่บัดกรีขามาเสร็จก็จะสดวกเพราะบัดกรีเองไม่ง่ายนักเพราะมันมีสายแพรของ OLED บังขาอยู่
ราคาประมาณ 900 บาท (ในตลาดมีจำหน่ายอยู่หลายรุ่นหลายแบบ ต้องเลือกรุ่นที่ใช้ Chip Semtech SX1276 ซึ่งใช้ความถี่ได้ในย่าน 863–928Mhz ซึ่งมาตั้งความถี่ใช้งาน AS923 ได้ อย่าซื้อรุ่นที่ใช้ Chip SX1278 ซึ่งราคาถูกแต่ใช้ความถี่ย่านต่ำ) - Sensor AHT10 ราคาประมาณ 100 บาท
- Breadboard ขนาด 8.2x5.5x1ซม. ราคาประมาณ 65 บาท
- สาย Jumper Wire
2.ติดตั้ง Pycom MicroPython Firmware ลงบน Heltec LoRa V.2
ดาวน์โหลด Firmware Pycom LoRaWAN 1.0.2 สำหรับ Heltec ได้จากเวป คลิก หรือ github.com
มีสอง File
- HELTEC_WS-1.20.2.rc6.tar.gz Tar-Ball สำหรับ Heltec Wireless Stick, 800–900MHz (8MB)
-HELTEC_WSL-1.20.2.rc6.tar.gz Tar-Ball สำหรับ the Heltec Wireless Stick Lite, 800–900MHz (4MB)
เลือก HELTEC_WS-1.20.2.rc6.tar.gz แล้วแตกไฟล์
3.Flash Firmware ด้วย ESPtool Web Application
เปิดเวป คลิก
ขั้นตอนที่ 1 ตั้งค่า Baud Rate 921600 และ Connect (อาจกด Erase Flash ก่อนหากต้องการล้างข้อมูลเก่าและกรณีใช้ความเร็วที่ 912600 ไม่ได้อาจเลือกต่ำลงเช่น 460800 หรือ 115200 ส่วนของผู้เขียนสามารถใช้ได้ที่ 921600)
ขั้นตอนที่ 2 เลือกไฟล์ Bin และตั้ง Address ตามที่แสดงต่อไปนี้
0x1000 bootloader.bin
0x8000 partitions_8MB.bin
0x10000 heltec.bin
เลือกเรียบร้อยให้กด Program เสร็จแล้วให้ปิดหน้าเวป เพื่อปลดล๊อค Com Port
4.เชื่อมสาย Heltec เข้ากับ Sensor AHT10
การเชื่อมต่อสายไฟตามภาพด้านล่าง เป็นการเชื่อมเข้าขา I2C ของ Heltec เข้ากับ Sensor
5.เรียกโปรแกรม Thonny
ตั้งค่า Port ให้ตรงกับที่ใช้กับ Heltec เข้าเมนู Tools/Option/Interpreter
จะเห็นการเชื่อมต่อและได้ Prompt >>> ในหน้าจอ Shell
ให้ติดตั้งโปรแกรมและ Lib ที่จำเป็นลงใน MicroPython Device ตัว library อาจจะลงใน /flash/lib (โหลดตัวอย่างโปรแกรมและ library ที่ต้องใช้โดยดูหัวข้อที่ 9)
โปรแกรมที่ run ทดสอบคือ otaaOledAHT05.py ให้ตั้งค่า Key ทั้งสามให้ตรงกับใน console.helium.com
app_eui = ubinascii.unhexlify('ABABABABABABABAB')
app_key = ubinascii.unhexlify('45ADB18947EF42ADC36231E01E508499')
dev_eui = ubinascii.unhexlify('70B3D57ED006B0AA')
6. Console Helium
เปิด Console Helium ที่ คลิก สมัครการใช้งานให้เรียบร้อย และเช็คดูว่ามี DC (Data Credit) เพียงพอการใช้งาน
6.1 Add Profile
คลิก + เลือก ADR แล้ว Save
6.2 Add Device
คลิก + ด้านล่างขวาเลือก Add Device
Copy Keysทั้งสามตัวไปใส่ในโปรแกรม MicroPython หรือหากมี Key อยู่แล้วใน โปรแกรม MicroPython ก็ Copy มาทับบน Console Helium
6.3 Add Function (Decode Function)
กด + มุมล่างชวา เลือก Add Function ใส่ชื่อ FunctionName เป็น cayenne และ Decode เป็น Cayenne
6.4 Add Integration MQTT
เพิ่ม Integration mosquitto ระบุ Server , Port, topic ตามภาพ
6.5 Add Flow
ลาก Device, Function, Integration ที่ต้องการมาปล่อยไว้กลางจอ แล้วเชื่อมจุดOutput Input ตามภาพ เสร็จแล้วให้ Save ไว้
6.6 Monitor การทำงานของ Device
เริ่ม Run โปรแกรม otaaOledAHT05.py ดูหน้า Console จะเห็นมีจุดขึ้นบน Graph เช่น จุด Join Request, Join Accept หากมีจุดแสดงแสดงว่า เริ่มมีการส่งข้อมูล ถึง Cloud Helium หากข้อมูลส่งต่อไป Integration ที่เราตั้งไว้สำเร็จ สีของจุดจะเป็นสีฟ้าตามภาพ
ใน Event Logก็มีข้อมูลแสดงมากขึ้น ข้อมูลจะขึ้นครั้งละบรรทัดตามที่ส่งเข้ามาแต่ละครั้ง
ตัวอย่างหน้าจอตอน run MicroPython Script
7. เปิด MQTT Explorer
ให้ ดาวน์โหลดและติดตั้งโปรแกรม MQTT Explorer สามารถ Download ได้จาก คลิก
เราจะใช้ MQTT Explorer เพื่อตรวจเช็คชื่อ Topic และ JSON ของ Packet ข้อมูล
เรียกโปรแกรม แล้วกดสร้าง Connection เพิ่ม โดยกดที่ + สีแดง
กำหนด Name ตามที่ต้องการ เลือก Protocal mqtt:// , Host test.mosquitto.org, Port 1883 แล้วกด Save และกด Connect (ตามที่เรากำหนดใน Integration ใน Console Helium)
ช่อง Search ให้พิมพ์ชื่อ Topic ที่เราใช้ เช่น helium จะเจอข้อมูลจาก Sensor
จะเห็นข้อมูล Temperature และ humidity เป็นค่าที่เราส่งจาก Sensor เมื่อข้อมูลขึ้น MQTT Server แล้วเราสามารถดึงมาเก็บลง Influxdb หรือสร้าง Dashboard ดูข้อมูลได้ตามต้องการ
ตัวอย่าง JSON
{"app_eui":"ABABABABABABABAB","dc":{"balance":4719,"nonce":1},"decoded":{"payload":[{"channel":1,"name":"temperature","type":103,"unit":"celcius","value":29.1},{"channel":1,"name":"temperature","type":103,"unit":"celsius","value":29.1},{"channel":3,"last":true,"name":"humidity","type":104,"unit":"percent","value":77.5}],"status":"success"},"dev_eui":"70B3D57ED006B08D","devaddr":"0E000048","fcnt":6,"hotspots":[{"channel":1,"frequency":923.4,"hold_time":0,"id":"11vquD5wB3CNkiPZ5j4jDq73ip76JTYAFcnAoWUbJ5pMpR8qYMe","lat":131.799271017479079,"long":150.33836696273838,"name":"AX","reported_at":1730947596409,"rssi":-77.0,"snr":12.800000190734863,"spreading":"SF7BW125","status":"success"}],"id":"ec4ac809-af29-4434-9ec3-ba1afdfbc6d9","metadata":{"adr_allowed":true,"cf_list_enabled":false,"multi_buy":1,"organization_id":"5a7d8498-f75a-4d10-b929-1c8cfb536eb8","preferred_hotspots":[],"rx_delay":14,"rx_delay_actual":14,"rx_delay_state":"rx_delay_established"},"name":"heltecpycom","payload":"AWcBIwNomw==","payload_size":7,"port":2,"raw_packet":"QA4AAEgABgACqhJ9DlmK2Tjc5Ic=","replay":false,"reported_at":1730947596409,"type":"uplink","uuid":"6f3ffaa4-22d9-4977-9462-e243fbce1167"}
Copy JSON ไปลงใน NotePad++ ที่ติดตั้ง Plugin JSON Viewer ไว้แล้ว จะเห็นรูปแบบข้อมูลการส่งเข้า MQTT Server
8.ดูข้อมูลด้วยแอป IOT MQTT Panel บนมือถือ Android
ติดตั้งแอป IoT MQTT Panel จาก Google Play
8.1 กำหนดค่าให้แสดง Temperature
เลือกค่าที่ต้องการแสดง เช่น
8.2 กำหนดค่าให้แสดง Humidity
กำหนด Topic เหมือนแสดงอุณหภูมิ และใส่ $.decoded.payload[2].value ในช่อง JsonPath
อาจจะปรับปรุง Dashboard ให้ดูง่ายขึ้นหรือมีข้อมูลมากขึ้นโดยเพิ่ม Sensor ขึ้นได้อีกตามต้องการ
9.โปรแกรม otaaOledAHT05.py และ Library
Download ได้จาก คลิก โหลด otaaOledAHT05.py และ lib ที่ใช้ เช่น ahtx0.py, cayennelpp.py, ssd1306.py
import machine
import socket
import time
import ubinascii
import ssd1306
import ahtx0
from network import LoRa
from cayennelpp import CayenneLPP
from ssd1306 import SSD1306_I2C
from machine import Pin, I2C
from time import sleep
led = machine.Pin('P22', machine.Pin.OUT)
pin16 = machine.Pin('P8', machine.Pin.OUT)
pin16.value(1)
i2c = I2C(0, pins=('P3','P4'))
devices = i2c.scan()
oled=ssd1306.SSD1306_I2C(128,64,i2c)
sensor = ahtx0.AHT10(i2c)
lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.AS923, tx_power=14)
app_eui = ubinascii.unhexlify('ABABABABABABABAB')
app_key = ubinascii.unhexlify('45ADB18947EF42ADC36231E01E508499')
dev_eui = ubinascii.unhexlify('70B3D57ED006B0AA')
lora.join(activation=LoRa.OTAA, auth=(dev_eui, app_eui, app_key), timeout=0)
oled.text("LoRaWAN Thailand",0,0)
oled.text("Trying to Join",0,20)
oled.show()
while not lora.has_joined():
oled.text("LoRaWAN Thailand",0,0)
oled.text("Trying to Join",0,20)
oled.text("X",15,30)
oled.show()
time.sleep(1)
oled.text("O",15,30)
oled.show()
time.sleep(1)
oled.fill(0)
print('Not yet joined...')
print('Joined')
s = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
sensor = ahtx0.AHT10(i2c)
count=0
while True:
temp=round(sensor.temperature,2)
hum=round(sensor.relative_humidity,2)
print( "------------------------------------")
print( "Packet #{}".format( count) )
print("AHT10 values:")
print('temp:', temp, ' Hum:', hum )
print( "------------------------------------")
print(lora.stats())
print("TX Freq:",lora.stats().tx_frequency)
print("RSSI:",lora.stats().rssi)
oled.fill(0)
oled.text("LoRaWAN Thailand",0,0)
oled.text("Temp: "+str(temp), 0, 10)
oled.text("Hum: "+str(hum), 0, 20)
oled.text("Count "+str(count), 0, 30)
oled.text("Freq : "+str(lora.stats().tx_frequency), 0, 40)
oled.text("RSSI : "+str(lora.stats().rssi), 0, 50)
oled.show()
c = CayenneLPP()
c.addTemperature(1, float(temp))
c.addRelativeHumidity(3, float(hum))
msg=bytes(list(c.getBuffer()))
s.setblocking(True)
led.value(1)
sleep(0.5)
led.value(0)
sleep(10)
s.send(msg)
s.setblocking(False)
print(type(lora.stats()))
print(lora.stats())
data = s.recv(64)
print('Downlink:',data)
count=count+1
หมายเหตุ
1.ตัวอย่างจะใช้ Mqtt Server ที่เป็นสาธารณะ กรณีการใช้งานจริงอาจจะเลือกใช้ MQTT Server เราเองที่มีความปลอดภัยกว่าตัวอย่าง
2. Code นี้หรือวิธีการนี้ยังสามารถนำไปใช้ กับ LoRaWAN Network Server ตัวอื่นได้ เช่น Chirpstack หรือ TheThingsNetwork เป็นต้น โดยเลือกการ Join แบบ OTAA และ LoRaWAN 1.0.2 Device
3.อาจจะเปลี่ยนไปใช้ Sensor ASAIR AM2315C ซึ่งใช้ Chip AHT10 โดยไม่ต้องเปลี่ยนโปรแกรมเนื่องจากใช้ Chip เดียวกัน
4.หากอยู่ในประเทศไทยควรกำหนด TX Power ให้ต่ำกว่า 50mW (eirp) เช่น กำหนด tx_power=14
5.ยังสามารถเชื่อมต่อกับพวก Smart Meter อื่นๆ ผ่าน Protocal Modbus RTU ได้ เช่น Energy Meter, Soil Sensor ที่ใช้ RS485