LoRa868 v1.2 Module

LoRa868 v1.2 模块是 M5Stack 堆叠模块系列的一部分,属于 LoRa 通信模块,工作在 900MHz 频率,采用 SX1262 芯片解决方案。

支持以下产品:

LoRa868Module v1.2

UiFlow2 应用示例:

备注

在使用以下示例之前,请检查模块上的拨码开关,以确保示例中使用的引脚与拨码开关的位置相匹配。有关具体配置,请参考产品手册页面。SPI 配置已在内部实现。

发送端

在 UiFlow2 上打开 cores3_lora_sx1262_tx_example.m5f2 项目。

此示例每秒发送一次数据。

UiFlow2 代码块:

cores3_lora_sx1262_tx_example.png

示例输出:

接收端

在 UiFlow2 上打开 cores3_lora_sx1262_rx_example.m5f2 项目。

此示例接收并显示数据。

UiFlow2 代码块:

cores3_lora_sx1262_rx_example.png

示例输出:

MicroPython 应用示例:

备注

在使用以下示例之前,请检查模块上的拨码开关,以确保示例中使用的引脚与拨码开关的位置相匹配。有关具体配置,请参考产品手册页面。SPI 配置已在内部实现。

发送端

此示例每秒发送一次数据。

MicroPython 代码块:

 1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
 2#
 3# SPDX-License-Identifier: MIT
 4
 5import os, sys, io
 6import M5
 7from M5 import *
 8from module import LoRaSx1262Module
 9import time
10
11
12title0 = None
13label_t = None
14label_time = None
15label_tx = None
16label_ts = None
17lora868v12_0 = None
18
19
20count = None
21last_time = None
22timestamp = None
23
24
25def setup():
26    global \
27        title0, \
28        label_t, \
29        label_time, \
30        label_tx, \
31        label_ts, \
32        lora868v12_0, \
33        count, \
34        last_time, \
35        timestamp
36
37    M5.begin()
38    Widgets.fillScreen(0x222222)
39    title0 = Widgets.Title("LoRa Module Tx", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18)
40    label_t = Widgets.Label("Send:", 5, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
41    label_time = Widgets.Label("1", 118, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
42    label_tx = Widgets.Label("hello", 65, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
43    label_ts = Widgets.Label("timestamp:", 5, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
44
45    lora868v12_0 = LoRaSx1262Module(5, 1, 10, 2, 868000, "250", 8, 8, 12, 0x12, 10)
46    count = 0
47    last_time = time.ticks_ms()
48
49
50def loop():
51    global \
52        title0, \
53        label_t, \
54        label_time, \
55        label_tx, \
56        label_ts, \
57        lora868v12_0, \
58        count, \
59        last_time, \
60        timestamp
61    M5.update()
62    if (time.ticks_diff((time.ticks_ms()), last_time)) >= 1000:
63        last_time = time.ticks_ms()
64        count = count + 1
65        timestamp = lora868v12_0.send((str("hello M5 ") + str(count)), None)
66        label_tx.setText(str((str("hello M5 ") + str(count))))
67        label_time.setText(str(last_time))
68
69
70if __name__ == "__main__":
71    try:
72        setup()
73        while True:
74            loop()
75    except (Exception, KeyboardInterrupt) as e:
76        try:
77            from utility import print_error_msg
78
79            print_error_msg(e)
80        except ImportError:
81            print("please update to latest firmware")

示例输出:

接收端

此示例接收并显示数据。

MicroPython 代码块:

  1# SPDX-FileCopyrightText: 2025 M5Stack Technology CO LTD
  2#
  3# SPDX-License-Identifier: MIT
  4
  5import os, sys, io
  6import M5
  7from M5 import *
  8from module import LoRaSx1262Module
  9import time
 10
 11
 12title0 = None
 13label_r = None
 14label_rx = None
 15label_t = None
 16label_time = None
 17label_rssi = None
 18label_snr = None
 19label_rssi_v = None
 20label_snr_v = None
 21lora868v12_0 = None
 22
 23
 24lora868v12_data = None
 25rssi = None
 26snr = None
 27last_time = None
 28
 29
 30def lora868v12_0_receive_event(received_data):
 31    global \
 32        title0, \
 33        label_r, \
 34        label_rx, \
 35        label_t, \
 36        label_time, \
 37        label_rssi, \
 38        label_snr, \
 39        label_rssi_v, \
 40        label_snr_v, \
 41        lora868v12_0, \
 42        lora868v12_data, \
 43        rssi, \
 44        snr, \
 45        last_time
 46    lora868v12_data = received_data
 47    label_rx.setText(str(lora868v12_data.decode()))
 48    rssi = lora868v12_data.rssi
 49    snr = lora868v12_data.snr
 50    label_rssi_v.setText(str(rssi))
 51    label_snr_v.setText(str(snr))
 52
 53
 54def setup():
 55    global \
 56        title0, \
 57        label_r, \
 58        label_rx, \
 59        label_t, \
 60        label_time, \
 61        label_rssi, \
 62        label_snr, \
 63        label_rssi_v, \
 64        label_snr_v, \
 65        lora868v12_0, \
 66        lora868v12_data, \
 67        rssi, \
 68        snr, \
 69        last_time
 70
 71    M5.begin()
 72    Widgets.fillScreen(0x222222)
 73    title0 = Widgets.Title("LoRa Module Rx", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18)
 74    label_r = Widgets.Label("Recv:", 5, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 75    label_rx = Widgets.Label(" ", 65, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 76    label_t = Widgets.Label("timestamp:", 5, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 77    label_time = Widgets.Label("1", 118, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 78    label_rssi = Widgets.Label("RSSI: ", 5, 80, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 79    label_snr = Widgets.Label("SNR: ", 5, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 80    label_rssi_v = Widgets.Label(" ", 65, 80, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 81    label_snr_v = Widgets.Label(" ", 65, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 82
 83    lora868v12_0 = LoRaSx1262Module(5, 1, 10, 2, 868000, "250", 8, 8, 12, 0x12, 10)
 84    lora868v12_0.set_irq_callback(lora868v12_0_receive_event)
 85    lora868v12_0.start_recv()
 86    last_time = time.ticks_ms()
 87
 88
 89def loop():
 90    global \
 91        title0, \
 92        label_r, \
 93        label_rx, \
 94        label_t, \
 95        label_time, \
 96        label_rssi, \
 97        label_snr, \
 98        label_rssi_v, \
 99        label_snr_v, \
100        lora868v12_0, \
101        lora868v12_data, \
102        rssi, \
103        snr, \
104        last_time
105    M5.update()
106    if (time.ticks_diff((time.ticks_ms()), last_time)) >= 1000:
107        last_time = time.ticks_ms()
108        label_time.setText(str(last_time))
109
110
111if __name__ == "__main__":
112    try:
113        setup()
114        while True:
115            loop()
116    except (Exception, KeyboardInterrupt) as e:
117        try:
118            from utility import print_error_msg
119
120            print_error_msg(e)
121        except ImportError:
122            print("please update to latest firmware")

示例输出:

API参考

class LoRaSx1262Module

class module.lora_sx1262.LoRaSx1262Module(pin_rst=5, pin_cs=1, pin_irq=10, pin_busy=2, freq_khz=868000, bw='250', sf=8, coding_rate=8, reamble_len=12, syncword=0x12, output_power=10)

创建一个 LoRaSx1262Module 对象。

参数:
  • timer_id (int) – 定时器 ID,范围:0~3,默认为 0。

  • pin_rst (int) – (RST) 复位引脚号。

  • pin_cs (int) – (NSS) 片选引脚号。

  • pin_irq (int) – (IRQ) 中断引脚号。

  • pin_busy (int) – (BUSY) 忙检查引脚号。

  • freq_khz (int) – LoRa 射频通信频率,单位 kHz,范围:850000 KHz ~ 930000 KHz。

  • bw (str) –

    带宽,包括如下:

    • "7.8": 7.8 KHz

    • "10.4": 10.4 KHz

    • "15.6": 15.6 KHz

    • "20.8": 20.8 KHz

    • "31.25": 31.25 KHz

    • "41.7": 41.7 KHz

    • "62.5": 62.5 KHz

    • "125": 125 KHz

    • "250": 250 KHz

    • "500": 500 KHz

  • sf (int) – 扩频因子,范围从 7 到 12。较高的扩展因子可以接收较弱的信号,但数据传输速率较慢。

  • coding_rate (int) – 前向纠错(FEC)编码率以 4/N 的形式表示,范围从 5 到 8。

  • preamble_len (int) – 前导符长度,范围 0~255。

  • syncword (int) – 同步字,用于标记数据帧的开始,默认值是 0x12。

  • output_power (int) – 输出功率以 dBm 为单位,范围从 -9 到 22。

UiFlow2 代码块:

init.png

MicroPython 代码块:

from module import LoRaSx1262Module

lora868v12_0 = LoRaSx1262Module(5, 1, 10, 2, 868000, '250', 8, 8, 12, 0x12, 10)
set_irq_callback(callback)

设置中断回调函数。

参数:

callback – 当中断触发时调用的回调函数。回调函数不应接受任何参数,并且不应返回任何值。

调用 start_recv() 开始接收数据。

UiFlow2 代码块:

set_irq_callback.png

MicroPython 代码块:

lora868v12_0.set_irq_callback()
start_recv()

开始接收数据。

该方法启动接收数据。

UiFlow2 代码块:

start_recv.png

MicroPython 代码块:

lora868v12_0.start_recv()
recv(self, timeout_ms, rx_length, rx_packet)

接收数据。

参数:
  • timeout_ms (int) – 超时时间(单位:ms,可选),默认为 None。

  • rx_length (int) – 要读取的数据长度,默认为 0xFF。

  • rx_packet (RxPacket) – 一个 RxPacket 实例(可选参数),用于重用。

返回:

接收数据实例。

返回类型:

RxPacket

尝试接收一个 LoRa 数据包。如果发生超时,则返回 None,否则返回接收到的数据包实例。

UiFlow2 代码块:

recv.png

MicroPython 代码块:

data = lora868v12_0.recv()
send(buf, tx_at_ms=None)

发送数据。

参数:
  • packet (str | list | tuple | int | bytearray) – 要发送的数据。

  • tx_at_ms (int) – 发送数据的时间戳(以 ms 为单位,可选参数)。默认为 None。

返回:

返回一个时间戳(time.ticks_ms() 的结果),表示数据包发送的时间。

返回类型:

int

发送一个数据包并返回数据包发送后的时间戳。

UiFlow2 代码块:

send.png

MicroPython 代码块:

lora868v12_0.send()
standby()

设置模块为待机模式。

设置 LoRa 模块为待机模式,降低功耗。

UiFlow2 代码块:

standby.png

MicroPython 代码块:

lora868v12_0.standby()
sleep()

设置模块为休眠模式。

通过将模块置于休眠模式来降低功耗。

UiFlow2 代码块:

sleep.png

MicroPython 代码块:

lora868v12_0.sleep()
irq_triggered()

检查 IRQ 是否触发。

返回:

如果自上次发送或接收开始以来中断服务例程(ISR)已被触发,则返回 True。

返回类型:

bool

UiFlow2 代码块:

irq_triggered.png

MicroPython 代码块:

lora868v12_0.irq_triggered()

class RxPacket

class lora.RxPacket

创建一个 RxPacket 对象。

decode()

解码接收到的数据。

ticks_ms()

数据接收时的时间戳。

rssi()

接收信号强度(单位:dBm)。

snr()

信噪比(单位:dB * 4)。

valid_crc()

CRC 校验。