J'ai fait un programme avec une alarme : C'est a dire que lorsque que l'on appuie sur le bouton, L'écran LCD affiche que l'alarme se met en route puis elle sonne automatiquement après 5 secondes (car je n'ai pas de capteur de mouvement ^^) sauf que lorsque qu'elle sonne, l'écran affiche des caractères extrêmement étrange et le bip est infini alors qu'il devrait être seulement répéter 5 fois...
Une idée ?
Le code :
//------------------------ ALARME --------------------------------------
#define LEDFLASHER 11
#define ALARMSOUNDER 10
#define ALARMSWITCH 12
int i = 0;
int val = LOW;
int pre_val = LOW;
int state = 0;
byte Etat = 0;
//------------------------ ALARME --------------------------------------
//------------------------ LCD --------------------------------------
#include "LiquidCrystal.h"
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
//------------------------ LCD --------------------------------------
void setup() {
lcd.begin(16, 2);
lcd.write("ALARDUINO V.1.3");
lcd.setCursor(0, 1);
lcd.write(" Waiting...");
//----------------------------------------------
pinMode(LEDFLASHER, OUTPUT);
pinMode(ALARMSOUNDER, OUTPUT);
pinMode(ALARMSWITCH, INPUT);
}
void loop() {
delay(3000);
Etat = digitalRead(ALARMSWITCH);
if(Etat == 1){
declenchement();
}
}
void declenchement() {
lcd.setCursor(0, 1);
lcd.write("Mise en route...");
delay(2000);
/* for(i = 0; i = 255; i + 2)
{
analogWrite(LEDFLASHER, 255);
analogWrite(ALARMSOUNDER, 200);
delay(100);
analogWrite(LEDFLASHER, 0);
analogWrite(ALARMSOUNDER, 25);
delay(100);
} */
lcd.clear();
lcd.setCursor(0, 0);
lcd.write("ALARDUINO V.1.3");
lcd.setCursor(0, 1);
lcd.write(" Alarme !!!");
delay(2000);
//----------------------------------------------------------
for(i = 0; i < 255; i = i + 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(10);
}
for(i = 255; i > 1; i = i - 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(5);
}
for(i = 1; i <= 5; i + 1)
{
analogWrite(LEDFLASHER, 255);
analogWrite(ALARMSOUNDER, 200);
delay(100);
analogWrite(LEDFLASHER, 0);
analogWrite(ALARMSOUNDER, 25);
delay(100);
}
for(i = 0; i < 255; i = i + 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(10);
}
for(i = 255; i > 1; i = i - 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(5);
}
pre_val = val;
}
Salut, j'ai eu exactement le même soucis lors de mon dernier montage et je n'ai tj pas trouvé l'origine du problème . J'ai juste remarqué que quand mon arduino est alimentée en usb , c'est moi fréquent . Je vais suivre ton post pour essayer de voir un peu avec les différents com
pour le buzzer, regardes ce lien http://shallowsky.com/arduino/class/buzzer.html
pour la répétition faire:
void loop()
{
delay(3000);
Etat = 0; // ici il faut remettre "etat" à 0 sinon appel indefini
Etat = digitalRead(ALARMSWITCH);
if (Etat == 1) {
declenchement();
}
}
Ok merci ! Je ne pourrai pas tester le programme avant un petit bout de temps car je ne suis pas chez moi ! Mais je regarde tout ça dès que possible !! Merci pour cette proposition !!
en fait, il aurait mieux valu mettre ta résistance en pull up sur le 5 V plutôt qu'en push down à la masse
et bien sur inverser le test de état. "si etat ==1" deviendrait "si etat ==0"
nota : au lieu de la résistance extérieure, tu pouvais déclarer l'entrée en pull up.
pull up = tirer vers le haut.
push down = pousser vers le bas
sur une entrée, mettre une pull up maintiendra l'entrée à 5 V (état haut).
si tu mets un BP raccordé à la masse, lorsque tu appui dessus, tu force l'entrée à 0V (état bas)
lorsque tu relâches le BP, l'entrée repasse à 5V "état haut"
Apres quelques petits test une fois rentré chez moi en branchant la LED et le piezzo sans résistances, l'écran fait toujours ces caractères spéciaux... Pour savoir si c'était bien le piezzo, le l'ai débranché et j'ai laisser la LED, il n'y a pas de probleme !
Ce que j'ai pu remarquer, c'est que les caractères spéciaux n'apparaissent pas lorsque cette partie de code est exécutée :
for(i = 0; i < 255; i = i + 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(10);
}
for(i = 255; i > 1; i = i - 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(5);
}
Cette partie correspond a la croissance de la luminosité de LED et du son du piezzo et inversement.
Mais le bug avec l'écran se déclenche lorsque les bips sont effectué :
Après avoir fait plusieurs tests, c'est bien la partie de code qui émet les bips qui fait bug l'écran et qui fait que des caractères spéciaux s'affichent...
D'ailleurs j'ai modifié un peu le code :
//------------------------ ALARME --------------------------------------
#define LEDFLASHER 11
#define ALARMSOUNDER 10
#define ALARMSWITCH 12
int i = 0;
int val = LOW;
byte Etat = 0;
//------------------------ ALARME --------------------------------------
//------------------------ LCD --------------------------------------
#include "LiquidCrystal.h"
LiquidCrystal lcd(7, 6, 5, 4, 3, 2);
//------------------------ LCD --------------------------------------
void setup() {
lcd.begin(16, 2);
lcd.write("ALARDUINO V.1.3");
lcd.setCursor(0, 1);
lcd.write(" Waiting...");
//----------------------------------------------
pinMode(LEDFLASHER, OUTPUT);
pinMode(ALARMSOUNDER, OUTPUT);
pinMode(ALARMSWITCH, INPUT);
}
void loop() {
delay(3000);
Etat = 0;
Etat = digitalRead(ALARMSWITCH);
if(Etat == 1){
declenchement();
remiseazero();
}
}
void declenchement() {
lcd.setCursor(0, 1);
lcd.write("Mise en route...");
delay(2000);
lcd.clear();
lcd.setCursor(0, 0);
lcd.write("ALARDUINO V.1.3");
lcd.setCursor(0, 1);
lcd.write(" Alarme !!!");
delay(10);
//----------------------------------------------------------
for(i = 0; i < 255; i = i + 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(10);
}
for(i = 255; i > 1; i = i - 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(5);
}
/*--------------- PARTIE QUI BUG -------------------------
for(i = 1; i = 25; i + 1)
{
if(digitalRead(ALARMSWITCH) != 1)
{
analogWrite(LEDFLASHER, 255);
analogWrite(ALARMSOUNDER, 200);
delay(100);
analogWrite(LEDFLASHER, 0);
analogWrite(ALARMSOUNDER, 25);
delay(100);
}
}
*///------------- PARTIE QUI BUG ---------------------------
}
void remiseazero() {
lcd.clear();
lcd.write("ALARDUINO V.1.3");
lcd.setCursor(0, 1);
lcd.write(" Waiting...");
for(i = 0; i < 255; i = i + 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(10);
}
for(i = 255; i > 1; i = i - 2)
{
analogWrite(LEDFLASHER, i);
analogWrite(ALARMSOUNDER, i);
delay(5);
}
analogWrite(LEDFLASHER, 0);
analogWrite(ALARMSOUNDER, 0);
}
Ce que j'aimerais faire c'est que lorsque l'alrme se déclenche il faut rappuyer sur le bouton pour l'éteindre. Lorsque j'appuie sur le bouton j'aimerais que ça déclenche le void remiseazero, et que ça arrête une boucle infinie qui ferai les bips. Une idée ?
Tu mets ta fonction declenchement() dans un WHILE conditionné par un bit que ton interruption mettra à 1.
ex: while(Etat == 1 && !acquitDefaut)
Comme cela à l'appui de ce bouton, tu excécute ta fonction remiseazero() à lequelle tu intègres le bit acquitDefaut conditionnant le WHILE.
-Je déclare acquitDefaut comme un byte initialisé à 0.
-Dans la fonction déclenchement tu remplaces le !acquitDefaut par acquitDefaut == 0.
-A la fin de ta fonction remise à zéro tu mets acquitDefaut à 1 (pour sortir de la boucle déclenchement).
-A la fin de la boucle LOOP tu remets acquitDefaut = 0 pour te permettre de rééxécuter plus tard la fonction déclenchement.
Je n'ai pas testé le programme mais on ne doit pas être trop loin de la vérité. J'espère que cette solution te convient (et quelle fonctionne)!
Merci d'avoir répondu à ma question et d'avoir prit le temps de m'expliquer !!!!! Je te dit si ça fonctionne ce soir car je ne peux pas le tester ce matin !