LoRa

LoRa 用于控制主机设备内置的远程无线通信模块。以下是主机的详细 LoRa 支持:

控制器

LoRa

UnitC6L

Nesso N1

UiFlow2 应用示例

发送端

在 UiFlow2 上打开 unit_c6l_tx_example.m5f2 项目。

在 UiFlow2 上打开 nesso_n1_sender_example.m5f2 项目。

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

UiFlow2 代码块:

unit_c6l_tx_example.png

示例输出:

接收端

在 UiFlow2 上打开 unit_c6l_rx_example.m5f2 项目。

在 UiFlow2 上打开 nesso_n1_receiver_example.m5f2 项目。

示例接收并显示数据。

UiFlow2 代码块:

unit_c6l_rx_example.png

示例输出:

MicroPython 应用示例

发送端

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

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 hardware import LoRa
 9import time
10
11
12title0 = None
13label_tx = None
14lora = None
15last_time = None
16count = None
17tx = None
18
19
20def setup():
21    global title0, label_tx, lora, last_time, count, tx
22    M5.begin()
23    Widgets.fillScreen(0x000000)
24    title0 = Widgets.Title("Tx", 3, 0x000000, 0xFFFFFF, Widgets.FONTS.DejaVu12)
25    label_tx = Widgets.Label("label0", 2, 23, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu12)
26    lora = LoRa(
27        freq_khz=868000,
28        bw="250",
29        sf=8,
30        coding_rate=8,
31        preamble_len=12,
32        syncword=0x12,
33        output_power=10,
34    )
35    last_time = time.ticks_ms()
36    count = 0
37
38
39def loop():
40    global title0, label_tx, lora, last_time, count, tx
41    M5.update()
42    if (time.ticks_diff((time.ticks_ms()), last_time)) >= 1000:
43        last_time = time.ticks_ms()
44        tx = str("M5 ") + str(count)
45        count = (count if isinstance(count, (int, float)) else 0) + 1
46        lora.send(tx, None)
47        label_tx.setText(str(tx))
48
49
50if __name__ == "__main__":
51    try:
52        setup()
53        while True:
54            loop()
55    except (Exception, KeyboardInterrupt) as e:
56        try:
57            from utility import print_error_msg
58
59            print_error_msg(e)
60        except ImportError:
61            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 hardware import LoRa
 9
10
11title0 = None
12label_rx = None
13lora = None
14lora_data = None
15snr = None
16rssi = None
17
18
19def lora_receive_event(received_data):
20    global title0, label_rx, lora, lora_data, snr, rssi
21    lora_data = received_data
22    label_rx.setText(str(lora_data.decode()))
23    snr = (lora_data.snr) / 4
24    rssi = lora_data.rssi
25    print((str((str("SNR: ") + str(snr))) + str((str(" RSSI: ") + str(rssi)))))
26
27
28def setup():
29    global title0, label_rx, lora, lora_data, snr, rssi
30    M5.begin()
31    Widgets.fillScreen(0x000000)
32    title0 = Widgets.Title("Rx", 3, 0x000000, 0xFFFFFF, Widgets.FONTS.DejaVu12)
33    label_rx = Widgets.Label("label0", 2, 23, 1.0, 0xFFFFFF, 0x000000, Widgets.FONTS.DejaVu12)
34    lora = LoRa(
35        freq_khz=868000,
36        bw="250",
37        sf=8,
38        coding_rate=8,
39        preamble_len=12,
40        syncword=0x12,
41        output_power=10,
42    )
43    lora.set_irq_callback(lora_receive_event)
44    lora.start_recv()
45
46
47def loop():
48    global title0, label_rx, lora, lora_data, snr, rssi
49    M5.update()
50
51
52if __name__ == "__main__":
53    try:
54        setup()
55        while True:
56            loop()
57    except (Exception, KeyboardInterrupt) as e:
58        try:
59            from utility import print_error_msg
60
61            print_error_msg(e)
62        except ImportError:
63            print("please update to latest firmware")

示例输出:

重要说明:使用中断接收时的 IRQ 行为

备注

当使用中断方式(set_irq_callbackstart_recv())接收数据时,程序会在处理完成后 自动清除 LoRa IRQ

在这种情况下,轮询 irq_triggered() 经常会 一直返回 False:这是因为标志位已经被清除,并不代表接收失败。

请使用同步接收模式(recv())进行测试。

API应用

class LoRa

class hardware.LoRa(freq_khz=868000, bw='250', sf=8, coding_rate=8, reamble_len=12, syncword=0x12, output_power=10)

创建一个 LoRa 对象

参数:
  • 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 hardware import LoRa

lora_0 = LoRa(868000, '250', 8, 8, 12, 0x12, 10)
set_freq(freq_khz)

设置频率(单位:kHz)

参数:

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

UiFlow2 代码块:

set_freq.png

MicroPython 代码块:

lora_0.set_freq(freq_khz)
set_sf(sf)

设置扩频因子。

参数:

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

UiFlow2 代码块:

set_sf.png

MicroPython 代码块:

lora_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 代码块:

lora_0.set_bw(bw)
set_coding_rate(coding_rate)

设置编码率。

参数:

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

UiFlow2 代码块:

set_coding_rate.png

MicroPython 代码块:

lora_0.set_coding_rate(coding_rate)
set_syncword(syncword)

设置同步字。

参数:

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

UiFlow2 代码块:

set_syncword.png

MicroPython 代码块:

lora_0.set_syncword(syncword)
set_preamble_len(preamble_len)

设置前导符长度。

参数:

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

UiFlow2 代码块:

set_preamble_len.png

MicroPython 代码块:

lora_0.set_preamble_len(preamble_len)
set_output_power(output_power)

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

参数:

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

UiFlow2 代码块:

set_output_power.png

MicroPython 代码块:

lora_0.set_output_power(output_power)
set_irq_callback(callback)

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

参数:

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

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

UiFlow2 代码块:

set_irq_callback.png

MicroPython 代码块:

lora_0.set_irq_callback()
start_recv()

开始接收数据。

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

UiFlow2 代码块:

start_recv.png

MicroPython 代码块:

lora_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 = lora_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 代码块:

lora_0.send()
standby()

设置模块为待机模式。

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

UiFlow2 代码块:

standby.png

MicroPython 代码块:

lora_0.standby()
sleep()

将 LoRa 模块置于睡眠模式

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

UiFlow2 代码块:

sleep.png

MicroPython 代码块:

lora_0.sleep()
irq_triggered()

检查 IRQ 触发。

返回:

如果自上次开始发送或接收以来触发过中断服务程序(ISR),则返回 True。在**中断接收**模式下,回调执行时驱动通常会清除 IRQ,因此该方法可能一直为 False。测试接收请使用同步 recv() (见上方说明)。

返回类型:

bool

UiFlow2 代码块:

irq_triggered.png

MicroPython 代码块:

lora_0.irq_triggered()

有关 RxPacket 的更多详细信息,请参阅 class RxPacket