import network
import time
from machine import Pin, SoftI2C
from machine import Pin, ADC
import urequests
import dht
import ssd1306
# Pin definitions
adc_pin = Pin(32, mode=Pin.IN)
# Inicialização do sensor DHT22 e da tela OLED
d = dht.DHT22(Pin(19))
i2c = SoftI2C(scl=Pin(22), sda=Pin(23))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
# Inicializar o ADC no pino 25
adc = ADC(adc_pin)
# Configurar a atenuação do ADC
adc.atten(ADC.ATTN_11DB) # Aumenta a faixa para até ~3.6V
# Configurar a largura de resolução (opcional, 9, 10, 11 ou 12 bits)
adc.width(ADC.WIDTH_12BIT) # Resolução de 12 bits
# Configuração dos LEDs
led = Pin(21, Pin.OUT)
led1 = Pin(18, Pin.OUT)
# Função para conectar à rede Wi-Fi
def connect_wifi(ssid, password):
print("Conectando ao Wi-Fi", end="")
red = network.WLAN(network.STA_IF)
red.active(True)
red.connect(ssid, password)
# Aguarda até que a conexão seja estabelecida
while not red.isconnected():
print('.', end="")
time.sleep(0.1)
print('\nConectado ao Wi-Fi')
# Função para codificar a mensagem (necessário para envio via URL)
def encode_message(message):
return message.replace(' ', '%20').replace('\n', '%0A').replace(':', '%3A')
# Função para converter o valor do ADC para pluviosidade (mm/h)
def adc_to_rainfall(adc_value):
# Mapeamento linear
# Valor ADC varia de 0 a 4095, tensão de 0 a 3.3V, pluviosidade de 0 a 100 mm/h
voltage = (adc_value / 4095.0) * 3.3 # Converter ADC para tensão
rainfall = (voltage / 3.3) * 100 # Converter tensão para pluviosidade (mm/h)
return rainfall
# Função para enviar uma mensagem de WhatsApp
def send_message(message, api_key, phone_number):
encoded_message = encode_message(message) # Codifica a mensagem
url = "https://api.callmebot.com/whatsapp.php?phone={}&text={}&apikey={}".format(
phone_number,
encoded_message,
api_key
)
# Construct the URL
#url = f'https://api.callmebot.com/whatsapp.php?phone={phone_number}&apikey={api_key}&text={encoded_message}'
print(url)
try:
response = urequests.get(url)
if response.status_code == 200:
print("Mensagem enviada com sucesso")
led.value(1) # Liga o LED
time.sleep(3) # Mantém o LED ligado por 3 segundos
led.value(0) # Desliga o LED
else:
print("Erro ao enviar a mensagem:", response.text)
except Exception as e:
print("Exceção ao enviar a mensagem:", str(e))
finally:
response.close() # Fecha a resposta HTTP
# Credenciais e informações de conexão
SSID = 'Wokwi-GUEST'
PASSWORD = ''
API_KEY = "8404414"
PHONE_NUMBER = "+558391142006"
# Conecta ao Wi-Fi
connect_wifi(SSID, PASSWORD)
# Links adicionais para a mensagem
enlace = "Enlace do Projeto: https://wokwi.com/projects/407240015935628289"
tempi = None # Obtém a temperatura
humi = None # Obtém a umidade
pluvi = None # Obtém a pluviosidade
# Loop principal
while True:
d.measure() # Faz a medição de temperatura e umidade
temp = d.temperature() # Obtém a temperatura
hum = d.humidity() # Obtém a umidade
adc_value = adc.read()
pluv = round(adc_to_rainfall(adc_value),0) # Obtém a pluviosidade
if temp != tempi or hum != humi or pluv !=pluvi: #dispara mensagem se valores mudarem
# Monta a mensagem para envio via WhatsApp
message = "Temperatura: {} C\nUmidade: {} %\nPluv: {} mm/h\n {}".format(temp, hum, pluv, enlace)
send_message(message, API_KEY, PHONE_NUMBER) # Envia a mensagem
tempi = temp # atualiza a temperatura
humi = hum # atualiza a umidade
pluvi = pluv # atualiza a pluviosidade
if pluv < 20 and hum < 60 or temp > 20:
led1.value(1) # Liga o motor
else:
led1.value(0) # desliga o motor
# Atualiza a tela OLED com as medições
oled.fill(0)
oled.text("Temp: " + str(temp) + " C", 0, 0)
oled.text("Hum: " + str(hum) + " %", 0, 10)
oled.text("Pluv: " + str(pluv) + " mm/h", 0, 20)
oled.show()
time.sleep(5) # Aguarda 20 segundos antes de repetir