client: finish

This commit is contained in:
Jérémy 2025-04-26 18:00:38 +02:00
parent 769d801687
commit 322d64735b
2 changed files with 65 additions and 36 deletions

View file

@ -1 +1,2 @@
dofile('client.lua')

View file

@ -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
tmr.delay(1000) -- Attendre 1 seconde avant de vérifier à nouveau
end