81 lines
No EOL
2.1 KiB
Lua
81 lines
No EOL
2.1 KiB
Lua
-- Description: Client MQTT pour jouer une mélodie sur un ESP8266
|
|
client = mqtt.client("AlarmeStarWars","localhost",1883,false)
|
|
|
|
client:connect("student","ensibs")
|
|
|
|
-- Initialiser la broche GPIO2 pour la sortie
|
|
pio.pin.setdir(pio.OUTPUT, pio.GPIO2)
|
|
|
|
-- 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)
|
|
local notes = {
|
|
["A4"] = 440, ["F4"] = 349, ["C5"] = 523,
|
|
["E5"] = 659, ["F5"] = 698, ["G4"] = 392
|
|
}
|
|
|
|
-- Allumer la broche GPIO2
|
|
function ledon()
|
|
pio.pin.sethigh(pio.GPIO2)
|
|
end
|
|
|
|
-- Éteindre la broche GPIO2
|
|
function ledoff()
|
|
pio.pin.setlow(pio.GPIO2)
|
|
end
|
|
|
|
-- Jouer une note
|
|
function playTone(freq, duration)
|
|
local period = 1000000 / freq -- période en microsecondes
|
|
local cycles = (duration * 1000) / period
|
|
|
|
for i = 1, cycles do
|
|
ledon()
|
|
tmr.delay(period / 2) -- moitié HIGH
|
|
ledoff()
|
|
tmr.delay(period / 2) -- moitié LOW
|
|
end
|
|
end
|
|
|
|
-- Fonction pour jouer la mélodie
|
|
function playMelody()
|
|
for i, note in ipairs(melody) do
|
|
local n, d = note[1], note[2]
|
|
local freq = notes[n] or 0
|
|
if freq == 0 then
|
|
-- Pause : silence
|
|
ledoff()
|
|
tmr.delay(d * 1000)
|
|
else
|
|
playTone(freq, d)
|
|
end
|
|
-- Petite pause entre les notes
|
|
tmr.delay(50 * 1000)
|
|
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
|
|
playMelody() -- Jouer la mélodie à chaque message reçu
|
|
end
|
|
end
|
|
|
|
-- Connexion au broker MQTT et abonnement au canal
|
|
client:subscribe("NOM_CHANNEL", 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
|
|
end |