From 1b73a3b4026b82554dc250d7beae63b89b8b2cf8 Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Thu, 22 Aug 2024 15:20:47 -0400 Subject: [PATCH 01/15] Update README.rst --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 4ed4e8e..1062103 100644 --- a/README.rst +++ b/README.rst @@ -12,8 +12,8 @@ Introduction :alt: Discord -.. image:: https://github.com/jerryneedell/Adafruit_CircuitPython_RFM/workflows/Build%20CI/badge.svg - :target: https://github.com/jerryneedell/Adafruit_CircuitPython_RFM/actions +.. image:: https://github.com/adafruit/Adafruit_CircuitPython_RFM/workflows/Build%20CI/badge.svg + :target: https://github.com/adafruit/Adafruit_CircuitPython_RFM/actions :alt: Build Status @@ -90,7 +90,7 @@ Or the following command to update an existing version: Usage Example ============= -See examples in the GitHub Repository. +See examples in the GitHub Repository. Documentation ============= From 868ed1e0954345adbdd31384b380fd9445020b24 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Mon, 7 Oct 2024 09:24:05 -0500 Subject: [PATCH 02/15] remove deprecated get_html_theme_path() call Signed-off-by: foamyguy --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index e474773..5212071 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -112,7 +112,6 @@ import sphinx_rtd_theme html_theme = "sphinx_rtd_theme" -html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."] # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, From dd9e4285a685d739e8a873335d7401fe7c85302d Mon Sep 17 00:00:00 2001 From: foamyguy Date: Tue, 15 Oct 2024 11:20:17 -0500 Subject: [PATCH 03/15] udpate rtd container version config --- .readthedocs.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index fcb7778..3cd488c 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -9,7 +9,7 @@ version: 2 build: - os: ubuntu-latest + os: ubuntu-lts-latest tools: python: "3" From bb4e3b5ef5d1fddf7acbf3a179d54c3a69e045cc Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Wed, 4 Dec 2024 12:39:58 -0500 Subject: [PATCH 04/15] fix read_fifo to always define packet before return, Corrct typo in rfm9x docstring --- adafruit_rfm/rfm69.py | 1 + adafruit_rfm/rfm9x.py | 3 ++- adafruit_rfm/rfm9xfsk.py | 1 + 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/adafruit_rfm/rfm69.py b/adafruit_rfm/rfm69.py index 4ff3c54..913958a 100644 --- a/adafruit_rfm/rfm69.py +++ b/adafruit_rfm/rfm69.py @@ -643,6 +643,7 @@ def read_fifo(self) -> bytearray: """Read the packet from the FIFO.""" # Read the length of the FIFO. fifo_length = self.read_u8(_RF69_REG_00_FIFO) + packet = None # return None if FIFO empty if fifo_length > 0: # read and clear the FIFO if anything in it packet = bytearray(fifo_length) # read the packet diff --git a/adafruit_rfm/rfm9x.py b/adafruit_rfm/rfm9x.py index d89000a..736f32e 100644 --- a/adafruit_rfm/rfm9x.py +++ b/adafruit_rfm/rfm9x.py @@ -131,7 +131,7 @@ class RFM9x(RFMSPI): - preamble_length: The length in bytes of the packet preamble (default 8). - high_power: Boolean to indicate a high power board (RFM95, etc.). Default is True for high power. - - baudrate: Baud rate of the SPI connection, default is 10mhz but you might + - baudrate: Baud rate of the SPI connection, default is 5mhz but you might choose to lower to 1mhz if using long wires or a breadboard. - agc: Boolean to Enable/Disable Automatic Gain Control - Default=False (AGC off) - crc: Boolean to Enable/Disable Cyclic Redundancy Check - Default=True (CRC Enabled) @@ -521,6 +521,7 @@ def read_fifo(self) -> bytearray: """Read the data from the FIFO.""" # Read the length of the FIFO. fifo_length = self.read_u8(_RF95_REG_13_RX_NB_BYTES) + packet = None # return None if FIFO empty if fifo_length > 0: # read and clear the FIFO if anything in it packet = bytearray(fifo_length) current_addr = self.read_u8(_RF95_REG_10_FIFO_RX_CURRENT_ADDR) diff --git a/adafruit_rfm/rfm9xfsk.py b/adafruit_rfm/rfm9xfsk.py index 4394cde..f019281 100644 --- a/adafruit_rfm/rfm9xfsk.py +++ b/adafruit_rfm/rfm9xfsk.py @@ -567,6 +567,7 @@ def read_fifo(self) -> bytearray: """Read the data from the FIFO.""" # Read the length of the FIFO. fifo_length = self.read_u8(_RF95_REG_00_FIFO) + packet = None # return None if FIFO empty if fifo_length > 0: # read and clear the FIFO if anything in it packet = bytearray(fifo_length) # read the packet From 98c3141a1e07576237a649f0f06938961f57309b Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Fri, 6 Dec 2024 14:08:38 -0500 Subject: [PATCH 05/15] fixup packet=None handling --- adafruit_rfm/rfm69.py | 2 +- adafruit_rfm/rfm9x.py | 2 +- adafruit_rfm/rfm9xfsk.py | 2 +- adafruit_rfm/rfm_common.py | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/adafruit_rfm/rfm69.py b/adafruit_rfm/rfm69.py index 913958a..7adb0b1 100644 --- a/adafruit_rfm/rfm69.py +++ b/adafruit_rfm/rfm69.py @@ -639,7 +639,7 @@ def fill_fifo(self, payload: ReadableBuffer) -> None: # Write payload to transmit fifo self.write_from(_RF69_REG_00_FIFO, complete_payload) - def read_fifo(self) -> bytearray: + def read_fifo(self) -> Optional[bytearray]: """Read the packet from the FIFO.""" # Read the length of the FIFO. fifo_length = self.read_u8(_RF69_REG_00_FIFO) diff --git a/adafruit_rfm/rfm9x.py b/adafruit_rfm/rfm9x.py index 736f32e..5987e99 100644 --- a/adafruit_rfm/rfm9x.py +++ b/adafruit_rfm/rfm9x.py @@ -517,7 +517,7 @@ def fill_fifo(self, payload: ReadableBuffer) -> None: # Write payload and header length. self.write_u8(_RF95_REG_22_PAYLOAD_LENGTH, len(payload)) - def read_fifo(self) -> bytearray: + def read_fifo(self) -> Optional[bytearray]: """Read the data from the FIFO.""" # Read the length of the FIFO. fifo_length = self.read_u8(_RF95_REG_13_RX_NB_BYTES) diff --git a/adafruit_rfm/rfm9xfsk.py b/adafruit_rfm/rfm9xfsk.py index f019281..d10a45b 100644 --- a/adafruit_rfm/rfm9xfsk.py +++ b/adafruit_rfm/rfm9xfsk.py @@ -563,7 +563,7 @@ def fill_fifo(self, payload: ReadableBuffer) -> None: # Write payload to transmit fifo self.write_from(_RF95_REG_00_FIFO, complete_payload) - def read_fifo(self) -> bytearray: + def read_fifo(self) -> Optional[bytearray]: """Read the data from the FIFO.""" # Read the length of the FIFO. fifo_length = self.read_u8(_RF95_REG_00_FIFO) diff --git a/adafruit_rfm/rfm_common.py b/adafruit_rfm/rfm_common.py index ed5a55a..3f211f9 100644 --- a/adafruit_rfm/rfm_common.py +++ b/adafruit_rfm/rfm_common.py @@ -430,7 +430,7 @@ async def asyncio_receive( # noqa: PLR0912 self.crc_error_count += 1 else: packet = self.read_fifo() - if self.radiohead: + if (packet is not None) and self.radiohead: if len(packet) < 5: # reject the packet if it is too small to contain the RAdioHead Header packet = None @@ -503,7 +503,7 @@ async def asyncio_receive_with_ack( # noqa: PLR0912 self.crc_error_count += 1 else: packet = self.read_fifo() - if self.radiohead: + if (packet is not None) and self.radiohead: if len(packet) < 5: # reject the packet if it is too small to contain the RAdioHead Header packet = None From 87fe9348412160c9394e8327f2e2c2a8f530841e Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Fri, 6 Dec 2024 14:22:42 -0500 Subject: [PATCH 06/15] fix import in rfm9x --- adafruit_rfm/rfm9x.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_rfm/rfm9x.py b/adafruit_rfm/rfm9x.py index 5987e99..2848292 100644 --- a/adafruit_rfm/rfm9x.py +++ b/adafruit_rfm/rfm9x.py @@ -23,7 +23,7 @@ from circuitpython_typing import ReadableBuffer try: - from typing import Literal + from typing import Literal, Optional except ImportError: from typing_extensions import Literal From 3cbfb0a87dbee267e915e32c6e82081a41ba4833 Mon Sep 17 00:00:00 2001 From: foamyguy Date: Thu, 16 Jan 2025 09:53:41 -0600 Subject: [PATCH 07/15] update rtd sphinx config --- .readthedocs.yaml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 3cd488c..ee38fa0 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -8,6 +8,9 @@ # Required version: 2 +sphinx: + configuration: docs/conf.py + build: os: ubuntu-lts-latest tools: From 542638d3fc7e03eb5d253fa44a7278f3fce53506 Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Sun, 26 Jan 2025 14:41:19 -0500 Subject: [PATCH 08/15] WIP -- fix SF=6 for rfm9x --- adafruit_rfm/rfm9x.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/adafruit_rfm/rfm9x.py b/adafruit_rfm/rfm9x.py index 2848292..f85fc86 100644 --- a/adafruit_rfm/rfm9x.py +++ b/adafruit_rfm/rfm9x.py @@ -169,6 +169,8 @@ class RFM9x(RFMSPI): auto_agc = RFMSPI.RegisterBits(_RF95_REG_26_MODEM_CONFIG3, offset=2, bits=1) + header_mode = RFMSPI.RegisterBits(_RF95_REG_1D_MODEM_CONFIG1, offset=0, bits=1) + low_datarate_optimize = RFMSPI.RegisterBits(_RF95_REG_26_MODEM_CONFIG3, offset=3, bits=1) lna_boost_hf = RFMSPI.RegisterBits(_RF95_REG_0C_LNA, offset=0, bits=2) @@ -461,8 +463,10 @@ def spreading_factor(self, val: Literal[6, 7, 8, 9, 10, 11, 12]) -> None: if val == 6: self.detection_optimize = 0x5 + self.header_mode = 1 # enable implicit header mode else: self.detection_optimize = 0x3 + self.header_mode = 0 # enable exlicit header mode self.write_u8(_RF95_DETECTION_THRESHOLD, 0x0C if val == 6 else 0x0A) self.write_u8( @@ -491,6 +495,16 @@ def enable_crc(self, val: bool) -> None: self.read_u8(_RF95_REG_1E_MODEM_CONFIG2) & 0xFB, ) + @property + def payload_length(self) -> bool: + """Must be set when using Implicit Header Mode - required for SF = 6""" + return self.read_u8(_RF95_REG_22_PAYLOAD_LENGTH) + + @payload_length.setter + def payload_length(self, val: int) -> None: + # Set payload length + self.write_u8(_RF95_REG_22_PAYLOAD_LENGTH, val) + @property def crc_error(self) -> bool: """crc status""" From 752f3e25a65e65a33a0d842a43b856cc9f27ab45 Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Mon, 27 Jan 2025 12:49:35 -0500 Subject: [PATCH 09/15] WIP -- more fix SF=6 for rfm9x --- adafruit_rfm/rfm9x.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_rfm/rfm9x.py b/adafruit_rfm/rfm9x.py index f85fc86..489db53 100644 --- a/adafruit_rfm/rfm9x.py +++ b/adafruit_rfm/rfm9x.py @@ -496,7 +496,7 @@ def enable_crc(self, val: bool) -> None: ) @property - def payload_length(self) -> bool: + def payload_length(self) -> int: """Must be set when using Implicit Header Mode - required for SF = 6""" return self.read_u8(_RF95_REG_22_PAYLOAD_LENGTH) From 96682237abab0aa93e162dc713ee1e5c4923873b Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Mon, 27 Jan 2025 16:07:37 -0500 Subject: [PATCH 10/15] add lora sf examples --- examples/rfm_lora_sf_base.py | 77 ++++++++++++++++++++++++++++++++++ examples/rfm_lora_sf_node.py | 81 ++++++++++++++++++++++++++++++++++++ 2 files changed, 158 insertions(+) create mode 100644 examples/rfm_lora_sf_base.py create mode 100644 examples/rfm_lora_sf_node.py diff --git a/examples/rfm_lora_sf_base.py b/examples/rfm_lora_sf_base.py new file mode 100644 index 0000000..25d3df5 --- /dev/null +++ b/examples/rfm_lora_sf_base.py @@ -0,0 +1,77 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-License-Identifier: MIT + +import time + +import board +import busio +import digitalio + +# Define radio parameters. +RADIO_FREQ_MHZ = 915.0 # Frequency of the radio in Mhz. Must match your +# module! Can be a value like 915.0, 433.0, etc. + +# Define pins connected to the chip, use these if wiring up the breakout according to the guide: +CS = digitalio.DigitalInOut(board.CE1) +RESET = digitalio.DigitalInOut(board.D25) + +# Initialize SPI bus. +spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) + +# Initialze RFM radio +# uncommnet the desired import and rfm initialization depending on the radio boards being used + +# Use rfm9x for two RFM9x radios using LoRa + +from adafruit_rfm import rfm9x + +rfm = rfm9x.RFM9x(spi, CS, RESET, RADIO_FREQ_MHZ) + +rfm.radiohead = False # don't appent RadioHead heade +# set spreading factor +rfm.spreading_factor = 6 +print("spreading factor set to :", rfm.spreading_factor) +# rfm.ack_wait = 1 +# rfm.xmit_timeout = 5 +# rfm.low_datarate_optimize = 1 +# set node addresses +# rfm.node = 100 +# rfm.destination = 0xFF +rfm.enable_crc = True +payload = bytearray(40) +# rfm.payload_length = len(payload) + 4 # add 4 for RadioHEad header +rfm.payload_length = len(payload) +# send startup message from my_node +message = bytes(f"startup message from base", "UTF-8") +payload[0 : len(message)] = message +rfm.send( + payload, + keep_listening=True, +) +# Wait to receive packets. +print("Waiting for packets...") +# initialize flag and timer +transmit_delay = 5 +last_transmit_time = 0 +packet_received = False +while True: + if rfm.payload_ready(): + packet_received = False + packet = rfm.receive(timeout=None) + if packet is not None: + # Received a packet! + # Print out the raw bytes of the packet: + print(f"Received (raw payload): {packet}") + print([hex(x) for x in packet]) + print(f"RSSI: {rfm.last_rssi}") + packet_received = True + last_transmit_time = time.monotonic() + if packet_received and (time.monotonic() - last_transmit_time) > transmit_delay: + payload = bytearray(40) + # message = bytes(f"packet received","UTF-8") + payload[0 : len(packet)] = packet + rfm.send( + payload, + keep_listening=True, + ) + packet_received = False diff --git a/examples/rfm_lora_sf_node.py b/examples/rfm_lora_sf_node.py new file mode 100644 index 0000000..6b26c71 --- /dev/null +++ b/examples/rfm_lora_sf_node.py @@ -0,0 +1,81 @@ +# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries +# SPDX-License-Identifier: MIT + +# Example to send a packet periodically between addressed nodes with ACK +# Author: Jerry Needell +# +import time + +import board +import busio +import digitalio + +# Define radio parameters. +RADIO_FREQ_MHZ = 915.0 # Frequency of the radio in Mhz. Must match your +# module! Can be a value like 915.0, 433.0, etc. + +# Define pins connected to the chip, use these if wiring up the breakout according to the guide: +CS = digitalio.DigitalInOut(board.CE1) +RESET = digitalio.DigitalInOut(board.D25) + +# Initialize SPI bus. +spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO) + +# Initialze RFM radio +# uncommnet the desired import and rfm initialization depending on the radio boards being used + +# Use rfm9x for two RFM9x radios using LoRa + +from adafruit_rfm import rfm9x + +rfm = rfm9x.RFM9x(spi, CS, RESET, RADIO_FREQ_MHZ) + +rfm.radiohead = False # Do not use RadioHead Header +# set spreading factor +rfm.spreading_factor = 6 +print("spreading factor set to :", rfm.spreading_factor) +# rfm.ack_wait = 1 +# rfm.xmit_timeout = 5 +# rfm.low_datarate_optimize = 1 +# rfm.receive_timeout = 5 +rfm.enable_crc = True +# set the time interval (seconds) for sending packets +transmit_interval = 10 + +# set node addresses +# rfm.node = 1 +# rfm.destination = 100 +# initialize counter +counter = 0 +ack_failed_counter = 0 +# send startup message from my_node +payload = bytearray(40) +rfm.payload_length = len(payload) +message = bytes(f"startup message from node", "UTF-8") +payload[0 : len(message)] = message +rfm.send(payload) + +# Wait to receive packets. +print("Waiting for packets...") +# initialize flag and timer +time_now = time.monotonic() +while True: + # Look for a new packet: only accept if addresses to my_node + packet = rfm.receive() + # If no packet was received during the timeout then None is returned. + if packet is not None: + # Received a packet! + # Print out the raw bytes of the packet: + print(f"Received (raw payload): {packet}") + print([hex(x) for x in packet]) + print(f"RSSI: {rfm.last_rssi}") + # send reading after any packet received + if time.monotonic() - time_now > transmit_interval: + # reset timeer + time_now = time.monotonic() + # send a mesage to destination_node from my_node + payload = bytearray(40) + message = bytes(f"message from node {counter}", "UTF-8") + payload[0 : len(message)] = message + rfm.send(payload) + counter += 1 From f2ff1e48ab7598a876b67f9939e832d180db630f Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Tue, 28 Jan 2025 08:27:57 -0500 Subject: [PATCH 11/15] rfm9x set low_datarate_optimize automatically - revize sf examples --- adafruit_rfm/rfm9x.py | 10 ++++++ examples/rfm_lora_sf_base.py | 61 ++++++++++++++++++++++++------------ examples/rfm_lora_sf_node.py | 52 +++++++++++++++++++++++------- 3 files changed, 91 insertions(+), 32 deletions(-) diff --git a/adafruit_rfm/rfm9x.py b/adafruit_rfm/rfm9x.py index 489db53..5cda864 100644 --- a/adafruit_rfm/rfm9x.py +++ b/adafruit_rfm/rfm9x.py @@ -426,6 +426,11 @@ def signal_bandwidth(self, val: int) -> None: else: self.write_u8(0x2F, 0x44) self.write_u8(0x30, 0) + # set low_datarate_optimize for signal duration > 16 ms + if 1000 / (self.signal_bandwidth / (1 << self.spreading_factor)) > 16: + self.low_datarate_optimize = 1 + else: + self.low_datarate_optimize = 0 @property def coding_rate(self) -> Literal[5, 6, 7, 8]: @@ -473,6 +478,11 @@ def spreading_factor(self, val: Literal[6, 7, 8, 9, 10, 11, 12]) -> None: _RF95_REG_1E_MODEM_CONFIG2, ((self.read_u8(_RF95_REG_1E_MODEM_CONFIG2) & 0x0F) | ((val << 4) & 0xF0)), ) + # set low_datarate_optimize for signal duration > 16 ms + if 1000 / (self.signal_bandwidth / (1 << self.spreading_factor)) > 16: + self.low_datarate_optimize = 1 + else: + self.low_datarate_optimize = 0 @property def enable_crc(self) -> bool: diff --git a/examples/rfm_lora_sf_base.py b/examples/rfm_lora_sf_base.py index 25d3df5..b8f0e45 100644 --- a/examples/rfm_lora_sf_base.py +++ b/examples/rfm_lora_sf_base.py @@ -29,25 +29,39 @@ rfm.radiohead = False # don't appent RadioHead heade # set spreading factor -rfm.spreading_factor = 6 +rfm.spreading_factor = 7 print("spreading factor set to :", rfm.spreading_factor) -# rfm.ack_wait = 1 -# rfm.xmit_timeout = 5 -# rfm.low_datarate_optimize = 1 +print("low_datarate_optimize set to: ", rfm.low_datarate_optimize) +# rfm.signal_bandwidth = 500000 +print("signal_bandwidth set to :", rfm.signal_bandwidth) +print("low_datarate_optimize set to: ", rfm.low_datarate_optimize) +if rfm.spreading_factor == 12: + rfm.xmit_timeout = 5 +print("xmit_timeout set to: ", rfm.xmit_timeout) +if rfm.spreading_factor == 12: + rfm.receive_timeout = 5 +elif rfm.spreading_factor > 7: + rfm.receive_timeout = 2 +print("receive_timeout set to: ", rfm.receive_timeout) # set node addresses # rfm.node = 100 # rfm.destination = 0xFF rfm.enable_crc = True -payload = bytearray(40) -# rfm.payload_length = len(payload) + 4 # add 4 for RadioHEad header -rfm.payload_length = len(payload) -# send startup message from my_node +# send startup message message = bytes(f"startup message from base", "UTF-8") -payload[0 : len(message)] = message -rfm.send( - payload, - keep_listening=True, -) +if rfm.spreading_factor == 6: + payload = bytearray(40) + rfm.payload_length = len(payload) + payload[0 : len(message)] = message + rfm.send( + payload, + keep_listening=True, + ) +else: + rfm.send( + message, + keep_listening=True, + ) # Wait to receive packets. print("Waiting for packets...") # initialize flag and timer @@ -67,11 +81,18 @@ packet_received = True last_transmit_time = time.monotonic() if packet_received and (time.monotonic() - last_transmit_time) > transmit_delay: - payload = bytearray(40) - # message = bytes(f"packet received","UTF-8") - payload[0 : len(packet)] = packet - rfm.send( - payload, - keep_listening=True, - ) + # send back the received packet + if rfm.spreading_factor == 6: + payload = bytearray(40) + rfm.payload_length = len(payload) + payload[0 : len(packet)] = packet + rfm.send( + payload, + keep_listening=True, + ) + else: + rfm.send( + packet, + keep_listening=True, + ) packet_received = False diff --git a/examples/rfm_lora_sf_node.py b/examples/rfm_lora_sf_node.py index 6b26c71..a0ea6b7 100644 --- a/examples/rfm_lora_sf_node.py +++ b/examples/rfm_lora_sf_node.py @@ -32,12 +32,20 @@ rfm.radiohead = False # Do not use RadioHead Header # set spreading factor -rfm.spreading_factor = 6 +rfm.spreading_factor = 7 print("spreading factor set to :", rfm.spreading_factor) -# rfm.ack_wait = 1 -# rfm.xmit_timeout = 5 -# rfm.low_datarate_optimize = 1 -# rfm.receive_timeout = 5 +print("low_datarate_optimize set to: ", rfm.low_datarate_optimize) +# rfm.signal_bandwidth = 500000 +print("signal_bandwidth set to :", rfm.signal_bandwidth) +print("low_datarate_optimize set to: ", rfm.low_datarate_optimize) +if rfm.spreading_factor == 12: + rfm.xmit_timeout = 5 +print("xmit_timeout set to: ", rfm.xmit_timeout) +if rfm.spreading_factor == 12: + rfm.receive_timeout = 5 +elif rfm.spreading_factor > 7: + rfm.receive_timeout = 2 +print("receive_timeout set to: ", rfm.receive_timeout) rfm.enable_crc = True # set the time interval (seconds) for sending packets transmit_interval = 10 @@ -49,11 +57,20 @@ counter = 0 ack_failed_counter = 0 # send startup message from my_node -payload = bytearray(40) -rfm.payload_length = len(payload) message = bytes(f"startup message from node", "UTF-8") -payload[0 : len(message)] = message -rfm.send(payload) +if rfm.spreading_factor == 6: + payload = bytearray(40) + rfm.payload_length = len(payload) + payload[0 : len(message)] = message + rfm.send( + payload, + keep_listening=True, + ) +else: + rfm.send( + message, + keep_listening=True, + ) # Wait to receive packets. print("Waiting for packets...") @@ -74,8 +91,19 @@ # reset timeer time_now = time.monotonic() # send a mesage to destination_node from my_node - payload = bytearray(40) message = bytes(f"message from node {counter}", "UTF-8") - payload[0 : len(message)] = message - rfm.send(payload) + if rfm.spreading_factor == 6: + payload = bytearray(40) + rfm.payload_length = len(payload) + payload[0 : len(message)] = message + rfm.send( + payload, + keep_listening=True, + ) + else: + rfm.send( + message, + keep_listening=True, + ) + counter += 1 From ab48f2e0322fbced7175fd69b28458f32835a977 Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Tue, 28 Jan 2025 08:32:43 -0500 Subject: [PATCH 12/15] revise sf example --- examples/rfm_lora_sf_base.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/rfm_lora_sf_base.py b/examples/rfm_lora_sf_base.py index b8f0e45..2dcda08 100644 --- a/examples/rfm_lora_sf_base.py +++ b/examples/rfm_lora_sf_base.py @@ -43,9 +43,6 @@ elif rfm.spreading_factor > 7: rfm.receive_timeout = 2 print("receive_timeout set to: ", rfm.receive_timeout) -# set node addresses -# rfm.node = 100 -# rfm.destination = 0xFF rfm.enable_crc = True # send startup message message = bytes(f"startup message from base", "UTF-8") From 4a529c94d161e39dd080a7ede9841df23d208c7b Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Wed, 19 Feb 2025 15:56:39 -0500 Subject: [PATCH 13/15] fix up spreading factor examples --- examples/rfm_lora_sf_base.py | 5 +++-- examples/rfm_lora_sf_node.py | 10 +++------- 2 files changed, 6 insertions(+), 9 deletions(-) diff --git a/examples/rfm_lora_sf_base.py b/examples/rfm_lora_sf_base.py index 2dcda08..58fd60b 100644 --- a/examples/rfm_lora_sf_base.py +++ b/examples/rfm_lora_sf_base.py @@ -62,7 +62,8 @@ # Wait to receive packets. print("Waiting for packets...") # initialize flag and timer -transmit_delay = 5 +# set a delay before sending the echo packet +transmit_delay = 0.5 last_transmit_time = 0 packet_received = False while True: @@ -77,7 +78,7 @@ print(f"RSSI: {rfm.last_rssi}") packet_received = True last_transmit_time = time.monotonic() - if packet_received and (time.monotonic() - last_transmit_time) > transmit_delay: + if packet_received and ((time.monotonic() - last_transmit_time) > transmit_delay): # send back the received packet if rfm.spreading_factor == 6: payload = bytearray(40) diff --git a/examples/rfm_lora_sf_node.py b/examples/rfm_lora_sf_node.py index a0ea6b7..325a4f2 100644 --- a/examples/rfm_lora_sf_node.py +++ b/examples/rfm_lora_sf_node.py @@ -50,12 +50,8 @@ # set the time interval (seconds) for sending packets transmit_interval = 10 -# set node addresses -# rfm.node = 1 -# rfm.destination = 100 # initialize counter counter = 0 -ack_failed_counter = 0 # send startup message from my_node message = bytes(f"startup message from node", "UTF-8") if rfm.spreading_factor == 6: @@ -75,7 +71,7 @@ # Wait to receive packets. print("Waiting for packets...") # initialize flag and timer -time_now = time.monotonic() +last_transmit_time = time.monotonic() while True: # Look for a new packet: only accept if addresses to my_node packet = rfm.receive() @@ -87,9 +83,9 @@ print([hex(x) for x in packet]) print(f"RSSI: {rfm.last_rssi}") # send reading after any packet received - if time.monotonic() - time_now > transmit_interval: + if time.monotonic() - last_transmit_time > transmit_interval: # reset timeer - time_now = time.monotonic() + last_transmit_time = time.monotonic() # send a mesage to destination_node from my_node message = bytes(f"message from node {counter}", "UTF-8") if rfm.spreading_factor == 6: From 073912ecbd35aaa52e7b3e63df3cd6d4bad4c68a Mon Sep 17 00:00:00 2001 From: jerryneedell Date: Wed, 19 Feb 2025 16:30:45 -0500 Subject: [PATCH 14/15] additional fix to spreading factor examples --- examples/rfm_lora_sf_base.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/examples/rfm_lora_sf_base.py b/examples/rfm_lora_sf_base.py index 58fd60b..29aae15 100644 --- a/examples/rfm_lora_sf_base.py +++ b/examples/rfm_lora_sf_base.py @@ -63,7 +63,9 @@ print("Waiting for packets...") # initialize flag and timer # set a delay before sending the echo packet -transmit_delay = 0.5 +# avoide multibples of .5 second to minimize chances of node missing +# the packet between receive attempts +transmit_delay = 0.75 last_transmit_time = 0 packet_received = False while True: From 9c0b06195aaee5be395aaa93c9a318f909af5478 Mon Sep 17 00:00:00 2001 From: Nate Gay Date: Thu, 15 May 2025 19:26:05 -0400 Subject: [PATCH 15/15] Add float type hint to ack_delay member variable --- adafruit_rfm/rfm_common.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adafruit_rfm/rfm_common.py b/adafruit_rfm/rfm_common.py index 3f211f9..43ce081 100644 --- a/adafruit_rfm/rfm_common.py +++ b/adafruit_rfm/rfm_common.py @@ -178,7 +178,7 @@ def __init__( # noqa: PLR0913 """ self.ack_retries = 5 """The number of ACK retries before reporting a failure.""" - self.ack_delay = None + self.ack_delay: float = None """The delay time before attemting to send an ACK. If ACKs are being missed try setting this to .1 or .2. """