Pages: [1]   Go Down
Author Topic: Probleme avec remise à zéro  (Read 1462 times)
0 Members and 1 Guest are viewing this topic.
Finland
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bonjour,

Je débute avec Arduino et j'essaye petit à petit différents montages. Je ne veux pas faire de copier-coller de codes existants comme ca tout bêtement, je veux comprendre ce que je fais.

J'essaye de faire une alarme avec 3 zones.
Chaque zone est activée par un interrupteur et visualisée par une led qui clignote ainsi qu'un buzzer. Le buzzer est commun aux 3 zones. Lorsqu'une zone est activée je veux pourvoir remettre à zéro le buzzer à l'aide d'un bouton poussoir, et c'est là que ca se complique pour moi.

Pour le moment le buzzer est représenté par une led (ledReset). Quand une zone est activée, sa led clignote bien et la led de reset cligonte aussi avec une frequence differente. Mais comment arreter cette led de reset? Si une autre zone s'active, sa led va aussi clignoter et la led de reset va reprendre jusqu'a etre arretée par le bouton poussoir. Comment faire?

Voici mon code:
Code:
/*
Alarm 3 zones
 
 */

const int zone1pin = 1;
const int zone2pin = 2;
const int zone3pin = 3;
const int resetpin = 4;

const int led1pin =  5;    
const int led2pin =  6;
const int led3pin =  7;
const int ledResetpin =  8;

int zone1State = 0;  
int zone2State = 0;
int zone3State = 0;
int resetState = 0;


int led1State = LOW;
int led2State = LOW;
int led3State = LOW;
int ledResetState = LOW;

long previousMillis = 0;

long interval1 = 300;  
long interval2 = 800;

void setup() {
 
pinMode(led1pin, OUTPUT);    
pinMode(led2pin, OUTPUT);  
pinMode(led3pin, OUTPUT);
pinMode(ledResetpin, OUTPUT);  

pinMode(zone1pin, INPUT);
pinMode(zone2pin, INPUT);
pinMode(zone3pin, INPUT);  
pinMode(resetpin, INPUT);
 
digitalWrite(resetpin, LOW);
}

void loop(){
checkZone1();
checkZone2();
checkZone3();
Reset();
}
  
void checkZone1(){

zone1State = digitalRead(zone1pin);
resetState=digitalRead(resetpin);

if (zone1State == HIGH) {        
  
unsigned long currentMillis = millis();
 
if(currentMillis - previousMillis > interval1) {

previousMillis = currentMillis;  
    
led1State = !led1State;

digitalWrite(led1pin, led1State);
}
}
else {

digitalWrite(led1pin, LOW);
}
}

void checkZone2(){

zone2State = digitalRead(zone2pin);

if (zone2State == HIGH) {    
  
unsigned long currentMillis = millis();
 
if(currentMillis - previousMillis > interval1) {

previousMillis = currentMillis;  

led2State = !led2State;

digitalWrite(led2pin, led2State);
}
}
else {

digitalWrite(led2pin, LOW);
}
}

void checkZone3(){

zone3State = digitalRead(zone3pin);

if (zone3State == HIGH) {    
  
unsigned long currentMillis = millis();
 
if(currentMillis - previousMillis > interval1) {
  
previousMillis = currentMillis;  

led3State = !led3State;

digitalWrite(led3pin, led3State);
}
}
else {

digitalWrite(led3pin, LOW);
}
}

void Reset(){

zone1State = digitalRead(zone1pin);
zone2State = digitalRead(zone2pin);
zone3State = digitalRead(zone3pin);  
resetState = digitalRead(resetpin);

if (digitalRead(resetpin) == HIGH){

digitalWrite(ledResetpin, LOW);

}

if(zone1State == HIGH || zone2State == HIGH  || zone3State == HIGH)  {    
  
 unsigned long currentMillis = millis();
 
if(currentMillis - previousMillis > interval2) {

previousMillis = currentMillis;  

ledResetState = !ledResetState;

digitalWrite(ledResetpin, ledResetState);
}
}
else {

digitalWrite(ledResetpin, LOW);
  
}
}
 

Toutes vos remarques et conseils sont les bienvenus.
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hello

Je ne comprends pas bien ton probleme. Tu n'arrives pas a arreter la led/buzzer reset quand tu appuies sur le bouton reset ?

sinon, essaye ce code :

Code:
/*
Alarm 3 zones
 */

const int zonepin[3] = { 1, 2, 3};
const int ledpin[3] =  { 5, 6, 7};
int zoneState[3] = { 0, 0, 0};
int ledState[3] = { LOW, LOW, LOW};
unsigned long  previousMillis[3] = {0, 0, 0};


const int resetpin = 4;
const int ledResetpin =  8;
int resetState = 0;
int ledResetState = LOW;
unsigned long  previousResetMillis = 0;

long interval1 = 300;  
long interval2 = 800;

void setup() {
  while(*zonepin)
    pinMode(*zonepin, INPUT);

  pinMode(resetpin, INPUT);


  while(*ledpin)
    pinMode(*ledpin, OUTPUT);

  pinMode(ledResetpin, OUTPUT);
  digitalWrite(ledResetpin, LOW);
}

void loop(){
  for(int i=1; i <=3; i++)
    checkZone( i );

  Reset();
}

void checkZone(int zoneTested){

  zoneState[zoneTested] = digitalRead(zonepin[zoneTested]);

  if (zoneState[zoneTested] == HIGH) {        
    unsigned long currentMillis = millis();
    if(currentMillis - previousMillis[zoneTested] > interval1) {
      previousMillis[zoneTested] = currentMillis;  
      ledState[zoneTested] = !ledState[zoneTested];
      digitalWrite(ledpin[zoneTested], ledState[zoneTested]);
    }
  }
  else {
    digitalWrite(ledpin[zoneTested], LOW);
  }
}


void Reset(){

  if (digitalRead(resetpin) == HIGH){
    digitalWrite(ledResetpin, LOW);
  }
  else{
    int generalState = LOW;
    while(*zoneState){
      if (*zoneState == HIGH)
        generalState = HIGH;
    }

    if(generalState == HIGH )  {    
      unsigned long currentMillis = millis();
      if(currentMillis - previousResetMillis > interval2) {
        previousResetMillis = currentMillis;  
        ledResetState = !ledResetState;
        digitalWrite(ledResetpin, ledResetState);
      }
    }

  }
}
Logged

Finland
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Je ne comprends pas bien ton probleme. Tu n'arrives pas a arreter la led/buzzer reset quand tu appuies sur le bouton reset ?

C'est bien ca. Lorsque j'appuie sur le bouton reset la led s'éteint bien mais lorsque je relache le bouton, elle se remet à clignoter (donc le buzzer reprend). J'aimerai que lorsque je relache le bouton, la led reste eteinte.

Quote
sinon, essaye ce code :

Je viens de l'uploader mais rien ne fonctionne. Aucune led ne s'allume si j'actionne n'importe quel interrupteur  :-/
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ton alarme se redéclenche parce que tu testes l'état du capteur. Donc tant qu'il est à l'état haut du détectes une alarme. Si tu veux que l'alarme ne se redéclenche pas, il faudrait que tu détectes une transition montante sur les capteurs. Pour faire cette détection il faut mémoriser l'état précédent et regarder, pour un front montant, si l'état précédent était LOW et l'état courant HIGH.
Logged

Finland
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Pour faire cette détection il faut mémoriser l'état précédent et regarder, pour un front montant, si l'état précédent était LOW et l'état courant HIGH.

Un front montant? Quel difference au niveau du code entre un état haut et un front montant?
Logged

0
Offline Offline
Jr. Member
**
Karma: 0
Posts: 90
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Le front montant correspond au passage de l'état bas a l'état haut. Le but est donc d'enregistrer l'état du capteur, et a la boucle suivante de comparer cet ancien état à celui en cours.
Un exemple simple
Code:
int pinTest = 5;
int lastStat = LOW
////////////

//Détection de l'état
int currentStat = digitalRead(pinTest);
if ( lastStat == LOW && currentStat == HIGH){
    /* code à activé au front montant */
}

//mise a jour du lastStat avec le dernier état lu
lastStat = currentStat;

Pour ton cas, cela implique que le buzzer ne s'active qu'au moment où le détecteur est activé ( passage du 0 au 1) , au lieu de rester allumé si le détecteur est actif
« Last Edit: November 29, 2010, 07:53:58 am by erlik » Logged

Finland
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Je dois être nul car je n'arrive pas à intégrer ton code  :-/

Mes capteurs restent bien à l'état haut lorsqu'ils sont activés et pour remttre à zéro le buzzer j'utilise un bouton poussoir.
Logged

Finland
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Bon rien à faire, je n'arrive toujours pas à faire ma remise à zéro  smiley-sad
Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Pour que l'on puisse t'aider, je pense qu'il faudrait que tu sois plus clair sur ce que tu veux faire.

Décris de manière simple l'enchainement des actions sous la forme
   Si il se passe ça alors il doit y avoir telle action.

En principe si tu fais une bonne description, elle devrait représenter à peu de chose prêt la boucle principale de ton programme.
Logged

Finland
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai 3 zones de surveillance (3 capteurs) représentées pas 3 Leds et un buzzer commun aux 3 zones.

Si une zone est activée (capteur au niveau haut), la Led correspondante va clignoter et un buzzer va se mettre à sonner.
Tant que le capteur est au niveau haut, sa Led clignote et le buzzer sonne.
Si le niveau du capteur repasse au niveau bas, la led et le buzzer s'arrete.

J'ai un bouton-poussoir de reset pour le buzzer.
Lorsque le buzzer est actif, le fait d'appuyer sur le BP arrete le buzzer.
Si un autre capteur passe au niveau haut, le buzzer se remet à buzzer et ainsi de suite.

Mon programme fonctionne à part la remise à zéro du buzzer. Lorsque j'appuie sur le BP, le buzzer s'arrete mais dès que je le relache le buz reprend.



Logged

France
Offline Offline
Faraday Member
**
Karma: 39
Posts: 3627
There is an Arduino for that
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

J'ai numéroté les conditions pour plus de clarté.
Quote
1) Si une zone est activée (capteur au niveau haut), la Led correspondante va clignoter et un buzzer va se mettre à sonner.
2) Tant que le capteur est au niveau haut, sa Led clignote et le buzzer sonne.
3) Si le niveau du capteur repasse au niveau bas, la led et le buzzer s'arrete.

J'ai un bouton-poussoir de reset pour le buzzer.
4) Lorsque le buzzer est actif, le fait d'appuyer sur le BP arrete le buzzer.
5) Si un autre capteur passe au niveau haut, le buzzer se remet à buzzer et ainsi de suite.

Mon programme fonctionne à part la remise à zéro du buzzer. Lorsque j'appuie sur le BP, le buzzer s'arrete mais dès que je le relache le buz reprend.

En fait ton programme fonctionne très bien, il fait ce que tu as décrit mais pas ce que tu voudrais.
En fait, la condition 2 est contradictoire avec la 4.
C'est là qu'intervient ce que j'ai proposé dans un post précédent.
Si on reprend tes conditions:
1) Si une zone est activée (capteur au niveau haut), la Led correspondante va clignoter .
2) Si un capteur passe au niveau haut (transition de inactif à actif), on active le buzzer.
3) Si le niveau du capteur repasse au niveau bas, la led et le buzzer s'arrete.
4) Lorsque le buzzer est actif, le fait d'appuyer sur le BP arrete le buzzer.

Tu remarqueras que j'ai supprimé la condition 5 qui est redondante avec la 1 et la 2

Le fait d'utiliser la transition de l'état pour déclencher le buzzer fait que même si cet état reste actif une fois que l'on a fait un reset du buzzer celui-ci ne se redéclenchera pas tant que le capteur ne sera pas repassé à inactif.
Logged

Finland
Offline Offline
Newbie
*
Karma: 0
Posts: 23
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Petit à petit je commence à comprendre mes erreurs.

Je m'acharnais sur la boucle du reset mais en fait je dois revoir les 3 autres boucles de détection. C'est bien ca?




Logged

Pages: [1]   Go Up
Jump to: