-- Description: Client MQTT pour jouer une mélodie sur un ESP32 lors d'une alerte /*TO CHANGE : 1. Le nom du wifi et le mot de passe (ligne 13) sachant que l'instruction est net.wf.setup(net.wf.mode.STA,"SSID","PASSWORD") 2. Le nom du broker MQTT et le port (ligne 18) sachant que l'instruction est client = mqtt.client("ID","NOM_BROKER","PORT",true), le true etant pour activé le SSL, il ne faut pas le changer. De plus l'ID et le mot de passe (ligne 21) ne doivent pas être changés. Le nom lors de la connexion peut être changé mais ce cn'est pas obligatoire. */ -- Conexion au wifi net.wf.setup(net.wf.mode.STA,"Jeremyatine","chocolatine") net.wf.start() print("Connexion au wifi...") -- MQTT client client = mqtt.client("student","mqtt.leizour.fr",8883,true) print("Connexion au broker MQTT...") client:connect("student","ensibs") print("Connecté au broker MQTT !") -- Initialiser la broche pio.GPIO4 pour la sortie pio.pin.setdir(pio.OUTPUT, pio.GPIO4) -- Dictionnaire de fréquences pour les notes local notes = { ["A4"] = 440, ["A4S"] = 466, ["B4"] = 494, ["C5"] = 523, ["C5S"] = 554, ["D5"] = 587, ["D5S"] = 622, ["E5"] = 659, ["F5"] = 698, ["F5S"] = 740, ["G5"] = 784, ["G5S"] = 831, ["A5"] = 880 } -- Mélodie simplifiée du thème Star Wars local melody = { {"A4", 500}, {"A4", 500}, {"F5", 350}, {"C5", 150}, {"A4", 500}, {"F5", 350}, {"C5", 150}, {"A4", 1000}, {"E5", 500}, {"E5", 500}, {"E5", 500}, {"F5", 350}, {"C5", 150}, {"G5", 500}, {"F5", 350}, {"C5", 150}, {"A4", 1000}, {"A5", 500}, {"A4", 350}, {"A4", 150}, {"A5", 500}, {"G5", 250}, {"F5", 250}, {"E5", 500}, {"D5", 250}, {"C5", 250}, {"B4", 500}, {"C5", 250}, {"A4", 250} } -- Allumer la broche (buzzer ON) function ledon() pio.pin.sethigh(pio.GPIO4) end -- Éteindre la broche (buzzer OFF) function ledoff() pio.pin.setlow(pio.GPIO4) end -- Jouer une note : faire vibrer le buzzer à la bonne "fréquence" function playTone(freq, duration) local period = 1000000 / freq -- Période d'oscillation en µs local cycles = (duration * 1000) / period -- Nombre de cycles nécessaires for i = 1, cycles do ledon() tmr.delay(period / 2) -- moitié HIGH ledoff() tmr.delay(period / 2) -- moitié LOW end end -- Fonction pour jouer toute la mélodie function playMelody() local speed_factor = 0.5 -- 50% de la durée originale => musique plus rapide for i, note in ipairs(melody) do local n, d = note[1], note[2] -- n = nom de la note, d = durée local freq = notes[n] or 0 -- chercher fréquence, ou 0 si silence local adjusted_duration = d * speed_factor -- durée plus courte if freq == 0 then -- Silence ledoff() tmr.delay(adjusted_duration * 1000) else -- Jouer la note playTone(freq, adjusted_duration) end -- Petite pause entre les notes, aussi plus courte ledoff() tmr.delay(50 * 1000 * speed_factor) end end -- Lancer la musique -- playMelody() -- Cette fonction sera appelée chaque fois qu'un message est reçu sur le canal souscrit function recp(mess) if mess then print("Message reçu : " .. mess) -- Afficher le message reçu playMelody() else print("Message vide reçu.") end end -- Connexion au broker MQTT et abonnement au canal client:subscribe("alert", mqtt.QOS0, recp) -- Boucle principale pour maintenir le script actif while true do tmr.delay(1000) -- Attendre 1 seconde avant de vérifier à nouveau end