LoRa868 v1.2 Module

LoRa868 v1.2 模块是 M5Stack 可堆叠模块系列的一部分,它是一款工作在 900MHz 频段、基于 SX1262 芯片方案的 LoRa 通信模块。

支持以下产品:

LoRa868Module v1.2

UiFlow2 应用示例

备注

在使用以下示例之前,请先检查模块上的 DIP 开关,确保示例中使用的引脚与 DIP 开关的位置一致。有关具体配置,请参考产品说明页面。SPI 配置已在内部实现,用户无需额外设置。

发送端

在 UiFlow2 上打开 cores3_lora868_v12_tx_example.m5f2 项目。

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

UiFlow2 代码块:

cores3_lora868_v12_tx_example.png

示例输出:

接收端

在 UiFlow2 上打开 cores3_lora868_v12_rx_example.m5f2 项目。

示例接收并显示数据。

UiFlow2 代码块:

cores3_lora868_v12_rx_example.png

示例输出:

MicroPython 应用示例

备注

在使用以下示例之前,请先检查模块上的 DIP 开关,确保示例中使用的引脚与 DIP 开关的位置一致。有关具体配置,请参考产品说明页面。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 LoRa868V12Module
 9import time
10
11
12title0 = None
13label_t = None
14label_time = None
15label_tx = None
16label_ts = None
17lora868v12_0 = None
18count = None
19last_time = None
20timestamp = None
21
22
23def setup():
24    global \
25        title0, \
26        label_t, \
27        label_time, \
28        label_tx, \
29        label_ts, \
30        lora868v12_0, \
31        count, \
32        last_time, \
33        timestamp
34
35    M5.begin()
36    Widgets.fillScreen(0x222222)
37    title0 = Widgets.Title("LoRa Module Tx", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18)
38    label_t = Widgets.Label("Send:", 5, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
39    label_time = Widgets.Label("1", 118, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
40    label_tx = Widgets.Label("hello", 65, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
41    label_ts = Widgets.Label("timestamp:", 5, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
42
43    count = 0
44    lora868v12_0 = LoRa868V12Module(
45        pin_rst=5,
46        pin_cs=1,
47        pin_irq=10,
48        pin_busy=2,
49        freq_khz=868000,
50        bw="250",
51        sf=8,
52        coding_rate=8,
53        preamble_len=12,
54        syncword=0x12,
55        output_power=10,
56    )
57    last_time = time.ticks_ms()
58
59
60def loop():
61    global \
62        title0, \
63        label_t, \
64        label_time, \
65        label_tx, \
66        label_ts, \
67        lora868v12_0, \
68        count, \
69        last_time, \
70        timestamp
71    M5.update()
72    if (time.ticks_diff((time.ticks_ms()), last_time)) >= 1000:
73        last_time = time.ticks_ms()
74        count = count + 1
75        timestamp = lora868v12_0.send((str("hello M5 ") + str(count)), None)
76        label_tx.setText(str((str("hello M5 ") + str(count))))
77        label_time.setText(str(last_time))
78
79
80if __name__ == "__main__":
81    try:
82        setup()
83        while True:
84            loop()
85    except (Exception, KeyboardInterrupt) as e:
86        try:
87            from utility import print_error_msg
88
89            print_error_msg(e)
90        except ImportError:
91            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 LoRa868V12Module
  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
 22lora868v12_data = None
 23rssi = None
 24snr = None
 25last_time = None
 26
 27
 28def lora868v12_0_receive_event(received_data):
 29    global \
 30        title0, \
 31        label_r, \
 32        label_rx, \
 33        label_t, \
 34        label_time, \
 35        label_rssi, \
 36        label_snr, \
 37        label_rssi_v, \
 38        label_snr_v, \
 39        lora868v12_0, \
 40        lora868v12_data, \
 41        rssi, \
 42        snr, \
 43        last_time
 44    lora868v12_data = received_data
 45    label_rx.setText(str(lora868v12_data.decode()))
 46    rssi = lora868v12_data.rssi
 47    snr = (lora868v12_data.snr) / 4
 48    label_rssi_v.setText(str(rssi))
 49    label_snr_v.setText(str(snr))
 50
 51
 52def setup():
 53    global \
 54        title0, \
 55        label_r, \
 56        label_rx, \
 57        label_t, \
 58        label_time, \
 59        label_rssi, \
 60        label_snr, \
 61        label_rssi_v, \
 62        label_snr_v, \
 63        lora868v12_0, \
 64        lora868v12_data, \
 65        rssi, \
 66        snr, \
 67        last_time
 68
 69    M5.begin()
 70    Widgets.fillScreen(0x222222)
 71    title0 = Widgets.Title("LoRa Module Rx", 3, 0xFFFFFF, 0x0000FF, Widgets.FONTS.DejaVu18)
 72    label_r = Widgets.Label("Recv:", 5, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 73    label_rx = Widgets.Label(" ", 65, 50, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 74    label_t = Widgets.Label("timestamp:", 5, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 75    label_time = Widgets.Label("1", 118, 150, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 76    label_rssi = Widgets.Label("RSSI: ", 5, 80, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 77    label_snr = Widgets.Label("SNR: ", 5, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 78    label_rssi_v = Widgets.Label(" ", 65, 80, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 79    label_snr_v = Widgets.Label(" ", 65, 108, 1.0, 0xFFFFFF, 0x222222, Widgets.FONTS.DejaVu18)
 80
 81    lora868v12_0 = LoRa868V12Module(
 82        pin_rst=5,
 83        pin_cs=1,
 84        pin_irq=10,
 85        pin_busy=2,
 86        freq_khz=868000,
 87        bw="250",
 88        sf=8,
 89        coding_rate=8,
 90        preamble_len=12,
 91        syncword=0x12,
 92        output_power=10,
 93    )
 94    lora868v12_0.set_irq_callback(lora868v12_0_receive_event)
 95    lora868v12_0.start_recv()
 96    last_time = time.ticks_ms()
 97
 98
 99def loop():
100    global \
101        title0, \
102        label_r, \
103        label_rx, \
104        label_t, \
105        label_time, \
106        label_rssi, \
107        label_snr, \
108        label_rssi_v, \
109        label_snr_v, \
110        lora868v12_0, \
111        lora868v12_data, \
112        rssi, \
113        snr, \
114        last_time
115    M5.update()
116    if (time.ticks_diff((time.ticks_ms()), last_time)) >= 1000:
117        last_time = time.ticks_ms()
118        label_time.setText(str(last_time))
119
120
121if __name__ == "__main__":
122    try:
123        setup()
124        while True:
125            loop()
126    except (Exception, KeyboardInterrupt) as e:
127        try:
128            from utility import print_error_msg
129
130            print_error_msg(e)
131        except ImportError:
132            print("please update to latest firmware")

示例输出:

API应用

class LoRa868V12Module

class module.lora868_v12.LoRa868V12Module(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)

创建一个 LoRa868V12Module 对象

参数:
  • pin_rst (int) – 复位引脚

  • pin_cs (int) – 片选引脚

  • pin_irq (int) – 中断引脚

  • pin_busy (int) – 忙信号输出引脚

  • 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 LoRa868V12Module

module_lora868v12_0 = LoRa868V12Module(5, 1, 10, 2, 868000, '250', 8, 8, 12, 0x12, 10)
set_freq(freq_khz)

设置频率(单位:kHz)

参数:

freq_khz (int) – 频率(单位:kHz),默认值 868000 (kHz)。

UiFlow2 代码块:

set_freq.png

MicroPython 代码块:

module_lora868v12_0.set_freq(freq_khz)
set_sf(sf)

设置扩频因子。

参数:

sf (int) – 扩频因子(7~12)。

UiFlow2 代码块:

set_sf.png

MicroPython 代码块:

module_lora868v12_0.set_sf(sf)
set_bw(bw)

设置带宽。

参数:

bw (str) – 带宽(以 kHz 表示的字符串)。必须是以下值之一:’7.8’、’10.4’、’15.6’、’20.8’、’31.25’、’41.7’、’62.5’、’125’、’250’、’500’。

UiFlow2 代码块:

set_bw.png

MicroPython 代码块:

module_lora868v12_0.set_bw(bw)
set_coding_rate(coding_rate)

设置编码率。

参数:

coding_rate (int) – 编码率 (5 ~ 8)。

UiFlow2 代码块:

set_coding_rate.png

MicroPython 代码块:

module_lora868v12_0.set_coding_rate(coding_rate)
set_syncword(syncword)

设置同步字。

参数:

syncword (int) – 同步字 (0 ~ 0xFF)

UiFlow2 代码块:

set_syncword.png

MicroPython 代码块:

module_lora868v12_0.set_syncword(syncword)
set_preamble_len(preamble_len)

设置前导符长度。

参数:

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

UiFlow2 代码块:

set_preamble_len.png

MicroPython 代码块:

module_lora868v12_0.set_preamble_len(preamble_len)
set_output_power(output_power)

设置输出功率(单位:dBm) 。

参数:

output_power (int) – 输出功率(单位:dBm),范围:-9 ~ 22。

UiFlow2 代码块:

set_output_power.png

MicroPython 代码块:

module_lora868v12_0.set_output_power(output_power)
set_irq_callback(callback)

设置在中断请求(IRQ)发生时执行的中断回调函数。

参数:

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

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

UiFlow2 代码块:

set_irq_callback.png

MicroPython 代码块:

module_lora868v12_0.set_irq_callback()
start_recv()

开始接收数据。

此方法启动接收数据的过程。

UiFlow2 代码块:

start_recv.png

MicroPython 代码块:

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

接收数据。

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

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

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

返回:

接收数据包实例。

返回类型:

RxPacket

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

UiFlow2 代码块:

recv.png

MicroPython 代码块:

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

发送数据

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

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

返回:

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

返回类型:

int

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

UiFlow2 代码块:

send.png

MicroPython 代码块:

module_lora868v12_0.send()
standby()

设置模块为待机模式。

将 LoRa 模块置于待机模式,从而降低功耗。

UiFlow2 代码块:

standby.png

MicroPython 代码块:

module_lora868v12_0.standby()
sleep()

将 LoRa 模块置于睡眠模式

通过将模块置于深度睡眠模式来减少功耗。

UiFlow2 代码块:

sleep.png

MicroPython 代码块:

module_lora868v12_0.sleep()
irq_triggered()

检查 IRQ 触发。

返回:

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

返回类型:

bool

UiFlow2 代码块:

irq_triggered.png

MicroPython 代码块:

module_lora868v12_0.irq_triggered()

class RxPacket

class lora.RxPacket

创建一个 RxPacket 对象。

decode()

解码接收到的数据。

ticks_ms()

数据接收的时间戳。

rssi()

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

snr()

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

valid_crc()

CRC 校验有效性。