Sirène de pompier avec led

Bonsoir tout le monde,

je débute avec arduino, mon 1er projet est d'équiper un camion de pompier (miniature) avec une sirène type de ton et ses gyrophares.

Après avoir visionné plusieurs tuto, je bute sur le programme.

Je me suis arrêté sur le programme Fading en y agrémentant les valeur de Si= 7902 et la= 7040. Le résultat n'est pas réel.

Est il possible d'avoir vos retours! Merci pour votre aide

Guillaume

bonjour,
J'ai comme une idée qu'on va te dire qu'on ne trouve pas ton code et que sans code cela va être dur de répondre.
Nb : le code entre balises code --> cf messages épinglés en tête de forum

Effectivement sans code difficile de vous aider

Regardez la fonction tone() et un des exemples associés

NB: le fichier de notes utilise la notation anglo-saxonne :
C = Do
D = Ré
E = Mi
F = Fa
G = Sol
A = La
B = Si

Bonjour,

il est vrai qu'avec le programme l'aide sera meilleure.

Le voici:

int ledPin = 9;
int hp = 5;

void setup() {

}

void loop() {

for (int fadeValue = 0 ; fadeValue <= 250; fadeValue += 5) {
analogWrite(ledPin, 3520);
delay(10);
}
analogWrite (ledPin, 0);
for (int fadeValue = 250 ; fadeValue >= 0; fadeValue -= 5) {
analogWrite(hp, 3951);
delay(10);
}
analogWrite(hp,0);
}

Merci

Quel est le but du fading ? Modifier la luminosité de la led ?

Ton code ne peut pas fonctionner comme il est. Un analogWrite n'accepte que des valeurs de 0 à 1023. Donc 3520 et 3951 ça ne marche pas.

Ensuite, tu fais des boucles en faisant changer la valeur de ta variable fadeValue mais tu n'utilises pas cette valeur, donc rien ne va changer au niveau de la led.

Enfin, si tu veux faire changer la luminosité de la led, tu vas utiliser ce qu'on appelle le PWM. Cherche le tuto sur ce sujet du site openclassrooms. Il est bien fait, tu comprendras vite comment le mettre en oeuvre. Ta led doit être connectée à une pin qui supporte le PWM. Ça, ça dépend de ton Arduino. Vérifie selon ton modèle si la pin 9 est une pin PWM

vous voulez faire du son ou de la lumière ?

  • pour faire varier la luminosité d'une LED, effectivement faire varier la valeur du duty cycle du PWM (donc sur une pin adéquate) avec une LED et résistance adaptée en série va faire briller plus ou moins la LED.

  • pour faire votre sirène 2 tons "SI" et "LA"', utilisez comme mentionné plus haut la fonction tone

Bonjour,

merci pour vos retours!
Je veux faire fonctionner les LEDs en même temps que la sirène.

Je n'ai pas l'habitude du tone, donc je ne sais pas si ceci va marcher, mais c'est un début :

int ledPin = 9;
int hp = 5;
#define LA 440
#define SI 494

void setup() {
  pinMode (ledPin, OUTPUT);
  pinMode (hp, OUTPUT);
}

void loop() {

  tone (hp, LA, 250); // valeur 250 mise un peu au hasard...
  for (int fadeValue = 0 ; fadeValue <= 250; fadeValue += 5) {
    analogWrite(ledPin, fadeValue);
    delay(10);
  }
  noTone(hp);

  delay(200);

  tone (hp, SI, 250);
  analogWrite (ledPin, 0);
  for (int fadeValue = 250 ; fadeValue >= 0; fadeValue -= 5) {
    analogWrite(ledPin, fadeValue);
    delay(10);
  }
  noTone(hp);

  delay(200);
}

Il faut vérifier que la pin 9 est compatible du PWM. ça dépend du modèle de carte utilisée.

On most Arduino boards (those with the ATmega168 or ATmega328P), this function works on pins 3, 5, 6, 9, 10, and 11. On the Arduino Mega, it works on pins 2 - 13 and 44 - 46. Older Arduino boards with an ATmega8 only support analogWrite() on pins 9, 10, and 11.

(ça a l'air bon :slight_smile: )

ou si vous voulez le faire en "non bloquant" on peut utiliser la technique "millis()'

// LA LED: pin 3 <--> Resistance de limitation de courant 220Ω <--> Anode LED <--> Cathode <--> GND
const byte ledPin = 3;

unsigned long chronoLed;
const unsigned long dureeLed = 10;

int luminosite;
int variateur = 5;
const int minLuminosite = 20;
const int maxLuminosite = 255;

// LE PIEZZO: pin 5 <--> résistance de limitation de courant 220Ω <--> Piezzo <--> GND
const byte hpPin = 5;
#define LA 440
#define SI 494
boolean jouerSI = true;

unsigned long chronoNote;
const unsigned long dureeNote = 1000;


void setup() {
  Serial.begin(115200);
  pinMode (ledPin, OUTPUT);
  pinMode (hpPin, OUTPUT);
  luminosite = minLuminosite;
  analogWrite(ledPin, luminosite); // éteinte
  noTone(hpPin); // silence
  chronoLed = chronoNote = 0;
}

void loop() {
  
  // est-ce le moment de faire varier la LED
  if (millis() - chronoLed >= dureeLed) {
    luminosite += variateur;
    if (luminosite <= minLuminosite) {
      luminosite = minLuminosite;
      variateur = -variateur;
    } else if (luminosite >= maxLuminosite) {
      luminosite = maxLuminosite;
      variateur = -variateur;
    }
    analogWrite(ledPin, luminosite);
    chronoLed += dureeLed;
  }

  // est-ce le moment de faire changer de ton
  if (millis() - chronoNote >= dureeNote) {
    tone(hpPin, jouerSI ? SI : LA);
    jouerSI = !jouerSI;
    chronoNote += dureeNote;
  }
}

ça vous permettra de gérer autre chose pendant que la LED scintille et la sirène fait "pin pon"

Merci pour vos retours qui vont m'être très utiles.

Bonjour tout le monde,

pour évoluer, je bosse sur ce programme ou malheureusement je sèche.
Les LEDs clignotent bien mais aucun son ne sort du HP.

const int ledpin = 13; //résistance 220
const int ledpin1 = 12; // résistance 220
int hp = 5;
int noteDuration = 1000;
#define LA 440
#define SI 494

void setup() {

pinMode(ledpin, OUTPUT); // la broche "13" est la sortie
pinMode(ledpin1, OUTPUT); // la broche "12" est la sortie
pinMode(hp, OUTPUT); // la broche "5" PWM est la sortie

tone(LA, noteDuration);
tone(SI, noteDuration);
noTone (hp);

}

void loop() {

// ne bloque pas le programme
digitalWrite( ledpin , millis() / 500 % 2 );
digitalWrite( ledpin1 , millis() / 500 % 2 );

}

Avez vous une idée?
Merci pour vos réponses

qu'est-ce qui ne vous plait pas dans le code posté en #8 ? avez vous un peu étudié ce code ?

Pour votre question - si si... il y'a bien du son qui sort pendant quelques dizaines de nano-secondes, c'est pour cela que vous ne l'entendez pas :slight_smile:

(indice - la fonction tone() est non bloquante)

J-M-L:
qu'est-ce qui ne vous plait pas dans le code posté en #8 ? avez vous un peu étudié ce code ?

Rien, "simplement" que je voulais également "créer" le programme pour évoluer que de faire un simple copié/collé du votre. :wink:

Pour votre question - si si... il y'a bien du son qui sort pendant quelques dizaines de nano-secondes, c'est pour cela que vous ne l'entendez pas :slight_smile:

(indice - la fonction tone() est non bloquante)

Merci pour votre retour et lien.

C’est bien de vouloir faire par soi même !

PS: pour poster du code on utilise les balises de programme

  [code]...[/code] 
et  pas celles de citation [quote]...[/quote]

qui sont utilisées pour référer aux propos de quelqu’un d’autre

Guillaume017

Guillaume017:
Avez vous une idée?

Oui :slight_smile:

Tu mets ça

tone(LA, noteDuration);
tone(SI, noteDuration);
noTone (hp);

C'est mieux ça

tone(hp, LA, noteDuration);
tone(hp, SI, noteDuration);
//noTone (hp);

Tu as omis le numéro de port du HP comme premier paramètre de la commande tone()
et, surtout, tu lui coupes le sifflet (noTone (hp):wink: avant qu'il aie terminé!

Bonne musique et bonne journée
Cordialement
jpbbricole

jpbbricole:
C'est mieux ça

tone(hp, LA, noteDuration);
tone(hp, SI, noteDuration);
//noTone (hp);
et, surtout, tu lui coupes le sifflet (noTone (hp):wink: avant qu'il aie terminé!

en fait même avec noteDuration, le fait de rappeler une seconde fois tone() sur la même pin va aussi couper la note LA, donc on n'entendra que le SI (en enlevant le noTone() sinon chaque note durera que quelques dixièmes de micro-secondes)

On peut faire soit

tone(hp, LA, noteDuration);
delay(noteDuration);
tone(hp, SI, noteDuration);
delay(noteDuration);

ou alors

tone(hp, LA);
delay(noteDuration);
tone(hp, SI);
delay(noteDuration);
noTone (hp);

Bonjour,

merci pour vos conseils et retours!