#*****************************
# *** UAI - FTI -Posgrados ***
# * Cloud Robotics *
# * 1er Cuat. 2023 *
# * GRUPO 1 *
# * EXAMEN FINAL *
# ****************************
# Sensor Hídrico *
# v.4 *
#----------------------------*
#*****************************
#DISPOSITIVO: ESP32
# --> ACTUADOR: LED rojo PIN=13
# <-- SENSOR : (pote) PRESIÓN PIN=35 ("nivel")
# <-- SENSOR : (pote) CAUDAL PIN=34
#AREA DE PARAMETROS DE CONFIGURACION DE DISPOSITIVO
###################################################
DISPOSITIVO = '0105'
PIN_ACTUADOR = 13 #conexion LED rojo
PIN_SENSOR_NIVEL = 35 #conexion puerto sensor presion
PIN_SENSOR_CAUDAL = 34 #conexion puerto sensor caudal
SERVIDOR = '186.18.125.215'
PUERTO = 5000
ENDPOINT_MEDICION = '/measurements/insert'
ESCALA_NIVEL = 5 # el nivel puede variar +/- 5m respecto a valores tabulados
ESCALA_CAUDAL = 1000 # el caudal puede variar +/- 1000 m3/seg respecto a valores
# tabulados
ALIVE_TIME = 10 # en segundos para envio PROGRAMADO
RED_WIFI = 'Wokwi-GUEST'
CLAVE_WIFI = 'clave'
SERVIDOR_UTC = 'http://worldtimeapi.org/api/timezone/America/Argentina/Buenos_Aires'
# define el tipo de envío. Si es ante cambio de magnitudes sensadas o cada T segundos
class envio():
ANTE_CAMBIO = 0
PROGRAMADO = 1
TIPO_ENVIO = envio.ANTE_CAMBIO
###################################################
import time
import ubinascii
import machine
import micropython
import network
import esp
import dht
import json
import urequests as requests
from machine import Pin
from machine import ADC
esp.osdebug(None)
import gc
gc.collect()
# variables globales -------------------------------------------
ssid = RED_WIFI
password = CLAVE_WIFI
timeout = ALIVE_TIME #superado este tiempo en segundos, se envia un ALIVE
secuencia = 0 #conteo de ALIVEs
idSensor = DISPOSITIVO
status = 'OK' #permite agregado de estados como LOWBATT,
#sin respuesta de sensor, etc. mediante
#logica adicional
# URL de la API
endpoint = 'http://' + SERVIDOR + ':' + str(PUERTO) + ENDPOINT_MEDICION
# modo de envío de datos
modo_envio = TIPO_ENVIO
# hardware periférico e inicialización --------------------------
# sensores de "nivel" y "caudal" conectados a conversor AD
sensor_nivel = machine.Pin(PIN_SENSOR_NIVEL, machine.Pin.IN)
sensor_caudal= machine.Pin(PIN_SENSOR_CAUDAL, machine.Pin.IN)
adc_1 = machine.ADC(sensor_nivel)
adc_2 = machine.ADC(sensor_caudal)
conversion_factor = 3.3 / (65535) # Voltaje de 3.3
# actuador indicador LED conectado en Pin13
pin = machine.Pin(PIN_ACTUADOR, machine.Pin.OUT)
# acceso a wifi
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect(RED_WIFI, '')
#sta_if.connect('Wokwi-GUEST', '')
#esperando se conecte a la wifi
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
# FUNCIONES -----------------------------------------------------
def enviar_post(idSensor,status,nivel,caudal):
global endpoint
sensor_name = "ID:" + idSensor
data={
"uuid": sensor_name,
"status": status,
"level": nivel,
"flow": caudal
}
response = requests.post(endpoint, json=data)
print("Status code: ", response.status_code)
return(response.json())
def enviar_get(worldtimeapi):
response = requests.get(worldtimeapi)
datos=response.json()
diahora = datos['utc_datetime'][:19]
print("datos: ", diahora)
return diahora
#reconectar
def restart_and_reconnect():
#print('Failed to connect to server. Reconnecting...')
time.sleep(10)
machine.reset()
#inicio bloque principal
#--------- MAIN ----------------------------------------------------
nivel_ant = ""
caudal_ant = ""
tiempo_ant = time.time()
secuencia = 0
print('******************************************************')
print('Sensor Hídrico ' + idSensor + ' iniciando mediciones...')
print('******************************************************')
while True:
try:
time.sleep(1)
pin.value(0) # apaga LED de TX
#realiza medicion de presion
voltaje = adc_1.read_u16() * conversion_factor # Convertidor de 0 - 3.3 volts
nivel = (voltaje/3.3) * (2* ESCALA_NIVEL) - ESCALA_NIVEL
#realiza medicion de caudal
voltaje = adc_2.read_u16() * conversion_factor # Convertidor de 0 - 3.3 volts
caudal = (voltaje/3.3) * (2* ESCALA_CAUDAL) - ESCALA_CAUDAL
#envia datos de sensores si cambia alguno de los valores
if nivel_ant != nivel or caudal_ant != caudal and modo_envio == envio.ANTE_CAMBIO:
print("nivel: " + str(nivel))
print("caudal: " + str(caudal))
nivel_ant = nivel
caudal_ant = caudal
# referencia temporal del estado
diahora=enviar_get(SERVIDOR_UTC)
status_diahora = status + ' ' + diahora
# info de sensores
enviar_post(idSensor,status_diahora,nivel,caudal)
pin.value(1) #enciende led de tx
print('---------------------------')
#envía datos de sensores cada T segundos
tiempo = time.time()
delta_tiempo = tiempo - tiempo_ant
if delta_tiempo >= timeout and modo_envio == envio.PROGRAMADO:
#enviar mensaje porque se superó timeout
tiempo_ant = tiempo
print("nivel: " + str(nivel))
print("caudal: " + str(caudal))
nivel_ant = nivel
caudal_ant = caudal
# referencia temporal del estado
diahora=enviar_get(SERVIDOR_UTC)
status_diahora = status + ' ' + diahora
# info de sensores
try:
enviar_post(idSensor,status_diahora,nivel,caudal)
pin.value(1) #enciende led de tx
print('---------------------------')
except OSError as e:
restart_and_reconnect()
except OSError as e:
restart_and_reconnect()