LoRa
LoRa 用于控制主机设备内置的远程无线通信模块。以下是主机的详细 LoRa 支持:
控制器 |
LoRa |
|---|---|
UnitC6L |
✔ |
Nesso N1 |
✔ |
UiFlow2 应用示例
发送端
在 UiFlow2 上打开 unit_c6l_tx_example.m5f2 项目。
在 UiFlow2 上打开 nesso_n1_sender_example.m5f2 项目。
该示例每秒发送一次数据。
UiFlow2 代码块:
示例输出:
无
接收端
在 UiFlow2 上打开 unit_c6l_rx_example.m5f2 项目。
在 UiFlow2 上打开 nesso_n1_receiver_example.m5f2 项目。
示例接收并显示数据。
UiFlow2 代码块:
示例输出:
无
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_callback 与 start_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 KHzsf (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 代码块:

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

MicroPython 代码块:
lora_0.set_freq(freq_khz)
- set_bw(bw)
设置带宽。
- 参数:
bw (str) – 带宽(以 kHz 表示的字符串)。必须是以下值之一:’7.8’、’10.4’、’15.6’、’20.8’、’31.25’、’41.7’、’62.5’、’125’、’250’、’500’。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.set_bw(bw)
- set_coding_rate(coding_rate)
设置编码率。
- 参数:
coding_rate (int) – 编码率 (5 ~ 8)。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.set_coding_rate(coding_rate)
- set_syncword(syncword)
设置同步字。
- 参数:
syncword (int) – 同步字 (0 ~ 0xFF)
UiFlow2 代码块:

MicroPython 代码块:
lora_0.set_syncword(syncword)
- set_preamble_len(preamble_len)
设置前导符长度。
- 参数:
preamble_len (int) – 前导符长度,范围:0~255。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.set_preamble_len(preamble_len)
- set_output_power(output_power)
设置输出功率(单位:dBm) 。
- 参数:
output_power (int) – 输出功率(单位:dBm),范围:-9 ~ 22。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.set_output_power(output_power)
- set_irq_callback(callback)
设置在中断请求(IRQ)发生时执行的中断回调函数。
- 参数:
callback – 当中断触发时调用的回调函数。该回调函数不应接受任何参数,且不应有返回值。
调用 start_recv() 开始接收数据。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.set_irq_callback()
- start_recv()
开始接收数据。
此方法启动接收数据的过程。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.start_recv()
- recv(self, timeout_ms, rx_length, rx_packet)
接收数据。
- 参数:
- 返回:
接收数据包实例。
- 返回类型:
尝试接收一个 LoRa 数据包。如果发生超时,返回 None;否则,返回接收到的数据包实例。
UiFlow2 代码块:

MicroPython 代码块:
data = lora_0.recv()
- send(buf, tx_at_ms=None)
发送数据
- 参数:
- 返回:
返回一个时间戳(time.ticks_ms()的结果),表示数据包发送的时间。
- 返回类型:
发送一个数据包并返回数据包发送后的时间戳。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.send()
- standby()
设置模块为待机模式。
将 LoRa 模块置于待机模式,从而降低功耗。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.standby()
- sleep()
将 LoRa 模块置于睡眠模式
通过将模块置于深度睡眠模式来减少功耗。
UiFlow2 代码块:

MicroPython 代码块:
lora_0.sleep()
有关 RxPacket 的更多详细信息,请参阅 class RxPacket。



