127 lines
3.5 KiB
Python
127 lines
3.5 KiB
Python
""" humidity and temperature sensor AM2305 """
|
|
""" reads humidity and temperature and sends it via LoRaWAN"""
|
|
|
|
from network import LoRa
|
|
import socket
|
|
import ubinascii
|
|
import struct
|
|
import time
|
|
import config
|
|
from machine import Pin
|
|
from machine import WDT
|
|
import machine
|
|
import pycom
|
|
from dth import DTH
|
|
|
|
SENSOR_PIN = 'P23'
|
|
FLASH_PIN = 'P2'
|
|
|
|
def generate_lora_message():
|
|
|
|
th = DTH('P23', 1)
|
|
result = th.read()
|
|
temp = '{:3.2f}'.format(result.temperature / 1.0)
|
|
humi = '{:3.2f}'.format(result.humidity / 1.0)
|
|
|
|
__message__ = '/Temp:' + str(temp) + "C/Humi:" + str(humi) + '%'
|
|
|
|
print("Generated message: " + str(__message__))
|
|
|
|
return __message__
|
|
|
|
|
|
|
|
pycom.heartbeat(False)
|
|
wdt = WDT(timeout=40000) # enable it with a timeout of 2 seconds
|
|
wdt.feed()
|
|
print("Waking up...")
|
|
|
|
# initialize LoRa in LORAWAN mode.
|
|
# Please pick the region that matches where you are using the device:
|
|
# Asia = LoRa.AS923
|
|
# Australia = LoRa.AU915
|
|
# Europe = LoRa.EU868
|
|
# United States = LoRa.US915
|
|
lora = LoRa(mode=LoRa.LORAWAN, region=LoRa.EU868)
|
|
lora.init(mode=LoRa.LORAWAN)
|
|
|
|
lora.nvram_restore()
|
|
|
|
# create an OTA authentication params
|
|
dev_eui = ubinascii.unhexlify('70B3D5499DB25D35') # these settings can be found from TTN
|
|
app_eui = ubinascii.unhexlify('70B3D57ED000D35F') # these settings can be found from TTN
|
|
app_key = ubinascii.unhexlify('A36F43FF887069841A6C421DC20B574B') # these settings can be found from TTN
|
|
|
|
# set the 3 default channels to the same frequency (must be before sending the OTAA join request)
|
|
lora.add_channel(0, frequency=config.LORA_FREQUENCY, dr_min=0, dr_max=5)
|
|
lora.add_channel(1, frequency=config.LORA_FREQUENCY, dr_min=0, dr_max=5)
|
|
lora.add_channel(2, frequency=config.LORA_FREQUENCY, dr_min=0, dr_max=5)
|
|
|
|
if not lora.has_joined():
|
|
# join a network using OTAA
|
|
print("Joining LoRa network...")
|
|
lora.join(activation=LoRa.OTAA, auth=(dev_eui, app_eui, app_key), timeout=0, dr=config.LORA_NODE_DR)
|
|
|
|
# wait until the module has joined the network
|
|
retry_cnt = 0
|
|
sleep_cnt = 0
|
|
while not lora.has_joined():
|
|
time.sleep(2.5)
|
|
print('Not joined yet...')
|
|
retry_cnt = retry_cnt + 1
|
|
|
|
if retry_cnt > 10:
|
|
lora.join(activation=LoRa.OTAA, auth=(dev_eui, app_eui, app_key), timeout=0, dr=config.LORA_NODE_DR)
|
|
print('Sending join request again...')
|
|
retry_cnt = 0
|
|
sleep_cnt = sleep_cnt + 1
|
|
|
|
if sleep_cnt > 10:
|
|
sleep_cnt = 0
|
|
print('Could not connect! Entering deep sleep...')
|
|
machine.deepsleep(200000)
|
|
|
|
# remove all the non-default channels
|
|
for i in range(3, 16):
|
|
lora.remove_channel(i)
|
|
else:
|
|
print("Woke from deepsleep... already joined...")
|
|
|
|
# create a LoRa socket
|
|
s = socket.socket(socket.AF_LORA, socket.SOCK_RAW)
|
|
|
|
# set the LoRaWAN data rate
|
|
s.setsockopt(socket.SOL_LORA, socket.SO_DR, config.LORA_NODE_DR)
|
|
|
|
# make the socket blocking
|
|
s.setblocking(False)
|
|
|
|
# generate message
|
|
|
|
lora.nvram_save()
|
|
|
|
flashing = Pin(FLASH_PIN, mode=Pin.IN, pull=Pin.PULL_UP)
|
|
sleep = 1
|
|
wdt.feed()
|
|
|
|
while True:
|
|
|
|
if not flashing():
|
|
print("User Button was pressed! No deep sleep anymore...")
|
|
sleep = 0
|
|
|
|
# if a message was received we go back to sleep
|
|
rx, port = s.recvfrom(256)
|
|
if rx:
|
|
print('Received: {}, on port: {}'.format(rx, port))
|
|
print('Sleeping is enabled again...')
|
|
sleep = 1
|
|
|
|
msg = generate_lora_message()
|
|
|
|
s.send(msg)
|
|
time.sleep(10)
|
|
if sleep:
|
|
print("Entering deep sleep....")
|
|
machine.deepsleep(500000)
|