from machine import Pin, I2C, PWM, SoftI2C, ADC
import time
import dht
from ssd1306 import SSD1306_I2C
import tm1637
from time import sleep
# Configuration des broches
trig = Pin(18, Pin.OUT, value=0) # TRIG pour le capteur ultrasonique
echo = Pin(17, Pin.IN) # ECHO pour le capteur ultrasonique
relayIN = Pin(27, Pin.OUT, value=0) # Relais d'entrée
relayOUT = Pin(26, Pin.OUT, value=0) # Relais de sortie
systemButton = Pin(16, Pin.IN) # Interrupteur SPDT (Pin commune)
buzzer = PWM(Pin(5, Pin.OUT), freq=1)
buzzer.duty(0) # Buzzer
led_alert = Pin(4, Pin.OUT) # LED d'alerte
led_alert2 = Pin(25, Pin.OUT) # LED d'alerte2
led_alert_flamme = Pin(12, Pin.OUT) # LED d'alerte de flamme
sensor = dht.DHT22(Pin(5))
# Configuration du servomoteur
PIN_VALUE = 19 # définir la variable pour le numéro de PIN
FREQ_PWM = 50 # définir la variable de fréquence pour le PWM
pin = Pin(PIN_VALUE,Pin.OUT) # Créer la variable de broche comme sortie
serv = PWM(pin) # Créer la sortie de PWM sur la broche définie précédemment
serv.freq(FREQ_PWM) # Afficher la fréquence de 50 Hz du PWM
# Définir les constantes
SET_POINT_TEMPERATURA = 26 # Point de consigne pour la température
MAX_GRADOS = 10 # Maximum d'écart de température pour contrôle
# Fonction pour calculer les angles
def calc_angulo(grados):
min_angulo = 0
max_angulo = 180
rel = grados / (max_angulo - min_angulo)
min_val = 0.5
max_val = 2.49
rel_val = (rel * (max_val - min_val)) + min_val
perc = rel_val / (1 * 1000 / FREQ_PWM)
value_pwm = perc * 1023
return int(value_pwm)
# Configuration des broches potentiomètre
potentiometer = ADC(Pin(13))
potentiometer.atten(ADC.ATTN_11DB) # Plage 0-3,3V
# Initialisation de l'afficheur TM1637
tm = tm1637.TM1637(clk=Pin(32), dio=Pin(33))
# Configuration de l'écran LCD
i2c = I2C(scl=Pin(22), sda=Pin(21), freq=100000)
# Variables pour la mesure
Ton = 0
Toff = 0
counter = 0
# Éteindre LED et buzzer au démarrage
led_alert.value(0)
led_alert2.value(0)
# Configuration de l'OLED
light_sensor = ADC(Pin(14))
oled = SSD1306_I2C(128, 64, i2c)
oled.invert(1)
counter = 0
while True:
print('systeme off')
oled.fill(0)
oled.text ('SYSTEM OFF',10,30)
oled.show()
time.sleep_ms(50)
while systemButton.value() == 1:
potDigitalValue = potentiometer.read()
equAnalogValue = (3.3 / 4095) * potDigitalValue
# Condition pour déclencher une alerte
if equAnalogValue > 2:
tm.number(counter)
sleep(0.01)
counter += 1
if counter >= 1000:
counter = 0
relayIN.off()
relayOUT.off()
lcd.putstr("\n ATTENTION FUITE !!")
buzzer.freq(1000)
buzzer.duty(100)
serv.duty(calc_angulo(180))
time.sleep(1)
buzzer.duty(0)
led_alert_flamme.value(1)
time.sleep_ms(300)
led_alert.value(0)
led_alert2.value(0)
led_alert_flamme.value(0)
else:
tm.write([0, 0, 0, 0])
time.sleep(0.1)
print('system on')
reading = systemButton.value()
if reading == 0:
break
trig.on()
time.sleep_us(10)
trig.off()
while echo.value() == 0 :
Toff = time.ticks_us()
while echo.value() == 1 :
Ton = time.ticks_us()
t = (Ton - Toff) / 2
distance = round((0.034 * t ) , 2)
water = 300 - (distance - 100)
print(water)
if 100 < water < 300:
oled.text ('loulour mrigla',10,50)
relayIN.on()
relayOUT.on()
serv.duty(calc_angulo(0))
led_alert2.value(1)
led_alert.value(0)
if water < 100:
oled.text ('raw fragh',10,50)
relayOUT.off()
relayIN.on()
serv.duty(calc_angulo(0))
buzzer.freq(2000)
buzzer.duty(100) # Activer le buzzer
led_alert.value(1)
led_alert_flamme.value(0)
time.sleep(1) # Laisser le buzzer sonner pendant 1 seconde
buzzer.duty(0) # Éteindre le buzzer
led_alert.value(0)
led_alert2.value(0)
led_alert_flamme.value(0)
if water > 300:
oled.text ('raw t3aba',10,50)
relayIN.off()
relayOUT.on()
serv.duty(calc_angulo(180))
buzzer.freq(2000)
buzzer.duty(100) # Activer le buzzer
led_alert.value(1)
led_alert_flamme.value(0)
time.sleep(1) # Laisser le buzzer sonner pendant 1 seconde
buzzer.duty(0) # Éteindre le buzzer
led_alert.value(0)
led_alert2.value(0)
led_alert_flamme.value(0)
sensor.measure()
t =sensor.temperature()
h =sensor.humidity()
light=65535-light_sensor.read_u16() #unsigned w 16 bits 2^16 =65535 (0-->65535)
light = int(light*(100/65535))
#print(f'l = ',light,'%')
if light > 30 :
oled.invert(1)
else:
oled.invert(0)
oled.text (f'temp : {t} C',10,10)
oled.text (f'hum : {h} %',10,20)
oled.text (f'light : {light} %',10,30)
oled.show() #bch taffichili
time.sleep_ms(5)
oled.fill(0)