import network
import time
from machine import Pin, PWM, ADC, I2C
import ssd1306
import dht
# from umqtt.simple import MQTTClient # Commenté pour ne pas utiliser MQTT
# Configurer l'I2C pour l'afficheur OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21)) # Utilisation de GPIO 22 et 21 pour l'I2C
oled = ssd1306.SSD1306_I2C(128, 64, i2c) # Écran OLED 128x64
# Configurer la connexion Wi-Fi
SSID = "Wokwi-GUEST"
PASSWORD = ""
# Remplacez par votre mot de passe Wi-Fi
# Configurer la connexion au Wi-Fi
wifi = network.WLAN(network.STA_IF)
wifi.active(True)
wifi.connect(SSID, PASSWORD)
# Attendre que la connexion soit établie
while not wifi.isconnected():
time.sleep(1)
print("Connecté au Wi-Fi")
print(wifi.ifconfig())
# Configurer le potentiomètre sur la broche analogique GPIO34
potentiometer_pin = ADC(Pin(34)) # GPIO 34 pour lire le potentiomètre
potentiometer_pin.atten(ADC.ATTN_0DB) # Plage 0-3.3V
# Configurer le servo sur la broche GPIO13
servo_pin = Pin(13, Pin.OUT)
servo = PWM(servo_pin, freq=50) # Fréquence PWM pour le servo
# Configurer le capteur DHT (température et humidité) sur GPIO14
dht_sensor = dht.DHT22(Pin(14)) # Utilisez DHT11 ou DHT22
# Fonction pour ajuster l'angle du servo en fonction du potentiomètre
def control_valve():
# Lire la valeur du potentiomètre (de 0 à 4095)
pot_value = potentiometer_pin.read()
# Mapper la valeur du potentiomètre (0-4095) à un pourcentage de la vanne (0-100)
valve_percentage = int((pot_value / 4095) * 100)
MIN_DUTY = 26 # Correspond à 0°
MAX_DUTY = 127 # Correspond à 180°
# Mapper la valeur du pourcentage d'ouverture (0-100) à la plage PWM du servo (40-115)
servo_value = int((valve_percentage / 100) * (MAX_DUTY - MIN_DUTY) + MIN_DUTY)
# Appliquer la valeur au servo pour ajuster l'ouverture de la vanne
servo.duty(servo_value)
# Lire la température et l'humidité
try:
dht_sensor.measure()
temperature = dht_sensor.temperature() # Température en °C
humidity = dht_sensor.humidity() # Humidité en %
except Exception as e:
temperature = 0
humidity = 0
print("Erreur de lecture DHT:", e)
# Afficher les informations sur l'écran OLED
oled.fill(0) # Effacer l'écran
oled.text("Temp: {}C".format(temperature), 0, 0) # Afficher la température
oled.text("Humid: {}%".format(humidity), 0, 10) # Afficher l'humidité
oled.text("Potentiomètre: {}".format(pot_value), 0, 20) # Afficher la valeur du potentiomètre
oled.text("Ouverture: {}%".format(valve_percentage), 0, 30) # Afficher l'ouverture de la vanne
oled.show() # Mettre à jour l'affichage
# Commenter l'envoi MQTT
# client.publish(MQTT_TOPIC_TEMP, str(temperature))
# client.publish(MQTT_TOPIC_HUMIDITE, str(humidity))
# client.publish(MQTT_TOPIC_VANNE, str(valve_percentage))
# Fonction pour recevoir des commandes MQTT pour la vanne
def control_vanne_callback(topic, msg):
if topic == MQTT_TOPIC_CONTROL_VANNE:
try:
valve_control_value = int(msg)
# Mapper la valeur reçue pour ajuster le servo
servo_value = int((valve_control_value / 100) * 75 + 40) # Mapper à la plage du servo (40 à 115)
servo.duty(servo_value)
print("Commande reçue: Ouvrir la vanne à {}%".format(valve_control_value))
except ValueError:
print("Message invalide pour la commande de vanne:", msg)
# Abonner le client MQTT pour recevoir les commandes de la vanne
# client.set_callback(control_vanne_callback)
# Boucle principale
while True:
control_valve() # Ajuster la vanne en fonction du potentiomètre et afficher sur OLED
# client.check_msg() # Vérifier si des messages MQTT ont été reçus
time.sleep(1) # Attendre avant de lire la prochaine valeur
Loading
esp32-devkit-c-v4
esp32-devkit-c-v4
Loading
ssd1306
ssd1306