import network
import time
from machine import Pin, ADC
import dht
import ujson
import socket
import onewire, ds18x20
import os
from threadsafe_filebased_buffer import MessageBuffer
import _thread
SERVER_IP = "10.13.37.3"
PORT = 8080
ID = 1
soil_sensor1 = ADC(Pin(35) )
soil_sensor2 = ADC(Pin(32) )
soil_sensor3 = ADC(Pin(33) )
threshold_low = 20
threshold_high = 80
max_level = 65535
ds_pin = Pin(4)
message_buffer = MessageBuffer()
ds_sensor = ds18x20.DS18X20(onewire.OneWire(ds_pin))
roms = ds_sensor.scan()
print('Found DS devices: ', roms)
#def guardar_datos_en_cola(datos):
# try:
# print("Guardando datos en cola")
# with open("cola_pendientes.txt", "a") as archivo:
# archivo.write(datos + "\n")
# except Exception as e:
# print(f"Error al guardar datos en el archivo: {e}")
# def enviar_datos_pendientes(client_socket):
# nombre_archivo = "cola_pendientes.txt"
# with open(nombre_archivo, "r") as archivo:
# lineas = archivo.readlines()
# for linea in lineas:
# try:
# print(f"Enviando datos pendientes: {linea}")
# client_socket.send(linea.encode())
# except Exception as e:
# print(f"Error de al enviar datos pendientes: {e}")
# else:
# os.remove("cola_pendientes.txt")
# time.sleep(5)
#def cant_pendientes():
# try:
# os.stat("cola_pendientes.txt")
# with open(r"cola_pendientes.txt", 'r') as fp:
# lines = len(fp.readlines())
# return lines
# except OSError:
# return 0
#def enviar_datos(datos):
# try:
# client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# print("intentando conectar")
# # Connect to the server
# client_socket.connect((SERVER_IP, PORT))
# print("Connected to server!")
# # Send data to the server
# text_to_send = datos
# client_socket.send(text_to_send.encode())
# print("Envio exitoso")
# if (cant_pendientes()>0):
# print("Enviando pendientes")
# enviar_datos_pendientes(client_socket)
# except OSError as e:
# print(f"Error de red: {e}, guardando datos en archivo")
# guardar_datos_en_cola(datos)
# # Close the socket
# client_socket.close()
def read_sensors():
moisture=[0,0,0]
temperature=[0.0,0.0,0.0]
# print(cant_pendientes(), end="")
print("- Measuring soil conditions... ", end="")
moisture[0] = int(soil_sensor1.read_u16()*100/max_level)
moisture[1] = int(soil_sensor2.read_u16()*100/max_level)
moisture[2] = int(soil_sensor3.read_u16()*100/max_level)
ds_sensor.convert_temp()
time.sleep_ms(750)
for rom in roms:
i=roms.index(rom)
temperature[i]=ds_sensor.read_temp(rom)
message = ujson.dumps({
"id": ID,
"m1": moisture[0],
"m2": moisture[1],
"m3": moisture[2],
"t1": temperature[0],
"t2": temperature[1],
"t3": temperature[2],
})
return message
def sense_thread():
prev_weather = ""
while True:
message = read_sensors()
if message != prev_weather:
print("Updated!")
message_buffer.enqueue(message)
prev_weather = message
else:
print("No change")
time.sleep(1)
def send_thread():
while True:
while not message_buffer.is_empty():
message = message_buffer.dequeue()
if message:
try:
client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print("intentando conectar")
# Connect to the server
client_socket.connect((SERVER_IP, PORT))
print("Connected to server!")
# Send data to the server
text_to_send = message
client_socket.send(text_to_send.encode())
print("Envio exitoso")
except OSError as e:
print(f"Error de red: {e}, guardando datos en archivo")
message_buffer.enqueue(datos)
# Close the socket
client_socket.close()
print("Connecting to WiFi", end="")
sta_if = network.WLAN(network.STA_IF)
sta_if.active(True)
sta_if.connect('Wokwi-GUEST', '')
while not sta_if.isconnected():
print(".", end="")
time.sleep(0.1)
print(" Connected!")
_thread.start_new_thread(sense_thread, ())
_thread.start_new_thread(send_thread, ())
while True:
time.sleep(1)