ESP32+LoRa实现测量数据远距离传输


心心念的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.


文章作者: Rc4x
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Rc4x !