Patrick_M:
per le schedine rele HIGH vuol dire spento e LOW acceso!
Per questo io consiglio di definire tutto quello che riguarda l'hardware all'inizio, e nel programma usare solo nomi di comodo (per convenzione maiuscoli) che evitano ogni ambiguità nell'interpretazione e permettono di capire cosa si sta facendo anche senza avere lo schema dei collegamenti sotto mano:
// definizione pin usati e livelli di comando,
// dipendono dai collegamenti effettuati
#define RELEUP 4
#define ON_LEVEL LOW
#define OFF_LEVEL HIGH
// nel programma si usano solo i nomi di comodo
void setup()
{
pinMode(RELEUP, OUTPUT);
digitalWrite(RELEUP, OFF_LEVEL)
}
Stessa cosa per gli ingressi:
// definizione pin usati e livelli letti,
// dipendono dai collegamenti effettuati
#define BUTTONUP 2
#define PRESS_LEVEL HIGH
// nel programma si usano solo i nomi di comodo
void setup()
{
pinMode(BUTTONUP, INPUT);
}
void loop()
{
byte val = digitalRead(BUTTONUP);
if (val == PRESS_LEVEL) { .... }
}
L'importante è appunto non cospargere il codice di numerini magici e HIGH/LOW, che senza vedere lo schema non dicono nulla, e anche con lo schema ci si può comunque confondere. Se si cambia un collegamento hardware basta modificare le define iniziali e tutto il resto del programma rimane invariato.
nicolini2000:
ma non avviene perchè il timeup lo tiene acceso. dovrei interrompere il ciclo
del timeup
Per quanto riguarda il delay bloccante la risposta non è semplice. Per questo motivo (per semplificare) nel post #1 avevo proposto l'esempio del programma a contatti che simula i relé (con un temporizzatore realizzato con la funzione millis). Se parli di PLC/ladder do per scontato che un'automazione a relé non abbia segreti.
Riconoscere una seconda pressione del pulsante significa aver già riconosciuto il primo rilascio (a questo servono i relé X e Y dello schema del post #4). Il primo rilascio potrebbe avvenire prima o dopo lo scadere del timer, e se il pulsante è ancora premuto non deve partire un'altra sequenza. Alla seconda pressione il relé deve cadere, ma, di nuovo, non deve ripartire tutto da capo se si tiene il pulsante premuto (per queste cose serve il relé R dello schema).
Il programma deve tenere conto di tutte queste possibilità/situazioni contemporaneamente, e il codice procedurale con delay che hai usato è la scelta più incasinata perché permette di fare una e una sola cosa alla volta.
Quindi la domanda è: lo schema del post #4 fa quello che chiedi?
Se si, allora basta tradurlo in espressioni logiche (le serie/paralleli di contatti), una decina di righe e finito.