from machine import Pin, I2C, ADC, PWM
import ssd1306
import time
# Initialisation de l'I2C pour l'afficheur OLED
i2c = I2C(0, scl=Pin(22), sda=Pin(21))
# Déclaration des pins et des composants
NTC_pin = Pin(32)
NTC = ADC(NTC_pin)
relay_aspiration = Pin(25, Pin.OUT) # Relais pour l'aspiration
relay_desaspiration = Pin(26, Pin.OUT) # Relais pour la désaspiration
motor_pwm = PWM(relay_aspiration)
motor_pwm.freq(1000)
pot = ADC(Pin(33)) # Potentiomètre
button_marche = Pin(34, Pin.IN) # Bouton marche
button_stope = Pin(35, Pin.IN) # Bouton arrêt
button_direction = Pin(14, Pin.IN) # Nouveau bouton pour changer la direction
relay_fan = Pin(23, Pin.OUT) # Relais pour le ventilateur
buzzer = Pin(27, Pin.OUT) # Buzzer
# Initialisation de l'écran OLED
oled_width = 128
oled_height = 64
oled = ssd1306.SSD1306_I2C(oled_width, oled_height, i2c)
motor_running = False # État du moteur
direction = 'aspiration' # Direction initiale
alarm_triggered = False # État de l'alarme
def temperature(ntc_value):
"""Convertit la valeur lue du capteur NTC en température Celsius."""
return 80 - ((ntc_value * 1) / 65535) * 104
while True:
# Lecture des boutons
reading_marche = button_marche.value()
reading_stope = button_stope.value()
reading_direction = button_direction.value() # Lecture du bouton de direction
# Lecture de la température
ntc_value = NTC.read_u16()
temperature_en_C = temperature(ntc_value)
# Lecture de la valeur du potentiomètre pour ajuster la vitesse du moteur
pot_value = pot.read_u16()
motor_speed = int((pot_value / 65535) * 1023) # Valeur PWM
motor_speed_percent = int((pot_value / 65535) * 100) # Pourcentage de vitesse
# Gestion des boutons marche et arrêt
if reading_marche == 1:
motor_running = True
if reading_stope == 1:
motor_running = False
# Gestion de la direction
if reading_direction == 1: # Si le bouton de direction est pressé
direction = 'desaspiration' if direction == 'aspiration' else 'aspiration'
# Gestion de la température
if temperature_en_C >= 50:
buzzer.on() # Activer le buzzer si la température dépasse 50°C
alarm_triggered = True
else:
buzzer.off() # Désactiver le buzzer
alarm_triggered = False
if temperature_en_C >= 40:
motor_running = False # Arrêter le moteur
relay_fan.on() # Activer le ventilateur
else:
relay_fan.off() # Désactiver le ventilateur
# Gestion du moteur
if motor_running and temperature_en_C < 40:
motor_pwm.duty(motor_speed) # Réguler la vitesse du moteur
if direction == 'aspiration':
relay_aspiration.on() # Activer l'aspiration
relay_desaspiration.off() # Désactiver la désaspiration
elif direction == 'desaspiration':
relay_aspiration.off() # Désactiver l'aspiration
relay_desaspiration.on() # Activer la désaspiration
else:
motor_pwm.duty(0) # Arrêter le moteur
# Affichage sur l'écran OLED
oled.fill(0)
oled.text('Temp: {:.2f} C'.format(temperature_en_C), 0, 0)
oled.text('Moteur: {}'.format('Marche' if motor_running else 'Arrete'), 0, 10)
oled.text('Vitesse: {}%'.format(motor_speed_percent), 0, 20)
oled.text('Direction: {}'.format(direction), 0, 30)
oled.show()
time.sleep(1) # Afficher les données toutes les secondes