anomalie sketch

sto realizzando un programma per accendere una centrale di allarme a cui non riesco più a trovare inseritori
dove 1 pulsante, 1 rele per resettare eventuali anomalie 1 rele per attiva, 1 segnale di avvenuta attivazione e un buzzer
se escludo la parte del buzzer tutto ok
se la includo quando segnale ATTIVATO passa da LOW a HIGH o viceversa si resatta il tutto e riparte il ciclo reset-onoff
riuscite a spiegarmi non riesco a capire

[code]
/****************** M024 V1.2 LETTORE RFID CARD RC-522, BUZZER, PULSANTE******************************


  scopo del progetto: realizzare un lettore rfid da installare in una centrale allarme senza inseritori
  è previsto anche un ingresso contatto ON-OFF stabile per comandarla varie centrali
  
  Occorre comandare 1 rele impulsivo per effettuare un reset impianto e uno stabile di on/off
  
  la centrale deve prevedere la programmazione di 1 ingresso come reset e 1 come onoff
  
  Se la TESSERA viene riconosciuta o viene premuto il PULSANTE si accende un releReset per un tempo, pausa e
  si accende un secondo rele attivo per tutto il tempo di ON 
  i comandi di reset e onoff non si devono sovrapporre 


  la centrale deve restituire un segnale di avvenuta ATTIVAZIONE e questo segnale deve accendere un led
  che rimane fisso per tutto il tempo di ATTIVATO e far suonare un buzzer per un tempo programmato sia in 
  on che in off a frequenze diverse
  
  Se la TESSERA è falsa si accende un ledFalsa con dei lampeggi e relativo buzzer per indicare l`inaccessibilità.

  ogni volta che TESSERA vera o PULSANTE premuto, si sentono 2 bip 
  
  ---------------------------QUESTA è LA PARTE RIFERITA AL PULSANTE--------------------------------
*/
 // COMANDI RESET

 #define PULSANTE                          7     // PULSANTE attivazione NO collegato a negativo
 #define ATTIVATO                          8     // contatto ATTIVATO NO collegato a negativo
 #define LEDATTIVATO                       3     // led per segnalare l'avvenuta attivazione della centrale
 #define RELERESET                         4     // relè reset eventuali anomalie
 #define RELEONOFF                         5     // relè attivato/spento
 #define BUZZER                            6     // buzzer
 
 #define PRESS_LEVELPULSANTE               LOW          // livello LOW se PULSANTE collegato a negativo 
 #define PRESS_LEVELATTIVATO               LOW          // livello LOW se ATTIVATO collegato a negativo  
 #define ON_LEVELRESET                     HIGH         // HIGH se PULSANTE a massa 
 #define OFF_LEVELRESET !ON_LEVELRESET                  // livello uscite da spente ad accese
 #define ON_LEVELONOFF                     HIGH         // HIGH se ATTIVATO a massa 
 #define OFF_LEVELONOFF !ON_LEVELONOFF                  // livello uscite da spente ad accese
 
 #define ON_LEVELLEDATTIVATO               HIGH         // HIGH se ATTIVATO a massa altrimenti LOW
 #define OFF_LEVELLEDATTIVATO !ON_LEVELLEDATTIVATO           // livello uscite da spente ad accese
 
 
 //Definizione variabili di lavoro globali

  byte A = 0;
  byte B = 0;
  byte C = 0;
  byte D = 0;
  byte R = 0;
  byte R1 = 0;
  byte X = 0;
  byte T1 = 0; 
  byte T2 = 0;
  uint32_t t1 = 0;
  uint32_t t2 = 0;
   
 //------------------------------------------------------------------

 void setup()
 {
 //DICHIARAZIONE PIN DI SALITA
 Serial.begin (9600);

 pinMode(PULSANTE, INPUT_PULLUP);
 pinMode(ATTIVATO, INPUT_PULLUP);
 pinMode(RELERESET, OUTPUT);
 pinMode(RELEONOFF, OUTPUT);
 pinMode(LEDATTIVATO, OUTPUT);
 pinMode(BUZZER, OUTPUT);
 digitalWrite(RELERESET, OFF_LEVELRESET);
 digitalWrite(RELEONOFF, OFF_LEVELONOFF);
 digitalWrite(LEDATTIVATO, OFF_LEVELLEDATTIVATO);
 
 
 digitalWrite (LEDATTIVATO, LOW);
 digitalWrite(BUZZER, LOW);
 
 }
  
 //-----------------------------------------------------------
 void loop()
 {

 
 //qui dichiaro il byte del PULSANTE
 byte pulsante = (digitalRead(PULSANTE) == PRESS_LEVELPULSANTE);
 Serial.println("pulsante premuto");
 
  //qui attivo un rele e un buzzer per attivato
  
  byte attivato = (digitalRead(ATTIVATO)); 
  if (attivato == HIGH) {                        // controlla che l'input sia HIGH (premuto)
    digitalWrite(LEDATTIVATO, LOW);        // accende il led
    Serial.println("impianto spento:");
   }
  else 
  {
   digitalWrite(LEDATTIVATO, HIGH);        // spegne il led
    Serial.println("impianto attivo:");
  }


    B = attivato ;                // qui B = in
    if (B & !C)                   // quando B va alto suono perchè B chiuso che si apre dopo che C si è chiuso  
    {            
      tone(BUZZER, 3400, 1000);   // suono per un tempo di 1000
    }
    C = B;                        // C si chiude perche C = B cosi il buzzer si spegne perche !C                         
  
  if (!B & !D)                    // quando B ritorna basso trovo !D  cosi  
    {            
      tone(BUZZER, 3600, 1000);   // suono per un tempo di 1000
    }
    D = !B;                       // nel frattempo !B ritorna basso quuindi !B cosi il buzzer si spegne

 
  // qui eseguo un set/reset per attivare /disattivare l'impianto

 A = (pulsante | A ) & !R ;
 X = !R & A & !pulsante ;
 R = ((pulsante) & R1) ;
 R1 = (X | R)  ;



 
 //tempo per impulso di reset 
 T1 = 0;
 if (!A )
 {
 t1 = millis();
 }
 else if (millis() - t1 >= 800) T1 = 1;
 
 //ritardo accensione rele ONOFF dopo reset 
 
  T2 = 0;
 if (!T1 )
 {
  t2 = millis();
  }
  else if (millis() - t2 >= 800) T2 = 1;

  
     
//------------------QUESTA PARTE è PER COMANDARE LE USCITE-------------------------

 // qui accendo un RELERESET in forma impulsiva per reset centrale in caso di anomalie 
 digitalWrite(RELERESET, (A & !T1 ) ? ON_LEVELRESET : OFF_LEVELRESET);

 // qui accendo il rele ONOFF in forma stabile dopo il RESET
 digitalWrite(RELEONOFF, (T2 ) ? ON_LEVELONOFF : OFF_LEVELONOFF);
 
 
 }

[/code]

Mi da l'impressione che il buzzer crei un problema hardware...

Il tuo programma è quasi incomprensibile. Il tuo problema si risolve con un programma a stati. Se ti può interessare ho scritto uno schema di flusso cercando di seguire le tue indicazioni.

SETUP
Attivazione reader
STATO 0

STATO 0 Centrale spenta
SE pulsante premuto OR tessera valida
  fai due bip
  accendi relereset
  pausa1
  spegni relereset
  pausa2
  accendi relecentrale
  accendi ledattivata
  suona buzzerattivata
  STATO 1
SE tessera falsa
  fai lampeggiare ledfalsa
  fai suonare buzzerfalsa
  STATO 0

STATO 1 Centrale accesa
SE pulsante premuto OR tessera valida
  fai due bip
  spegni relecentrale
  spegni ledattivata
  suona buzzerdisattivata
  STATO 0
SE tessera falsa
  fai lampeggiare ledfalsa
  fai suonare buzzerfalsa
  STATO 1

Ciao,
P.

pgiagno:
Il tuo programma è quasi incomprensibile

Ha seguito fin troppo alla lettera certi miei esempi PLC like :-[ che non essendo scritti in modo algoritmico ma a contatti (tramite espressioni logiche) risultano effettivamente ermetici se non si risale allo schema a contatti di partenza.

Concordo che la macchina a stati (o una cooperazione tra più macchine) rimane la soluzione generale più flessibile, a metà strada tra la cripticità dei contatti e la chiarezza autodocumentante dell'algoritmo (se scritto con criterio ovvio).

Claudio_FF:
Ha seguito fin troppo alla lettera certi miei esempi PLC like :-[ che non essendo scritti in modo algoritmico ma a contatti (tramite espressioni logiche) risultano effettivamente ermetici se non si risale allo schema a contatti di partenza....

Fiùùù. Meno male.
Pensavo a un aggravamento della mia demenza senile...

Ciao,
P.

Claudio_FF:
Ha seguito fin troppo alla lettera certi miei esempi PLC like :-[

... si, infatti ... se da queste parti evitaste di parlare di Ladder, PLC e simili e vi orientaste di più alla logica "Arduino" (ed alla programmazione di MCU) con diagrammi di flusso, funzioni e programmazione C/C++ ... sarebbe molto meglio :grin:

Grazie,

Guglielmo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.