? salto linea comando per ricalcolo?

Ciao a tutti, ho il seguente problema:
alla fine di un programma ho determinato attraverso un sensore un valore di soglia , ed in base a questo valore devo attivare 2 relè nel seguente modo:
se il valore impostato di soglia viene superato deve attivarsi il relè 1 per 200ms , questa attivazione dovrebbe far si che il valore di soglia diminuisca, ma se questo non dovesse succedere allora dopo 20 sec deve attivarsi il relè2 per 200ms.
Nel mio piccolo pensavo che mettendo due cicli di if in serie mi sarebbe bastato, ma non avevo considerato che in questo caso il valore di soglia non viene ricalcolato e quindi ho comunque l'attivazione del relè due anche se il valore di soglia con l'attivazione del relè 1 è diminuito.
Come faccio quindi a far ricalcolare tale valore di soglia? Secondo me dopo l'attivazione del relè1 il programma dovrebbe saltare l'istruzione di attivazione del relè2 ,ricalcolare il valore di soglia e riprendere dopo il relè1.

tenete presente che non ho grosse domestichezze con arduino (per riuscite a fare un programmino di start e stop con due pulsanti e millis ci ho impiegato 3 giorni).
Grazie anticipate

Purtroppo per capire bene come funziona millis() tocca studiare vari documenti e fare tante prove ...

... comincia prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ...

Dopo che avrai seguito tutto con attenzione e studiato bene tutti gli esempi capendo quello che fanno, dovresti essere in grado di fare qualsiasi cosa con millis() :smiley:

Guglielmo

Scusa , forse non mi sono espresso bene, millis era un esempio per chiarire che non sono un esperto, il mio problema è espresso nella parte superiore del post.

crapa:
Scusa , forse non mi sono espresso bene, millis era un esempio ...

... no, no, millis() è esattamente ciò che devi usare per risolvere il tuo problema :smiley:

Guglielmo

scusa , non capisco. Cerco di chiarire togli tutti i tempi che ho scritto .
livello soglia superato :
si attiva relè 1

a questo punto devo ricontrollare il valore di soglia 2 opzioni
1 livello di soglia è rintrato nei parametri - continuo controllo
2 livello di soglia non è rientrato -attivo relè2 .

se uso ciclo di if ,ok per il primo relè a questo punto però devo ritornare in cima al programma per ricalcolare il valore di soglia e nel caso attivare oppure non attivare relè 2.
altrimenti in ogni caso si eccita relè 2
cosa c'entra millis?

Tutto quello che effettua il calcolo lo racchiudi in una funzione, e chiami la funzione da ogni punto del programma in cui ti serve il calcolo aggiornato.

Millis serve per misurare il trascorrere del tempo se si vuole strutturare il programma senza pause di attesa che bloccano ogni altra operazione.

Ok adesso è un poco più chiaro. Cioè è chiaro che sono fallito.pensavo di essere quasi a conclusione del progetto . ma Tra funzioni e millis non ce la posso fare. Grazie e scusate per il tempo perso.

Beh, non è che si impara così da zero in pochi giorni, sono concetti che richiedono mesi per essere digeriti bene, e dopo anni c'è ancora da imparare... In un linguaggio general purpose con cui costruire qualsiasi tipo di procedura ci sono molte più cose da tenere in considerazione rispetto ad un linguaggio specific purpose semplificato (come può essere quello di un PLC).

Come faccio quindi a far ricalcolare tale valore di soglia? Secondo me dopo l'attivazione del relè1 il programma dovrebbe saltare l'istruzione di attivazione del relè2 ,ricalcolare il valore di soglia e riprendere dopo il relè1.

Puoi fare cosi' se il bloccaggio del programma per + di 20Sec non è un problema

Calcolo soglia
if (soglia)
{
  relay 1 per 200ms
  delay 20Sec
  calcolo soglia 
  if (soglia)
  {
    relay 2 per 200ms
  }
}

Se invece il delay20Sec è un problema, sarai obbligato ad usare millis().

Per far fare tic ai relè, puoi usare il delay(), che blocca l'esecuzione solo per quei 200ms; per i 20 secondi, però, devi usare millis(), altrimenti resta tutto bloccato nell'attesa. Se non deve fare altro, puoi anche usare delay()... Usare millis(), però, non richiede un grande sforzo e lascia il programma aperto a sviluppi futuri.

grazie , il problema è che la lettura è fornita da un sct-013-30 che legge la corrente assorbita da un impianto elettrico, da qui la necessita di avere due rele di stacco ,

Quindi ;
Lettura supera il limite scatta rele1 ,aspetto 3 secondi se la lettura sucessiva è nei paramatri titto ok se però la lettura sucessiva é ancora elevata scatta relé2.

però nel programma i due relé per forza di cose sono in cascata quindi alla prima lettura fuori parametro scattavano i due relé in contemporanea.

Comunque ce lo fatta con un goto e un contacicli.
if (parametro > soglia)
attiva relé1

ciclo=(ciclo+1)
if (ciclo< 3) {goto fine}

if (parametro>soglia)
attiva relé2
ciclo=0

fine:

ultime due righe del programma e qui riparte il LOOP. con relativo ricalcolo della lettura del sensore

Perdonate mancanza di punteggiatura corretta.
In questo modo permetto al programma di controllare se il parametro é rientrato e di conseguenza…
Grazie per il supporto anche morale
dimenticavo grazie datman ho preso spunto dal tuo aiuto dell mia richietsa precedente, ho creato ritardo per i relè con millis per tempi da 60 minuti e con possibilita attraverso pulsante di resettare il tempo di attivazione degli stessi
grazie a tutti

Prego :slight_smile: