import machine
import dht
import time
import random # Simulated LoRa communication
class LoRaSX1278:
"""Simulated LoRa SX1278 module for Wokwi"""
def __init__(self, miso=19, mosi=23, sck=18, nss=5, rst=14, dio0=26):
self.spi = machine.SPI(1, baudrate=5000000, polarity=0, phase=0,
sck=machine.Pin(sck), mosi=machine.Pin(mosi), miso=machine.Pin(miso))
self.nss = machine.Pin(nss, machine.Pin.OUT)
self.rst = machine.Pin(rst, machine.Pin.OUT)
self.dio0 = machine.Pin(dio0, machine.Pin.IN)
self.reset()
print("[LoRa] Module Initialized")
def reset(self):
"""Reset the LoRa module"""
self.rst.value(0)
time.sleep(0.01)
self.rst.value(1)
time.sleep(0.01)
def send(self, message):
"""Simulate sending data over LoRa"""
print(f"[LoRa TX] Sent: {message}")
def recv(self):
"""Simulate receiving data over LoRa"""
if random.random() > 0.2: # Increase probability of receiving data
return f"{random.uniform(25, 30):.1f},{random.uniform(50, 70):.1f}"
return None
# **Setup DHT22 Sensor**
DHT_PIN = 18
sensor = dht.DHT22(machine.Pin(DHT_PIN))
# **Setup LoRa**
lora = LoRaSX1278()
print("ESP32 LoRa System Ready...")
while True:
try:
# **Transmit Data**
sensor.measure()
temp = sensor.temperature()
humidity = sensor.humidity()
data = f"{temp:.1f},{humidity:.1f}"
print("[ESP32 TX] Sending:", data)
lora.send(data)
# **Receive Data with Retries**
received_data = None
for _ in range(5): # Try receiving multiple times
received_data = lora.recv()
if received_data:
break
time.sleep(1) # Small delay before retry
if received_data:
temp, humidity = received_data.split(",") # Split received data
print(f"[ESP32 RX] Temperature: {temp}°C, Humidity: {humidity}%")
else:
print("[ESP32 RX] No Data Received (After Retries)")
except Exception as e:
print("Error:", e)
time.sleep(5) # Short delay before next transmission cycle