Più if contemporaneamente che mi mantengano i relè chiusi senza lampeggiare

Buongiorno,

ho un programma che mi fa capricci, nel senso che tramite dei sensori analogici, leggo delle pressioni e queste mi vengono stampate su display… fino a qui tutto bene…
successivamente alla pressione di un tasto voglio far si che il programma si setti sotto questo stato ed esca solo quando premo nuovamente il tasto… fino a qui perfetto…
questo programma deve leggere contemporaneamente i 4 sensori, confrontarli 4 relativi dati e se sono maggiori o minori o uguali, azionare i rispettivi relè… più o meno qui funziona… nel senso che invece di mantenere i relè chiusi fino al momento giusto, lampeggiano… cioè continuano ad aprirsi e chiudersi di continuo… i relè giusti eh… ma non rimangono chiusi fino al momento giusto.

:confused:

che devo fare?

AIR.LEVEL_4_COLOR.ino (25.3 KB)

Analizzare 1000 righe di codice non è semplice, io ti consiglio di provare a fare debug impostando il progetto su Tinkercad Circuits, dove ricrei le connessioni, carichi lo sketch, e puoi fare un comodo debug, con breakpoint (metterai un breakpoint sui comandi di apertura e chiusura dei relè) e visualizzazione del valore delle variabili.
Io lo trovo molto comodo, non solo per il debug ma anche per "sperimentare".

Prova e facci sapere.

Arduino ha una parte hardware "i componenti e il circuito" e una parte software "il programma", a volte si pensa che il problema sia il programma ma invece è la caratteristica del circuito.

Mi viene da pensare che le variabili confrontate negli if() assumano valori non previsti, prova a mettere dei Serial.println() che stampano i valori delle variabili utilizzate, questi valori potrebbero per qualche motivo sconosciuto o legato all'hardware cambiare, attivando una parte di codice e poi un altra.

Per trovare la parte di codice che da problemi, potresti commentare parte del codice in modo da stabilire il comportamento del restante codice.
Ossia invece di controllare tutte le funzioni che agiscono su i relé, le racchiudi tra commenti tutte tranne una e vedi il suo comportamento, in quella funzione userai dei serial.println() per vedere i valori assunti dalle variabili, e ti si potrebbero chiarire le cose.

torn24:
Mi viene da pensare che le variabili confrontate negli if() assumano valori non previsti, prova a mettere dei Serial.println() che stampano i valori delle variabili utilizzate, questi valori potrebbero per qualche motivo sconosciuto o legato all'hardware cambiare, attivando una parte di codice e poi un altra.

Giusto, questo è quello che si fa quasi sempre, però in alcuni casi (come questo, secondo me) si fa mooolto prima a fare debugging con la piattaforma Tinkercad Circuit che, come detto, ti permette breakpoint e visualizzazione del valore delle variabili! Tra l'altro il tutto senza dover cablare fisicamente il circuito.

L'unica cosa negativa che non hanno ancora corretto è che il valore di millis() non restituisce millisecondi ma centesimi di secondo quindi quei valori vanno "adattati" per poter fare debugging in quei casi.
Per il resto, molto meglio del Debug.print() secondo me :slight_smile:

Ixso88:
Buongiorno,

ho un programma che mi fa capricci, nel senso che tramite dei sensori analogici, leggo delle pressioni e queste mi vengono stampate su display... fino a qui tutto bene...
successivamente alla pressione di un tasto voglio far si che il programma si setti sotto questo stato ed esca solo quando premo nuovamente il tasto... fino a qui perfetto...
questo programma deve leggere contemporaneamente i 4 sensori, confrontarli 4 relativi dati e se sono maggiori o minori o uguali, azionare i rispettivi relè... più o meno qui funziona... nel senso che invece di mantenere i relè chiusi fino al momento giusto, lampeggiano... cioè continuano ad aprirsi e chiudersi di continuo... i relè giusti eh... ma non rimangono chiusi fino al momento giusto.

:confused:

che devo fare?

quando si ha a che fare con programmi tipo "soglia" (analogread + "attivare disattivare qualcosa") c'è da prendere in seria considerazione l uso dell isteresi, se no ci sarà sempre un comportamento poco stabile in certe condizioni, questo vale per tutto pressostati termostati intensità luminosa etc...

altra cosa e che i programmi si dovrebbero scrivere sempre col suo accrocchio collegato, e sistemare la faccenda subito se qualcosa da segni di instabilità

se posso permettermi un piccolo consiglio che ho imparato sui forum arduino...oltre a fare come me che sono alle prime armi gli esperimenti sulla piattaforma di tinkercad...è quello di scrivere una funzione per ogni singolo oggetto Es.
Void Pulsante()
{
....
....
....
}
Void Sensore1()
{
...
...
...
}

cosi diventa piu semplice far fare ad ognuno il suo compito.

Poi quando tutte le funzioni sono a posto le richiami nel loop quando ti servono.

Ciao,
se ho capito bene ciò che vorresti fare è mantenere una pressione entro certi limiti, la pressione viene letta da un sensore analogico e viene variata da un azionamento digitale (o tutto aperto o tutto chiuso), per avere un comportamento decente e non intermittente (come hai adesso a causa di piccole variazioni hai l'apertura o chiusura completa della valvola) devi per forza utilizzare un PID per ogni sensore, tralascio la spiegazione di come funziona il PID ti dico solo che in base al comportamento precedente sa regolarsi per il comportamento futuro.
Ad occhio stai cercando di regolare l'altezza da terra di un auto agendo sulle valvole che immettono o tolgono aria agli ammortizzatori (FR=FrontRight FL=FrontLeft ecc.), riuscirai nell'intento solo regolando molto bene i parametri del PID, naturalmente questo sistema non lo puoi adottare per regolare la pressione in marcia, durante la marcia le valvole dovranno rimanere sempre chiuse altrimenti avrai un continuo apri-chiudi dato dalle minime asperità del terreno, potrai agire solamente a macchina ferma e regolando il tempo del PID abbastanza alto per evitare che i relè si aprano o chiudano per pochissimi istanti accorciandone la vita (soprattutto se relè meccanici) credo che il tempo mimino di apertura chiusura vada settato ad almeno 500mS.

Dino