From 322d64735b8bd27527c025d22001ca0afe98d20d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my?= Date: Sat, 26 Apr 2025 18:00:38 +0200 Subject: [PATCH] client: finish --- autorun.lua | 3 +- client.lua | 98 ++++++++++++++++++++++++++++++++++------------------- 2 files changed, 65 insertions(+), 36 deletions(-) diff --git a/autorun.lua b/autorun.lua index 99c4494..87b62a7 100644 --- a/autorun.lua +++ b/autorun.lua @@ -1 +1,2 @@ -dofile('client.lua') \ No newline at end of file +dofile('client.lua') + diff --git a/client.lua b/client.lua index 7b078e7..f6ef118 100644 --- a/client.lua +++ b/client.lua @@ -1,40 +1,58 @@ --- Description: Client MQTT pour jouer une mélodie sur un ESP8266 -client = mqtt.client("AlarmeStarWars","localhost",1883,false) +-- 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 GPIO2 pour la sortie -pio.pin.setdir(pio.OUTPUT, pio.GPIO2) +-- Initialiser la broche pio.GPIO4 pour la sortie +pio.pin.setdir(pio.OUTPUT, pio.GPIO4) --- Définir la mélodie simplifiée Star Wars -local melody = { - {"A4", 500}, {"A4", 500}, {"F4", 350}, {"C5", 150}, - {"A4", 500}, {"F4", 350}, {"C5", 150}, {"A4", 1000}, - {"E5", 500}, {"E5", 500}, {"E5", 500}, - {"F5", 350}, {"C5", 150}, {"G4", 500}, - {"F4", 350}, {"C5", 150}, {"A4", 1000} -} --- Fréquences associées aux notes (en Hz) +-- Dictionnaire de fréquences pour les notes local notes = { - ["A4"] = 440, ["F4"] = 349, ["C5"] = 523, - ["E5"] = 659, ["F5"] = 698, ["G4"] = 392 + ["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 } --- Allumer la broche GPIO2 +-- 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.GPIO2) + pio.pin.sethigh(pio.GPIO4) end --- Éteindre la broche GPIO2 +-- Éteindre la broche (buzzer OFF) function ledoff() - pio.pin.setlow(pio.GPIO2) + pio.pin.setlow(pio.GPIO4) end --- Jouer une note +-- Jouer une note : faire vibrer le buzzer à la bonne "fréquence" function playTone(freq, duration) - local period = 1000000 / freq -- période en microsecondes - local cycles = (duration * 1000) / period + 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() @@ -44,20 +62,28 @@ function playTone(freq, duration) end end --- Fonction pour jouer la mélodie +-- 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] - local freq = notes[n] or 0 + 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 - -- Pause : silence + -- Silence ledoff() - tmr.delay(d * 1000) + tmr.delay(adjusted_duration * 1000) else - playTone(freq, d) + -- Jouer la note + playTone(freq, adjusted_duration) end - -- Petite pause entre les notes - tmr.delay(50 * 1000) + + -- Petite pause entre les notes, aussi plus courte + ledoff() + tmr.delay(50 * 1000 * speed_factor) end end @@ -67,15 +93,17 @@ end -- Cette fonction sera appelée chaque fois qu'un message est reçu sur le canal souscrit function recp(mess) if mess then - playMelody() -- Jouer la mélodie à chaque message reçu + 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("NOM_CHANNEL", mqtt.QOS0, recp) +client:subscribe("alert", mqtt.QOS0, recp) -- Boucle principale pour maintenir le script actif -while true do - client:loop() -- Boucle pour traiter les messages MQTT - tmr.delay(1000) -- Attendre 1 seconde entre les itérations +while true do + tmr.delay(1000) -- Attendre 1 seconde avant de vérifier à nouveau end \ No newline at end of file