import network
import time
from umqtt.simple import MQTTClient
import machine
import ujson
import ntptime
from lcd_api import LcdApi
from i2c_lcd import I2cLcd
# Configurer les broches
servo_pin = machine.Pin(18)
ledRed_pin = machine.Pin(23)
ledGreen_pin = machine.Pin(22)
ledBlue_pin = machine.Pin(21)
# Configurer les broches SDA et SCL pour l'I2C
i2c = machine.SoftI2C(scl=machine.Pin(14), sda=machine.Pin(12))
angle,R,G,B = 140,0,255,0
I2C_ADDR = 0x27
totalRows = 2
totalColumns = 16
main_message = " Salle de bain OUVERTE"
# Créer un objet servomoteur ,un objet led, un objet ecran et un objet d'horodatage
myServo = machine.PWM(servo_pin, freq=50)
ledRed = machine.PWM(ledRed_pin,1000)
ledGreen = machine.PWM(ledGreen_pin,1000)
ledBlue = machine.PWM(ledBlue_pin,1000)
myScreen = I2cLcd(i2c,I2C_ADDR,totalRows,totalColumns)
def set_servo_angle(servo, position):
# Mapper l'angle du moteur
du_ty = int((position/180)*65 + 40)
# Appliquer le devoir PWM au servo moteur
servo.duty(du_ty)
# Attendre un court instant pour que le servo atteigne la position
time.sleep_ms(500)
def set_rgb_color(red, green, blue):
# Mapper les valeurs de couleur
duty_red = int((red / 255) * 1023) # 1023 est la valeur maximale pour la fréquence PWM
duty_green = int((green / 255) * 1023)
duty_blue = int((blue / 255) * 1023)
# Appliquer les devoirs PWM aux composantes de couleur
ledRed.duty(duty_red)
ledGreen.duty(duty_green)
ledBlue.duty(duty_blue)
time.sleep(1)
def local_hour(horodatage):
# Ajuster l'heure en fonction du fuseau horaire
utc_offset = -5
if horodatage[4]+utc_offset < 0:
utc_offset = 24 + utc_offset
return utc_offset
def sending_message(msg, UTC, horodatage):
# Définir le message à envoyer au broker
return str(horodatage[2]) + "/"+ str(horodatage[1]) + "/"+ str(horodatage[0]) + str(msg) + " à " + str(horodatage[4] + UTC) + ":" + str(horodatage[5])
# Paramètre du reseau WiFi
# SSID: Wokwi-GUEST
# Password: rien
print("Connexion au réseau WiFi", end="")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect("Wokwi-GUEST", "")
while not wlan.isconnected():
print(".", end="")
time.sleep(0.1)
print(wlan.ifconfig())
print("WiFi Connecté!")
# Paramètre du serveur MQTT
MQTT_CLIENT_ID = "Client-ID-salon"
MQTT_BROKER = "3cb0712f6a544fa295e80b5b1f207c52.s2.eu.hivemq.cloud"
MQTT_USER = "serrure-connecte"
MQTT_PASSWORD = "ENMserrure0"
MQTT_TOPIC = "Dart/Mqtt_client/testtopic"
print("Connexion au serveur MQTT... ", end="")
client = MQTTClient(client_id=MQTT_CLIENT_ID,
server=MQTT_BROKER, user=MQTT_USER,
password=MQTT_PASSWORD,
keepalive=7200,
ssl=True,
ssl_params={'server_hostname':'3cb0712f6a544fa295e80b5b1f207c52.s2.eu.hivemq.cloud'})
client.connect()
print("Connected!")
rtc = machine.RTC()
# Synchroniser l'heure avec un serveur NTP
ntptime.settime()
# Imprimer la date et l'heure synchronisées
d_h = rtc.datetime()
# Afficher le message à envoyer
print("Date et heure synchronisées avec NTP : ", sending_message(main_message,local_hour(d_h), d_h))
# Initialiser le servomoteur en position porte ouverte, la led en vert et l'ecran
set_servo_angle(myServo,angle)
set_rgb_color(R,G,B)
myScreen.clear()
myScreen.putstr("OUVERT " + str(d_h[2]) + "/"+ str(d_h[1]) + "/"+ str(d_h[0]))
time.sleep(2)
# Fonction de rappel pour traiter les messages reçus
def callback(topic, receive_message):
try:
message_str = receive_message.decode('utf-8')
if message_str == "OPEN":
angle = 140
R, G, B = 0, 255, 0
# Imprimer la date et l'heure synchronisées
d_h = rtc.datetime()
# Afficher le message à envoyer
print("Date et heure synchronisées avec NTP : ", sending_message(main_message,local_hour(d_h), d_h))
myScreen.clear()
myScreen.putstr("OUVERT "
+ str(d_h[2]) + "/"+ str(d_h[1]) + "/"+ str(d_h[0]))
# Envoyer le message
#client.publish(MQTT_TOPIC, sending_message)
elif message_str == "CLOSE":
angle = 60
R, G, B = 255, 0, 0
# Imprimer la date et l'heure synchronisées
d_h = rtc.datetime()
myScreen.clear()
myScreen.putstr("FERME "
+ str(d_h[2]) + "/"+ str(d_h[1]) + "/"+ str(d_h[0]))
set_servo_angle(myServo, angle)
set_rgb_color(R, G, B)
except UnicodeDecodeError as e:
print(f"Error decoding message: {e}")
# Définir la fonction de rappel pour les messages
client.set_callback(callback)
# S'abonner au topic "esp32_topic"
client.subscribe("esp32_topic_bain")
# Attendre indéfiniment les messages
print("En attente de messages...")
try:
while True:
client.wait_msg()
except KeyboardInterrupt:
print("Arrêt du programme.")
finally:
myServo.deinit()
ledRed.deinit()
ledGreen.deinit()
ledBlue.deinit()
# Déconnexion propre
client.disconnect()
print("Déconnecté du serveur MQTT.")