WIO Terminal กับ LoRaWAN

Somsak Lima
5 min readJan 23, 2021

--

ด้วยมอดูล DL7612-AS923-TH

WIO Terminal เป็นผลิตภัณ์ของ SeeedStudio รูปทรงค่อนข้างกระทัดรัด มาอยู่ใน Case พร้อมใช้งาน

  • ใช้ MCU ATSAMD51P19 ARM Cortex-M4F ทำงานที่ 120MHz
  • ใช้ Chip Realtek RTL8720DN ใช้งาน Wi-Fi ได้ที่สองความถี่ 2.4Ghz / 5Ghz Wi-Fi
  • 2.4” LCD Screen
  • 40-pin GPIO แบบเดียวกับ Raspberry Pi แต่ของ WIO เป็น Pin ตัวเมีย ส่วน Raspberry Pi จะเป็น Pin ตัวผู้
  • สามารถใช้ Arduino, CircuitPython, Micropython, ArduPy, AT Firmware, Visual Studio

วิธีการเชื่อมต่อกับมอดูล LoRaWAN DL7612-AS923-TH

WIO — — — DL7612-AS923-TH
3.3 V — -3.3V
GND — -GND
TX — -RX
RX — -TX

ตัวอย่างโปรแกรม
1.โปรแกรมภาษา C ส่งข้อความ Hello ด้วย LoRa ซ้ำๆ กัน

String response = ""; 
void loop() {
sendCommand("AT+INFO\r\n");
sendCommand("AT+CGATT\r\n");
sendData(5,"HELLO");
delay(10000);
}
void setup() {
Serial.begin(115200);
Serial1.begin(115200);
sendCommand("AT\r\n");
sendCommand("AT+INFO\r\n");
sendCommand("AT+NCONFIG\r\n");
sendCommand("AT+DEVEUI\r\n");
sendCommand("AT+APPKEY\r\n");
sendCommand("AT+APPEUI\r\n");
sendCommand("AT+NRB\r\n");
delay(40000);
}
void sendCommand(String atComm){
response = "";
Serial1.print(atComm);
Serial.println("*******AT Command Sent");
Serial.print(atComm);
delay(300);
while(Serial1.available()){
char ch = Serial1.read();
//delay(500);
response += ch;
}
Serial.println(response);
}
void sendData(int type, String data){
String command = (String)"AT+NCMGS=" + type + "," +data + (String)"\r\n";
sendCommand(command);
}

เลือก Port ให้ถูกต้อง

แล้วทำการ Upload โปรแกรม กรณีที่ใช้ Arduino IDE แล้วไม่มี Board “Seeeduino Wio terminal” ให้เลือกให้เพืิ่ม Board wio ด้วย Board Manager ก่อน

2. โปรแกรมภาษา CircuitPython ส่งค่าอุณหภูมิและความชื้นใช้ Sensor AHT10

ต่อ Sensor AHT10 เข้ากับขา I2C และ DL7612-AS923-TH เข้ากับ TX,RX ให้ถูกต้อง

import time
import busio
import board
import displayio
import adafruit_binascii
import adafruit_ahtx0
from cayennelpp import CayenneLPP
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text import label
from circuitpython_display_frame import Frame
rstr = ""
i2c = busio.I2C(board.SCL, board.SDA)
sensor = adafruit_ahtx0.AHTx0(i2c)
display = board.DISPLAY
main_group1 = displayio.Group()
font_file = "fonts/LeagueSpartan-Bold-16.bdf"
# font_file = "fonts/Junction-regular-24.pcf"
# Set text, font, and color
text = "HELLO LoRaWAN Thailand"
font = bitmap_font.load_font(font_file)
color = 0xFF00FF
text_area = label.Label(font, text=text, color=color)
text_area.x = 20
text_area.y = 60
# main_group1.append(text_area)def sendATcommand(ATcommand):
print("{0}\r\n".format(ATcommand))
uart = busio.UART(board.TX, board.RX, baudrate=115200, timeout=.1)
uart.write(bytearray(b"{0}\r\n".format(ATcommand)))
rstr = uart.read(250)
if rstr:
rstr = str(rstr, 'utf-8')
uart.deinit()
print(rstr)
return (rstr)
sendATcommand("AT+NCONFIG")
sendATcommand("AT+INFO")
sendATcommand("AT+NRB")
print("Module Reboot..")
print("Wait...for Join Request")
cnt = 1while rstr != '+CGATT:1':
time.sleep(20.0) # Wait for Join Accept
rstr = sendATcommand('AT+CGATT')
print('Respond String')
print(rstr)
if rstr.startswith('+CGATT:1'):
print('+++Join Accept+++++')
print('++++OTAA OK+++++')
break
print('Retry OTAA Continue')
while True:
print("********Packet No #{}".format(cnt))
print("********AHT10 values:***********")
temp = sensor.temperature
hum = sensor.relative_humidity
print('temp:', temp, ' Hum:', hum)
frame1 = Frame(10, 70, display.width-15, display.height-160, 10, "Temperature", outline=0xFF11FF, text_color=0x2222FF)
frame2 = Frame(10, 170, display.width-15, display.height-171, 10, "Humidity")
font_file = "fonts/LeagueSpartan-Bold-16.bdf"
# font_file = "fonts/Junction-regular-24.pcf"
main_group1.append(frame1)
main_group1.append(frame2)
text1 = str(round(temp, 2))
font = bitmap_font.load_font(font_file)
color = 0xFF00FF
text_area1 = label.Label(font, text=text1, color=color)
text_area1.x = 100
text_area1.y = 110
main_group1.append(text_area1)
text2 = str(round(hum))
font = bitmap_font.load_font(font_file)
color = 0xFF00FF
text_area2 = label.Label(font, text=text2, color=color)
text_area2.x = 140
text_area2.y = 210
main_group1.append(text_area2)
display.show(main_group1)time.sleep(5)
main_group1 = displayio.Group()
c = CayenneLPP()
c.addTemperature(1, float(temp))
c.addRelativeHumidity(2, float(hum))
d = adafruit_binascii.hexlify(c.getBuffer())
print('---------Start Send Status------------')
sendATcommand("AT+NMGS={0},{1}\r\n".format(int(len(d)/2), (str(d)[2:-1])))
print('---------End Send Status--------------')
cnt = cnt + 1
time.sleep(10.0)

3. โปรแกรมภาษา CircuitPython ส่งค่าอุณหภูมิและความชื้นใช้ Sensor BME280

ต่อ Sensor BME280 เข้ากับขา I2C และ DL7612-AS923-TH เข้ากับ TX,RX ให้ถูกต้อง

import time
import board
import busio
import displayio
import adafruit_binascii
import adafruit_bme280
from cayennelpp import CayenneLPP
from adafruit_bitmap_font import bitmap_font
from adafruit_display_text import label
from circuitpython_display_frame import Frame
rstr = ""
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)
bme280.sea_level_pressure = 1013.25
display = board.DISPLAY
main_group1 = displayio.Group()
font_file = "fonts/LeagueSpartan-Bold-16.bdf"
# font_file = "fonts/Junction-regular-24.pcf"
# Set text, font, and color
text = "HELLO LoRaWAN Thailand"
font = bitmap_font.load_font(font_file)
color = 0xFF00FF
text_area = label.Label(font, text=text, color=color)
text_area.x = 20
text_area.y = 60
# main_group1.append(text_area)def sendATcommand(ATcommand):
print("{0}\r\n".format(ATcommand))
uart = busio.UART(board.TX, board.RX, baudrate=115200, timeout=.1)
uart.write(bytearray(b"{0}\r\n".format(ATcommand)))
rstr = uart.read(250)
if rstr:
rstr = str(rstr, 'utf-8')
uart.deinit()
print(rstr)
return (rstr)
sendATcommand("AT+NCONFIG")
sendATcommand("AT+INFO")
sendATcommand("AT+NRB")
print("Module Reboot..")
print("Wait...for Join Request")
cnt = 1while rstr != '+CGATT:1':
time.sleep(20.0) # Wait for Join Accept
rstr = sendATcommand('AT+CGATT')
print('Respond String')
print(rstr)
if rstr.startswith('+CGATT:1'):
print('+++Join Accept+++++')
print('++++OTAA OK+++++')
break
print('Retry OTAA Continue')
while True:
print("********Packet No #{}".format(cnt))
print("********BME280 values:***********")
print("\nTemperature: %0.1f C" % bme280.temperature)
print("Humidity: %0.1f %%" % bme280.relative_humidity)
print("Pressure: %0.1f hPa" % bme280.pressure)
print("Altitude = %0.2f meters" % bme280.altitude)
temp = bme280.temperature
hum = bme280.relative_humidity
pa = bme280.pressure
alt = bme280.altitude
frame1 = Frame(10, 70, display.width-15, display.height-160, 10, "Temperature", outline=0xFF11FF, text_color=0x2222FF)
frame2 = Frame(10, 170, display.width-15, display.height-171, 10, "Humidity")
font_file = "fonts/LeagueSpartan-Bold-16.bdf"
# font_file = "fonts/Junction-regular-24.pcf"
main_group1.append(frame1)
main_group1.append(frame2)
text1 = str(round(temp, 2))+"°C"
font = bitmap_font.load_font(font_file)
color = 0xFF00FF
text_area1 = label.Label(font, text=text1, color=color)
text_area1.x = 120
text_area1.y = 110
main_group1.append(text_area1)
text2 = str(round(hum))+"%"
font = bitmap_font.load_font(font_file)
color = 0xFF00FF
text_area2 = label.Label(font, text=text2, color=color)
text_area2.x = 140
text_area2.y = 210
main_group1.append(text_area2)
display.show(main_group1)time.sleep(5)
main_group1 = displayio.Group()
c = CayenneLPP()
c.addTemperature(1, float(temp))
c.addRelativeHumidity(2, float(hum))
c.addBarometricPressure(4, float(pa))
d = adafruit_binascii.hexlify(c.getBuffer())
print('---------Start Send Status------------')
sendATcommand("AT+NMGS={0},{1}\r\n".format(int(len(d)/2), (str(d)[2:-1])))
print('---------End Send Status--------------')
cnt = cnt + 1
time.sleep(10.0)

หมายเหตุ ต้องติดตั้ง Lib และ Font โดยดาวน์โหลดมาติดตั้งก่อน

สามารถติดตั้งฟอนต์ฟรีภาษาไทยลงไปใช้งานได้ เช่น ตามภาพ

--

--

Somsak Lima
Somsak Lima

Written by Somsak Lima

สนับสนุนและส่งเสริมให้ผู้สนใจสามารถใช้งานเทคโนโลยี LoRa และ LoRaWAN ได้ โดยนำความรู้ที่ได้ไปต่อยอดเพื่อใช้งาน

No responses yet