is-detection/client.lua
2025-04-26 18:00:38 +02:00

109 lines
No EOL
3.1 KiB
Lua

-- 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