client: finish
This commit is contained in:
parent
769d801687
commit
322d64735b
2 changed files with 65 additions and 36 deletions
|
@ -1 +1,2 @@
|
|||
dofile('client.lua')
|
||||
|
||||
|
|
96
client.lua
96
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
|
||||
tmr.delay(1000) -- Attendre 1 seconde avant de vérifier à nouveau
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue