temporizzatori

Buonsera ragazzi sto cercando di programmare un timer dove se un contatto APRE o CHIUDE rimane chiuso per + di 30 secondi il T_LAVORO dalla condizione 0 va a 1

non capisco perche la soluzione 1 non funziona

Soluzione 1

// timer per timeout lavoro
             
  T_LAVORO = 0;
  if (!APRE | !CHIUDE )
  {
  t_lavoro = millis();
  }
  else if (millis() - t_lavoro >= 30000) T_LAVORO = 1;


Soluzione 2

LAVORO = APRE | CHIUDE    
  
  T_LAVORO = 0;
  if (!LAVORO )
  {
  t_lavoro = millis();
  }
  else if (millis() - t_lavoro >= 30000) T_LAVORO = 1;

La soluzione 2 ti funziona invece?

Dovresti postare i codici che utilizzi e su quale Arduino.

Ciao,
P.

>ziojekson: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice, anche se si tratta solo di una riga, dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

T_LAVORO = 0;
  if (!APRE | !CHIUDE )
  {
  t_lavoro = millis();
  }
  else if (millis() - t_lavoro >= 30000) T_LAVORO = 1;


Soluzione 2

LAVORO = APRE | CHIUDE   
 
  T_LAVORO = 0;
  if (!LAVORO )
  {
  t_lavoro = millis();
  }
  else if (millis() - t_lavoro >= 30000) T_LAVORO = 1;

>ziojekson: scusa, ma hai letto con attenzione il mio post #3 ? ? ? :o

NON devi mettere un nuovo post, devi correggere il tuo post iniziale come ti ho indicato. Grazie.

Guglielmo

P.S.: Dopo che avrai corretto il tuo post iniziale, io cancellerò il post duplicato #4

La ragione è ovvia... (v. Dx Xxxxxn) :slight_smile:
ma potrà essere rivelata solo dopo che sarà stata soddisfatta la giusta richiesta del Supremo di racchiudere il codice tra i tag CODE!

De Morgan! Chi era costui?..
Teoremi di De Morgan

if (!APRE || !CHIUDE) è cosa ben diversa da if !(APRE || CHIUDE)
Infatti, secondo De Morgan, if !(APRE OR CHIUDE) equivale a if (!APRE AND !CHIUDE), cioè è vera se sia APRE che CHIUDE sono false. Deve essere, quindi:

t_lavoro=0;
if (!APRE && !CHIUDE)
  {
  t_lavoro=millis();
  }
else if (millis()-t_lavoro>=30000) t_lavoro=1;

Nota che la forma corretta è con && (o || nel caso dell’OR), perché & e | sono gli operatori binari sui singoli bit. C’è da dire che funzionano ugualmente finché vengono usati con condizioni che possono valere solo 0 o 1, come if(3<2) e if(5>4), ma è sbagliato.

Mah, per me è troppo poco chiara la richiesta, come interpretare "in ottica Arduino" la frase "se un contatto APRE o CHIUDE rimane chiuso per + di 30 secondi il T_LAVORO dalla condizione 0 va a 1"?

Con "un contatto" intendiamo un "pulsante" quindi "un pin", per cui vuole che una variabile (T_LAVORO, ma perché in maiuscolo, che in genere sono le costanti? E perché intera se basta bool?) indichi la situazione in cui quel certo pin non ha cambiato stato negli ultimi 30 secondi, esatto? Di fatto quindi vuoi che lo stato debba sempre cambiare, in un tempo minore di 30 secondi?

Magari postare l'intero codice e non solo un pezzetto di pseudo-codice aiuterebbe (o quantomeno la porzione dove implementa la logica, ed almeno le definizioni delle variabili usate), comunque una cosa del genere, ad esempio?

#define P_BTN 2
#define TEMPO_MAX 30000

bool lavoro = false;
bool oldState = false;
unsigned long tmrCheck;

void setup() {
  Serial.begin(9600);
  pinMode(P_BTN, INPUT);
  oldState = digitalRead(P_BTN);
  tmrCheck = millis();
}

void loop() {
  if ( digitalRead(P_BTN) != oldState ) {
    oldState = !oldState;
    tmrCheck = millis();
    Serial.print("Cambio stato: ");
    Serial.println(oldState);
  }
  lavoro = ( millis() - tmrCheck > TEMPO_MAX );
  
  if ( lavoro )
    Serial.println("CHECK!");
}

Ciao, docdoc

Ha detto che la soluzione 2 funziona. Se quella funziona, è ovvio che non può funzionare la soluzione 1 a causa della differenza dovuta alla non equivalenza logica alla soluzione 2.

Datman:
Ha detto che la soluzione 2 funziona. Se quella funziona, è ovvio che non può funzionare la soluzione 1 a causa della differenza dovuta alla non equivalenza logica alla soluzione 2.

Si, lo avevo capito, ma quello che a me pare "curioso" è chiedere aiuto senza dare una descrizione formalmente corretta del problema e magari anche porzioni di codice "reale". :wink: Parlare di APERTO e CHIUSO per me non significa nulla, voglio vedere qualche linea di codice reale, poi ne possiamo parlare. :smiley:

grazie delle spiegazioni
sono un principiante e avendo usato per multo tempo il linguaggio a contatti (ladder) nei plc mi è più facile scrivere un programma in questo modo.
prendendo spunto anche da altri posto ho realizzato un programma che vorrei utilizzare un un mio progetto nel prossimo natale
in definitiva si tratta di una serranda avvolgibile che si apre premendo un pulsante (probabile che sostituirò con un rivelatore di presenza (chiaramente con contatto pulito per interfacciare con arduino) e con un secondo rivelatore che se non rivela per 20 minuti (30 secondi sono solo per fare prove a banco ) richiude la serranda.
se posso e se volete vi posto il programma che a banco funziona
in ogni caso ho raggirato il problema in un altro modo, più rudimentale ma efficace

ziojekson:
... in definitiva si tratta di una serranda avvolgibile che si apre premendo un pulsante (probabile che sostituirò con un rivelatore di presenza (chiaramente con contatto pulito per interfacciare con arduino) e con un secondo rivelatore che se non rivela per 20 minuti (30 secondi sono solo per fare prove a banco ) richiude la serranda. ...

... per evitare qualsiasi problema e future incomprensioni, ti rammnento il REGOLAMENTO ed in particolare il punto 15 ed i suoi sottopunti ... se la serranda avvogibile in questione è alimentata ad una tensione superiore alla bassissima tensione, NON ne puoi parlare, pena la chiusura del thread.

Meglio prevenire che curare ... :smiley:

Guglielmo

scusa ai ragione potevo dire rele A e rele B senza menzionare motore
prossima volta staro più attento
comunque esistono anche a bassa tensione, ne ho installati a 24vdc
https://www.ebay.it/itm/2004497-Motore-per-tapparella-535-07-24V-CC-X1-C2-5-BL-CEM-Somfy/174290019374?hash=item28947ea42e:g:vwIAAOSw~1NexpWH

... per impianti a 24V non c'è alcun problema, quindi ... puoi porre i tuoi questiti per quelli :slight_smile:

Guglielmo