is-detection/client.lua
2025-04-27 14:28:55 +02:00

118 lines
No EOL
3.6 KiB
Lua

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