-- Description: Client MQTT pour jouer une mélodie sur un ESP32 lors d'une alerte -- 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