心心念的LoRa终于回来了
成都亿百特E22-400T22D,厂家非常给力,新人可以以极低的价格购买一对产品进行测试。
对于物联网来说,短距离室内可以直接走线,不方便布线的WiFi也很好,但是距离稍微远一点,LoRa绝对是首选。3-10km传输距离,外加中继。
作为学习过程,本例讲解如何通过LoRa将上文测量的温湿度数据传输到远端。
首先、仔细阅读产品文档
刚接触到新产品,首先要做的就是仔细阅读厂家技术文档,避免盲干。在亿百特官网可以找到开发文档和支持软件 ,通过文档能明确的知道产品的各项技术资料。
一、设置LoRa参数
阅读文档后得知LoRa配置模式需要使M0=0,M1=1.
连线如下:
LoRa针脚 | USB_to_TTL针脚 | LoRa针脚 | ESP32针脚 |
---|---|---|---|
RXD | TXD | M1 | GPIO22 |
TXD | RXD | M0 | GPIO23 |
GND | GND | AUX | 悬空 |
VCC | VCC |
构造TTL电平使LoRa进入配置模式:
from machine import Pin
p22 = Pin(22, Pin.OUT, value=1)
p23 = Pin(23, Pin.OUT, value=0)
print(p22.value())
print(p23.value())
通过上位机软件设置LoRa工作参数:
二、连接硬件
LoRa针脚 | ESP32针脚 | OLED针脚 | ESP32针脚 |
---|---|---|---|
M0 | GPIO18 | GND | GND |
M1 | GPIO19 | VCC | VCC |
RXD | TX2 | SCL | GPIO22 |
TXD | RX2 | SDA | GPIO23 |
AUX | GPIO15 | DHT11针脚 | ESP32针脚 |
VCC | 3V3 | OUT | GPIO21 |
GND | GND | VCC---VCC | GND---GND |
三、编写软件
1、发射方
import machine
import time
from machine import Pin,I2C,UART
from ssd1306 import SSD1306_I2C
from dht import DHT11
#定义I2C OLED屏幕接口
i2c = I2C(scl=Pin(22), sda=Pin(23),freq=100000)
#定义ESP32 蓝色OLED
LED = Pin(2, Pin.OUT)
#定义DHT11温湿度传感器接口
te = DHT11(machine.Pin(21))
#定义OLED参数
oled = SSD1306_I2C(128, 32, i2c)
#输出低电平(GPIO18 GPIO19 配置LoRa为工作模式)
p18 = Pin(18, Pin.OUT, value=0)
p19 = Pin(19, Pin.OUT, value=0)
#定义UART接口参数
UART(2, baudrate=1200, tx=17, rx=16, timeout=10)
uart = UART(2, baudrate=1200, tx=17, rx=16, timeout=10)
while True:
#测量一次温湿度数据
te.measure()
temp_ = str(te.temperature())
hum_ = str(te.humidity())
#清屏
oled.fill(0)
oled.text('temp:'+ temp_ +'C',10,2)
oled.text('hum:'+ hum_ +'%',10,20)
#显示内容
oled.show()
#ESP32蓝色LED熄灯
LED.value(0)
time.sleep_ms(10000)
#ESP32蓝色OLED开灯(指示UART发送状态)
LED.value(1)
#通过UART接口发送数据到LoRa
uart.write('temp:'+ temp_ +'C ')
uart.write('\n')
uart.write('hum:'+ hum_ +'%')
#显示内容指示发射状态
oled.text('...',100,20)
oled.show()
time.sleep_ms(500)
3.3V供电情况下,由于LoRa发射功率比较大电流波动会导致
oled.show()
之前需要等待一定时间,否则会报错OSError: [Errno 110] ETIMEDOUT
,建议LoRa走5v供电和OLED分开。
2、接收方
import machine
import select
import time
from machine import Pin,UART,Timer,I2C
from ssd1306 import SSD1306_I2C
i2c = I2C(scl=Pin(22), sda=Pin(23),freq=100000)
oled = SSD1306_I2C(128, 32, i2c)
p18 = Pin(18, Pin.OUT, value=0)
p19 = Pin(19, Pin.OUT, value=0)
LED = Pin(2, Pin.OUT)
UART(2, baudrate=1200, tx=17, rx=16, timeout=10)
uart = UART(2, baudrate=1200, tx=17, rx=16, timeout=10)
timer = Timer(1)
timer.init(period=50, mode=Timer.PERIODIC, callback=lambda t: read_uart(uart))
def read_uart(uart):
if uart.any():
oled.fill(0)
oled.text(uart.readline().decode('utf-8'),10,2)
oled.text(uart.readline().decode('utf-8'),10,22)
oled.text('.v.',107,18)
LED.value(1)
oled.show()
time.sleep_ms(100)
else:
time.sleep_ms(100)
oled.text('.v.',107,18)
oled.show()
LED.value(0)
end..
too many to say,at last nothing left.