Go Down

Topic: automazione tapparelle (Read 3487 times) previous topic - next topic

Claudio_FF

#60
Dec 02, 2018, 12:29 pm Last Edit: Dec 03, 2018, 07:06 pm by Claudio_FF
ora sostituisco resistenza da 10k Pul-down
Che naturalmente è quella più a sinistra in verticale vero?
Perché se cambi quella orizzontale che fa il debounce peggiori solo la situazione...

Comunque non è quello il problema :smiley-roll:
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

elettrico

Sto riscrivendo il programma passo passo e non capisco perchè al momento della compilazione trova un errore alla riga dove comando il relè A     

A = (up | A | T2 ) & !B & !R & ! & !gdw;

il comando gdw dice che non è dichiarato






Code: [Select]
// COMANDI SALITA

#define P_UP                 2    // pulsante salita locale
#define PG_UP                4    // pulsante salita Generale
#define RELEUP               9    // relè comando salita
#define PRESS_LEVELUP     HIGH    // livello ingresso salita locale  premuto
#define PRESS_LEVELGENUP  HIGH    // livello ingresso salita generale  premuto
#define ON_LEVELUP        HIGH    // livello uscite accese
#define OFF_LEVELUP !ON_LEVELUP   // livello uscite spente



//COMANDI DISCESA

#define P_DW                 3      // pulsante discesa locale
#define PG_DW                5     // pulsante discesa generale
#define RELEDW              10     // relè comando discesa
#define PRESS_LEVELDW     HIGH     // livello ingresso discesa locale premuto
#define PRESS_LEVELGENDW  HIGH     // livello ingresso discesa generale premuto
#define ON_LEVELDW        HIGH     // livello uscite accese
#define OFF_LEVELDW !ON_LEVELDW    // livello uscite spente




//-------------------------------------------------------------------------------

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

  pinMode(P_UP, INPUT);
  pinMode(PG_UP, INPUT);
  pinMode(RELEUP, OUTPUT);
  digitalWrite(RELEUP, OFF_LEVELUP);

  //DICHIARAZIONE PIN DI DISCESA

  pinMode(P_DW, INPUT);
  pinMode(PG_DW, INPUT);
  pinMode(RELEDW, OUTPUT);
  digitalWrite(RELEDW, OFF_LEVELDW);


}

//Definizione variabili di lavoro globali

byte A = 0;
byte B = 0;
byte R = 0;
byte X = 0;
byte Y = 0;
byte Z = 0;
byte W = 0;
byte T1 = 0;
byte T2 = 0;
byte T3 = 0;
uint32_t t1 = 0;
uint32_t t2 = 0;
uint32_t t3 = 0;



//---------------------------------------------------------------------------------------------------------
                   
  void loop()
  {                     
                        //LOOP DI SALITA
                     
  // Lettura ingressi per la salita (serve debounce hardware)
 
  byte up = (digitalRead(P_UP) == PRESS_LEVELUP);
  byte gup = (digitalRead(PG_UP) == PRESS_LEVELGENUP);
           
           
  A = (up | A | T2 ) & !B & !R & ! & !gdw;       
 
    // Aggiornamento uscite con interblocco
  digitalWrite(RELEUP, (A & !B) ? ON_LEVELUP : OFF_LEVELUP);
 
    //--------------------------------------------------------------------
                     //LOOP DI DISCESA

  // Lettura ingressi per la discesa (serve debounce hardware)
 
  byte dw = (digitalRead(P_DW) == PRESS_LEVELDW);
  byte gdw = (digitalRead(PG_DW) == PRESS_LEVELGENDW);
               
  B = (dw | B | T3 ) & !A & !R & !T1 & !gup;

  // Aggiornamento uscite con interblocco
  digitalWrite(RELEDW, (B & !A) ? ON_LEVELDW : OFF_LEVELDW);
 

  //------------COMANDO RESET DEI MOVIMENTO-------------------------------------

 
  // Lettura ingressi (serve debounce hardware)
   
                    // qui memorizzzo che sono in salita per poi fermarla con un qualsiasi pulsante           
  X = ((A & !up) | X | T2 ) & !B & !R & !T1 & !gdw;
 
                    // qui memorizzzo che sono in discesa per poi fermarla con un qualsiasi pulsante
  Y = ((B & !dw) | Y |T3 ) & !A & !R & !T1 & !gup;
 
                   // qui arresto i movimenti premendo un qualsiasi pulsante
  R = (up | dw) & ( X | Y | T1 | R);

                   
  W = (gup | W ) & !A;

  Z = (gdw | Z ) & !B;

                   
                   
                   
                   
                   
                   // qui arresto i movimenti con un timeout

  T1 = 0;
 
  if(!A & !B )
   {
   t1 = millis(); 
   }
   else if(millis() - t1 >= 3000) T1 = 1;

   T2 = 0;
 
  if((!gup | !W ) & !A)
   {
   t2 = millis(); 
   }
   else if(millis() - t2 >= 1000) T2 = 1;

   T3 = 0;
 
  if((!gdw | !Z ) & !B)
   {
   t3 = millis(); 
   }
   else if(millis() - t3 >= 1000) T3 = 1;



elettrico

#62
Dec 16, 2018, 08:09 pm Last Edit: Dec 16, 2018, 08:28 pm by elettrico
risolto con questo nuovo sketch al posto di gdw e gup ho inserito Z e W

ora pero mi aspettavo che con autoritenuta di W o Z i timer che servono per ritardare la partenza dei rele in caso di inversione iniziavano il conteggio appena premuto il pulsante PG_UP o PG_DW.
invece per far si che il tutto funziona devo tener premuto il pulsante per il tempo di ritardo impostato
è come se l'autoritenuta non funzionasse
Code: [Select]



 
 
 
// COMANDI SALITA

#define P_UP                 2    // pulsante salita locale
#define PG_UP                4    // pulsante salita Generale
#define RELEUP               9    // relè comando salita
#define PRESS_LEVELUP     HIGH    // livello ingresso salita locale  premuto
#define PRESS_LEVELGENUP  HIGH    // livello ingresso salita generale  premuto
#define ON_LEVELUP        HIGH    // livello uscite accese
#define OFF_LEVELUP !ON_LEVELUP   // livello uscite spente



//COMANDI DISCESA

#define P_DW                 3      // pulsante discesa locale
#define PG_DW                5     // pulsante discesa generale
#define RELEDW              10     // relè comando discesa
#define PRESS_LEVELDW     HIGH     // livello ingresso discesa locale premuto
#define PRESS_LEVELGENDW  HIGH     // livello ingresso discesa generale premuto
#define ON_LEVELDW        HIGH     // livello uscite accese
#define OFF_LEVELDW !ON_LEVELDW    // livello uscite spente




//-------------------------------------------------------------------------------

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

  pinMode(P_UP, INPUT);
  pinMode(PG_UP, INPUT);
  pinMode(RELEUP, OUTPUT);
  digitalWrite(RELEUP, OFF_LEVELUP);

  //DICHIARAZIONE PIN DI DISCESA

  pinMode(P_DW, INPUT);
  pinMode(PG_DW, INPUT);
  pinMode(RELEDW, OUTPUT);
  digitalWrite(RELEDW, OFF_LEVELDW);

}

//Definizione variabili di lavoro globali

byte A = 0;
byte B = 0;
byte R = 0;
byte X = 0;
byte Y = 0;
byte W = 0;
byte Z = 0;
byte T1 = 0;
byte T2 = 0;
byte T3 = 0;
uint32_t t1 = 0;
uint32_t t2 = 0;
uint32_t t3 = 0;

//---------------------------------------------------------------------------------------------------------
                   
  void loop()
  {                     
                                             
  // Lettura ingressi per la salita (serve debounce hardware)
 
  byte up = (digitalRead(P_UP) == PRESS_LEVELUP);
  byte gup = (digitalRead(PG_UP) == PRESS_LEVELGENUP);
           
       

  // Lettura ingressi per la discesa (serve debounce hardware)
 
  byte dw = (digitalRead(P_DW) == PRESS_LEVELDW);
  byte gdw = (digitalRead(PG_DW) == PRESS_LEVELGENDW);



         //COMANDO SALITA
 
  A = (up | A | T2 ) & !T1 & !B & !R & !Z; 
 
  // Aggiornamento uscite con interblocco
  digitalWrite(RELEUP, (A & !B) ? ON_LEVELUP : OFF_LEVELUP);

        //COMANDO DISCESA
  B = (dw | B | T3 ) & !T1 & !A & !R  & !W;

  // Aggiornamento uscite con interblocco
  digitalWrite(RELEDW, (B & !A) ? ON_LEVELDW : OFF_LEVELDW);
 

  //------------COMANDO RESET DEI MOVIMENTO-------------------------------------

 
  // Lettura ingressi (serve debounce hardware)
   
                    // qui memorizzzo che sono in salita per poi fermarla con un qualsiasi pulsante           
  X = ((A & !up) | X | T2 ) & !B & !R & !T1 & !Z;
 
                    // qui memorizzzo che sono in discesa per poi fermarla con un qualsiasi pulsante
  Y = ((B & !dw) | Y | T3 ) & !A & !R & !T1 & !W;
 
                   // qui arresto i movimenti premendo un qualsiasi pulsante
  R = (up | dw) & ( X | Y | T1 | R);

                   
  W = (gup | W ) & !A;

  Z = (gdw | Z ) & !B;

               
                   
                   // qui arresto i movimenti con un timeout

  T1 = 0;
    if(!A & !B )
   {
   t1 = millis(); 
   }
   else if(millis() - t1 >= 3000) T1 = 1;


   T2 = 0;
    if((!gup | !W ) & !A)
   {
   t2 = millis(); 
   }
   else if(millis() - t2 >= 1000) T2 = 1;


   T3 = 0;
    if((!gdw | !Z ) & !B)
   {
   t3 = millis(); 
   }
   else if(millis() - t3 >= 1000) T3 = 1;



 
           





Patrick_M

Code: [Select]
 void loop()  {                    
  byte up = (digitalRead(P_UP) == PRESS_LEVELUP);
  byte gup = (digitalRead(PG_UP) == PRESS_LEVELGENUP);

  A = (up | A | T2 ) & !B & !R & ! & !gdw;                         // <--qui lo usi

  digitalWrite(RELEUP, (A & !B) ? ON_LEVELUP : OFF_LEVELUP);

  byte dw = (digitalRead(P_DW) == PRESS_LEVELDW);
  byte gdw = (digitalRead(PG_DW) == PRESS_LEVELGENDW);     // <--qui lo dichiari
              
  B = (dw | B | T3 ) & !A & !R & !T1 & !gup;


capisci bene che se prima lo usi e poi lo dichiari....
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

Patrick_M

la dichiarazione delle variabili ti converrebbe metterla all'inizio prima del setup così sono tutte assieme
inoltre ora che ci lavori lo sai, ma tra un anno se sicuro di sapere ancora cosa sono?
Code: [Select]

byte T1 = 0;
byte T2 = 0;
byte T3 = 0;
uint32_t t1 = 0;
uint32_t t2 = 0;
uint32_t t3 = 0;
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

elettrico

#65
Dec 16, 2018, 08:32 pm Last Edit: Dec 16, 2018, 08:34 pm by elettrico
chiarissimo  per la dichiarazione e l'uso ora devo risolvere il problema dei timer
gia spostato le variabili come consigli

Claudio_FF

#66
Dec 16, 2018, 09:31 pm Last Edit: Dec 18, 2018, 08:19 pm by Claudio_FF
Le condizioni dei timer T2 e T3 sono sbagliate.

Visto che sono pari pari attivi assieme a W e Z basta fare così:
Code: [Select]
T2 = 0;
if (!W)
{
    t2 = millis();
}
else if ((millis() - t2) >= 1000) { T2 = 1; }


T3 = 0;
if (!Z)
{
    t3 = millis();
}
else if ((millis() - t3) >= 1000) { T3 = 1; }
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

elettrico

grazie, non l'ho ancora pubblicato ma c'ero arrivato anch'io
sono già molto avanti, ora cerco di finire lo sketch poi lo posto

elettrico

ho realizzato questo circuito con componenti diversi da quelli proposti da Flavio.
ho un ingresso che non funziona bene e dopo diverse prove e risultato la parte hardware.
l'ingresso legge anche quando lascio il pulsante

lo schema allegato puo andare bene?

elettrico

risolto con un delay (10) ; a fine righe

Claudio_FF

#70
Jan 20, 2019, 08:59 am Last Edit: Jan 20, 2019, 09:01 am by Claudio_FF
Magari risolvevi anche facendo come il due dicembre (post #59) avevi detto che avresti fatto.

Il fatto che serva un delay al loop, messo li più o meno a caso, significa che c'è un problema, ora certamente "mascherato", per cui non da più problemi, ma comunque non compreso. Il che non è un problema in assoluto, almeno finché un altro problema identico non si manifesta  ;)

Così a occhio qualcosa nel circuito di ingresso non va bene, pull-up troppo grande (troppo sensibile ai disturbi), o costante di tempo RC troppo piccola (tempo di debounce troppo breve).
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

elettrico

Sto rifacendo il circuito  degli ingressi modifico resistenze come schema di Claudio_FF
Al momento non ho condensatori di 1 mf.
Ne ho tanti da 330 nf. In alternativa che valore può essere più adeguato?

Claudio_FF

non ho condensatori di 1 mf.
'm' minuscolo significa 'milli'

L'unità giusta è µF (con la 'F' maiuscola), a volte se è difficile ottenere il simbolo micro sulla tastiera si scrive anche uF

Quote
Ne ho tanti da 330 nf. In alternativa che valore può essere più adeguato?
Vanno bene anche quelli. Poi se li metti in parallelo sommi le capacità.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

Go Up