#!/usr/bin/env python # Copyright (c) 2019, Pycom Limited. # This software is licensed under the GNU GPL version 3 or any # later version, with permitted additional terms. For more information # see the Pycom Licence v1.0 document supplied with this file, or # available at https://www.pycom.io/opensource/licensing #Módulos genéricos. from network import LoRa import socket import binascii import struct import time import machine from machine import Pin, I2C, ADC, deepsleep import pycom import os # Módulos periféricos: import bme280 import config import cayenneLPP # Desativa o RGB da placa: pycom.heartbeat(False) flagDebug = False flagRun = True if flagDebug or flagRun: from machine import Timer chrono = Timer.Chrono() chrono.start() # 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.US915) # create an ABP authentication params dev_addr = struct.unpack(">l", binascii.unhexlify('2603159A'))[0] nwk_swkey = binascii.unhexlify('406027B7DDCAD32C3AFD0D101A8092F4') app_swkey = binascii.unhexlify('1090D862EAC085FD828E2600FEBAE244') # remove all the channels for channel in range(0, 72): lora.remove_channel(channel) # set all channels to the same frequency (must be before sending the OTAA join request) for channel in range(0, 72): lora.add_channel(channel, frequency=config.LORA_FREQUENCY, dr_min=0, dr_max=3) # join a network using ABP (Activation By Personalization) lora.join(activation=LoRa.ABP, auth=(dev_addr, nwk_swkey, app_swkey)) # 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 non-blocking s.setblocking(False) #Inicializando a leitura dos sensores: if flagRun: lap1 = chrono.read_ms() # Cria e inicializa a comunicação I2C: i2c = I2C(0, I2C.MASTER) i2c.init(I2C.MASTER, baudrate = 400000) # Atribui o scan dos endereços a variável: connectedI2C = i2c.scan() # Printa os endereços: if flagDebug: print("Connected I2C devices: " + str(connectedI2C)) bmet = [] # Lista com as temperaturas lidas com o BME280 bmeh = [] # Lista com as umiadades lidas com o BME280 bmep = [] # Lista com as pressoes lidas com o BME280 bme_s = False # Flag para indicar se o BME280 esta conectado connected_i2c = False # Flag para indicar se possui algum sensor I2C conectado if len(connectedI2C) > 0: connected_i2c = True if connected_i2c: for device in connectedI2C: if device == 0x76: # BME280 - 118 bme = bme280.BME280(i2c=i2c, pressure_mode=bme280.OSAMPLE_8, iir=bme280.FILTER_8) bme_s = True else: if flagDebug: print("I2C nao reconhecido") # Dispositivo nao cadastrado if bme_s: # Le valores BME280 com media para ter maior precisao : numreadings = 15 samples_temperature = [0.0]*numreadings; mean_temperature = 0.0 samples_pressure = [0.0]*numreadings; mean_pressure = 0.0 samples_humidity = [0.0]*numreadings; mean_humidity = 0.0 for i in range (numreadings): samples_temperature[i], samples_pressure[i], samples_humidity[i] = bme.values mean_temperature = sum(samples_temperature)/len(samples_temperature) mean_pressure = sum(samples_pressure)/len(samples_pressure) mean_humidity = sum(samples_humidity)/len(samples_humidity) t = mean_temperature p = mean_pressure/100 # Pa -> hectoPa h = mean_humidity bmet.append(t) bmep.append(p) bmeh.append(h) # Criando pacote Cayenne LPP lpp = cayenneLPP.CayenneLPP(size = 100, sock = s) if bme_s: lpp.add_temperature(bmet[0]) lpp.add_barometric_pressure(bmep[0]) lpp.add_relative_humidity(bmeh[0]) # OBS: Não sei o objetivo de algumas funções no código do Alan, como: # pycom.nvs_set(), lpp.add_luminosity(), for i in range (10): pkt = b'PKT #' + bytes([i]) print('Sending:', pkt) s.send(pkt) time.sleep(4) rx, port = s.recvfrom(256) if rx: print('Received: {}, on port: {}'.format(rx, port)) time.sleep(6)