Tempo On e Tempo Off in base a massimo e minimo segnale analogico.

Salve, ho interfacciato un manometro ad Arduino su A0. Il segnale d'ingresso permette di leggere il corretto intervallo d'esercizio in funzione della pressione registrata nell'impianto.

Devo stampare a display il tempo che impiega il motore a far passare la pressione da min a max (tempo On) e il suo contrario tempo Off.

I valori di pressione non sono perfettamente stabili e non sono fissi nel lungo periodo. (variazione ogni quattro cinque mesi a seconda del prodotto lavorato). Il minimo non corrisponde a 0 bar ma alla pressione decisa dall'operatore.

Per il momento sono riuscito ad acquisire l'equivalente 10bit dell'escursione massima 0-5V emessa dal Manometro.

Mi potreste aiutare a capire come devo fare per far riconoscere i valori di picco min e max e a calcolare il tempo che impiega a raggiungerli a salire e a scendere? Grazie

1) potresti per favore postare il codice, così da avere un idea? 2) hai qualche idea di possibile "grafico"? Es. Posso conoscere massimo e minimo desiderati?(io stabilisco che massimo é 4,8V e minimo 1,5V, quindi aspetto soltanto di misurarli). Oppure so che sono arrivaro al massimo o al minimo se la lettura non varia per tot volte, o se inverte il suo andamento? Cioé come riconosco se sono al massimo/minimo? 3) per tempi lunghi (più di un ora) o se ti serve precisione é necessario munirsi di un RTC, non fidarti di millis() 4) di quanto tempo dispini per completare il progetto?

Ciao, ci provo:

  1. il codice lo posto, ma ancora non contiene nulla in merito alla valutazione dei massimi proprio perchè brancolo nel buio;
    2)allego il grafico, il segnale a 0 bar fornisce 0v, circa 4,7v a 10bar, ipoteticamente il fondoscala è 11 bar ma la pompa è tarata più bassa.
    le pompe (ne funziona 1 per volta alla settimana e poi vengono scambiate) mantengono la pressione entro una forchetta di 2bar l’impianto prevede pompe ON a circa 8 bar e OFF a circa 10.
    le due pompe non sono propriamente identiche e le pressioni come pure i tempi non sono coincidenti possono variare anche di 0.5 bar e nei tempi anche più di un minuto di differenza in ON.
  2. suppongo che la rilevazione nella peggiore delle condizioni possa concludersi in max 10 min.
  3. considerando che ho ordinato uno schermo tft a colori in cina, nella speranza di poter indicare con delle icone le pompe e con i colori rosso e verde lo stato di funzionamento oltre ovviamente a visualizzare i tempi di transizione da ON a OFF e viceversa, credo un mesetto e più di tempo ce l’ho.
#include <LiquidCrystal.h> 

LiquidCrystal lcd (12, 11, 5, 4, 3, 2) ; 
int manometro = 0 ;
int value = 0 ;

void setup() 
{
 Serial.begin(9600);

}

void loop() 
{
  lcd.begin(16, 2);
  value= analogRead(manometro);
  lcd.print(value);
  delay(1000);

}

Poche domande, come mio solito, per mettere a fuoco 1) tu hai gia un impianto con 2 pompe? questo implica che hai anche pressostati e teleruttori per agganciare e sganciare le pompe, perchè non ti puoi attaccare ad un contatto ausiliario di questi? sarebbe ben più semplice che mettere apposta un trasmettitore di pressione (che non sai usare) 2) sappi che il massimo è quando un valore che tieni costantemente sotto controllo comincia a scendere, il miniomo quando il valore comincia a salire, ovvero il massimo è quando si "spegne" la pompa, il minimo quando si "accende", due sensori di corrente del tipo che consigliamo per gli impianti di monitoraggio della potenza domestica e sei a posto, anche per la parte sicurezza, oppure usi i contatti ausiliari dei teleruttori delle pompe, anche li sei a posto per la parte sicurezza 3) scusa ma le tue misure non tornano, in una misura 4-20 mA se il massimo è circa 5 volt, lo zero deve essere circa 1, non ci sono alternative. Da questo consegue che NON stai misurando correttamente. Studia bene la questione delle misure in 4-20 mA, oppure non ne esci più 4) scusa, ma tu nell'altra discussione hai "scoperto" (perchè te lo hanno detto) che le misure di arduino sono in "scala" da 0 a 1023 per indicare da 0 a 5 volt, e qui NON ne hai tenuto conto? male, mi limito a dire, male E adesso i consigli: 1) studia bene la teoria delle misure 4-20 mA 2) scrivi un programma che legge e converte correttamente la misura prima in tensione e poi in bar 3) oppure direttamente in bar, ma tieni a mente come "regolare" le costanti" di conversione (sì, costantI, sono due, non una) 3) scrivi un programma che legge a intervalli la pressione, e trova autonomamente il massimo e il minimo se vai a avanti a passi piccoli ci riesci e capisci costa stai facendo....

Ok mi sarei aspettato un aiuto più che un consiglio, ma va bene lo stesso. Purtroppo sono arrivato a chiedere sul forum per supplire le mie mancate conoscenze su Arduino e la sua programmazione. Le pompe sono presenti ed hanno il loro sistema di controllo, il dispositivo che devo realizzare verrà messo in remoto dove é impossibile da ottenere quelle informazioni già esistenti avendo a disposizione una sola derivazione dell'impianto in pressione. Hai ragione a 4 mA ho circa 1v e non 0 come questa notte assonnatamente ho scritto. Per il punto 4 nel disegno della curva che ho allegato si vede che la suddivisione in bit é tenuta in considerazione. L'imprecisione con cui mi rivolgo a voi é frutto si di mancata conoscenza, ma anche della volontà di acquisirla. Seguirò il consiglio sull'altro tuo post e proverò a cercare informazioni similari sul forum che mi permettano di risolvere. Grazie lo stesso.

Aspetta, giusto per saperlo, così la prossima volta so cosa dire... che risposta si aspetta (seriamente) uno che ti dice di non aver il tempo per capire? e poi, l'aiuto lo hai avuto, sotto forma di spiegazione per come collegare il trasmettitore di pressione per qualcosa di più, ti avevo fatto una domanda, hai evitato di rispondere.... quando poi ti sei degnato di dare quelle info le hai date sbagliate.... io sono più che disposto ad aiutarti, ma non è che dobbiamo tirarti fuori le informazioni con la pinza... spiega bene che cosa vuoi fare e che cosa hai a disposizione che il quadro elettrico non è accessibile lo hai detto adesso, potevi dirlo prima... se tu hai poco tempo per capire non è che noi, io in particolare, devo spendere il mio per indovinare quello che non dici tu

Ok, non credo di aver mai detto o lasciato pensare quello che stai indicando, tuttavia se é così, ho dato un’impressione sbagliata e me ne scuso.
Rileggerò con calma i post e vedrò come meglio rispondere affinché sia più chiaro il tutto in modo da non suscitare inutili animosità.

-2 pompe messe in funzione alternativamente con un intervallo settimanale. Le pompe non sono identiche ma tarate approssimativamente per la stessa pressione max e min. Cambiando pompa cambiano i tempi necessari a compensare.

-non é possibile utilizzare altri metodi di rilevazione.

-l'intervallo letto su monitor seriale per ingresso A0 é max 897; min 785 (10.06 bar; 8.47bar)

-il "colpo d'ariete" alla partenza e allo stop repentino della pompa provoca per una decina di secondi la lettura dei picchi di pressione contrari a quello che é l'andamento. Interrompendo la linearità a salire o se in off a scendere.

-il tempo On della pompa per passare da 8.47 bar a 10.06 bar é 1min e 09 secondi. (preso manualmente al cronometro)

-il tempo che impiega la rete in Off per passare da 10.06 bar (897 A0) e 9.47 bar (785 A0) é di 2'32". Preso manualmente come sopra.

Devo ottenere: 1) Tempo On 2) Tempo Off

Se fosse possibile ottenere aiuto ve ne sarei grato. Saluti

siamo messi male con un colpo d'ariete da 10 secondi diventa dura avere una risoluzione da meno di 10 secondi che risoluzione ti serve?

In dieci secondi i picchi di pressione che legge saranno 4 o 6 ho provato con delay a 3000 sembra sopperire abbastanza ma preferirei un frazionamento di almeno una lettura a secondo Alle volte I picchi si verificano anche oltre i 10 secondi dalla commutazione...

guarda, la maniera classica sarebbe quella di fare le media della lettura per un tempo sufficente ad escludere picchi o similia se hai picchi che durano anche oltre i 10 secondi non puoi scendere sotto i 10 secondi di risoluzione io altre strade non ne vedo

Non ho picchi di 10s e oltre, ma 4 o 5 picchi di un paio di secondi al massimo nell'intervallo di 10s. Sto guardando in giro come fare per la media... Come hai modo di capire non sono molto ferrato

Riusciresti a fornire una trentina di secondi di dati grezzi letti dall'ADC centrati sul momento in cui avvengono i picchi? Magari leggendo cinque campioni al secondo in modo regolare (tot 150 valori)?

Tempo permettendo mi piacerebbe graficare i dati reali e vedere la differenza tra media semplice, media mobile e filtro smooth triangolare, tutte cose semplici da implementare con un piccolo array di letture.

Magari…Allego un po’ di dati con delay a 200, un grafico preso dal plotter seriale e un log a delay 20 del monitor.

ValoriDelay200.txt (3.85 KB)

ValoriTempiManometro.txt (181 KB)

Perdonate la sciocchezza, ma se non ci fossero stati i picchi sarebbe bastata la funzione min e max per calcolare gli estremi? E se si come avrei potuto far capire i tempi per le due posizioni?

E nel qual caso, utilizzando un algoritmo per orientare correttamente tutti i dati in una matrice é possibile stabilire il massimo e il minimo raggiunto dai valori acquisiti e quindi ottenere la differenza dei tempi di intervallo off e on?

Ultimamente io me la canto e me la suono pure...

Nikitaspy:
un po’ di dati con delay a 200

Speravo di vedere i picchi centrati nel grafico invece che agli estremi, ma in basso a destra qualcosa si vede lo stesso. Questo è quello che viene fuori, in grigio i dati grezzi, in rosso una media mobile su 21 punti, in blu uno smooth triangolare su 21 punti. Praticamente uguali, solo che la media mobile è banale da scrivere mentre lo smooth è decisamente più macchinoso. Da quello che vedo per smorzare i picchi bisogna prendere dentro almeno quattro secondi di campioni (20 punti a 5 campioni al secondo). È normale che i valori della media siano in ritardo di un paio di secondi sui valori reali. In pratica si passerebbero le letture dell’ADC al calcolo della media e si prenderebbe come misura effettuata il valore della curva rossa.

pressione-01.png

Per la media mobile basta un array da N elementi, con indice che ruota circolarmente da 0 a N-1, a cui si scrive l’ultimo valore letto. In questo modo ogni nuovo valore letto va a sovrascrivere quello più vecchio e nell’array abbiamo sempre gli ultimi N valori. Poi somma di tutti i valori e divisione per N.

Ti ringrazio molto specie per il tempo che mi hai dedicato. 4 secondi non sono un'enormità, ma non sono nemmeno pochi riguardo i tempi per la fase on.

Stavo informandomi girovagando con Google, anche sulla fattibilità di portare in Arduino un algoritmo che su C più comune, dispone nel giusto verso i valori non orientati di un vettore. in quel caso avrei la precisione necessaria anche se a discapito di una curva d'apprendimento (la mia) sicuramente più ripida... :-) Sapresti darmi una dritta in tal senso? Grazie mille.