124 lines
3.4 KiB
Python
Executable file
124 lines
3.4 KiB
Python
Executable file
# SPDX-FileCopyrightText: 2018 Brent Rubell for Adafruit Industries
|
|
#
|
|
# SPDX-License-Identifier: MIT
|
|
|
|
"""
|
|
Example for using the RFM9x Radio with Raspberry Pi and LoRaWAN
|
|
|
|
Learn Guide: https://learn.adafruit.com/lora-and-lorawan-for-raspberry-pi
|
|
Author: Brent Rubell for Adafruit Industries
|
|
"""
|
|
import threading
|
|
import time
|
|
import subprocess
|
|
import busio
|
|
from digitalio import DigitalInOut, Direction, Pull
|
|
import board
|
|
# Import thte SSD1306 module.
|
|
import adafruit_ssd1306
|
|
# Import Adafruit TinyLoRa
|
|
from adafruit_tinylora.adafruit_tinylora import TTN, TinyLoRa
|
|
|
|
# Button A
|
|
btnA = DigitalInOut(board.D5)
|
|
btnA.direction = Direction.INPUT
|
|
btnA.pull = Pull.UP
|
|
|
|
# Button B
|
|
btnB = DigitalInOut(board.D6)
|
|
btnB.direction = Direction.INPUT
|
|
btnB.pull = Pull.UP
|
|
|
|
# Button C
|
|
btnC = DigitalInOut(board.D12)
|
|
btnC.direction = Direction.INPUT
|
|
btnC.pull = Pull.UP
|
|
|
|
# Create the I2C interface.
|
|
i2c = busio.I2C(board.SCL, board.SDA)
|
|
|
|
# 128x32 OLED Display
|
|
reset_pin = DigitalInOut(board.D4)
|
|
display = adafruit_ssd1306.SSD1306_I2C(128, 32, i2c, reset=reset_pin)
|
|
# Clear the display.
|
|
display.fill(0)
|
|
display.show()
|
|
width = display.width
|
|
height = display.height
|
|
|
|
# TinyLoRa Configuration
|
|
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
|
|
cs = DigitalInOut(board.CE1)
|
|
irq = DigitalInOut(board.D22)
|
|
rst = DigitalInOut(board.D25)
|
|
|
|
# TTN Device Address, 4 Bytes, MSB
|
|
devaddr = bytearray([0x00, 0x00, 0x00, 0x00])
|
|
# TTN Network Key, 16 Bytes, MSB
|
|
nwkey = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
# TTN Application Key, 16 Bytess, MSB
|
|
app = bytearray([0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
|
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00])
|
|
# Initialize ThingsNetwork configuration
|
|
ttn_config = TTN(devaddr, nwkey, app, country='US')
|
|
# Initialize lora object
|
|
lora = TinyLoRa(spi, cs, irq, rst, ttn_config)
|
|
# 2b array to store sensor data
|
|
data_pkt = bytearray(2)
|
|
# time to delay periodic packet sends (in seconds)
|
|
data_pkt_delay = 5.0
|
|
|
|
|
|
def send_pi_data_periodic():
|
|
threading.Timer(data_pkt_delay, send_pi_data_periodic).start()
|
|
print("Sending periodic data...")
|
|
send_pi_data(CPU)
|
|
print('CPU:', CPU)
|
|
|
|
def send_pi_data(data):
|
|
# Encode float as int
|
|
data = int(data * 100)
|
|
# Encode payload as bytes
|
|
data_pkt[0] = (data >> 8) & 0xff
|
|
data_pkt[1] = data & 0xff
|
|
# Send data packet
|
|
lora.send_data(data_pkt, len(data_pkt), lora.frame_counter)
|
|
lora.frame_counter += 1
|
|
display.fill(0)
|
|
display.text('Sent Data to TTN!', 15, 15, 1)
|
|
print('Data sent!')
|
|
display.show()
|
|
time.sleep(0.5)
|
|
|
|
while True:
|
|
packet = None
|
|
# draw a box to clear the image
|
|
display.fill(0)
|
|
display.text('RasPi LoRaWAN', 35, 0, 1)
|
|
|
|
# read the raspberry pi cpu load
|
|
cmd = "top -bn1 | grep load | awk '{printf \"%.1f\", $(NF-2)}'"
|
|
CPU = subprocess.check_output(cmd, shell = True )
|
|
CPU = float(CPU)
|
|
|
|
if not btnA.value:
|
|
# Send Packet
|
|
send_pi_data(CPU)
|
|
if not btnB.value:
|
|
# Display CPU Load
|
|
display.fill(0)
|
|
display.text('CPU Load %', 45, 0, 1)
|
|
display.text(str(CPU), 60, 15, 1)
|
|
display.show()
|
|
time.sleep(0.1)
|
|
if not btnC.value:
|
|
display.fill(0)
|
|
display.text('* Periodic Mode *', 15, 0, 1)
|
|
display.show()
|
|
time.sleep(0.5)
|
|
send_pi_data_periodic()
|
|
|
|
|
|
display.show()
|
|
time.sleep(.1)
|