Confronto valori tra più ingressi analogici

Ciao ragazzi, mi trovo in difficoltà con un progetto che sto realizzando.
Sto costruendo un sistema di accumulo in batteria al litio da 18 kWh ( si avete capito bene, non ho sbagliato a scrivere).
Tutta la parte di acquisizione dati è ok funziona già da un po'.
Lavora su 5 schede Arduino con connessione LAN e protocollo UDP interfaccia a schermo touch Nextion da 7 pollici.
Chiedo ora il vostro aiuto perchè questa funzione non l'ho trovata da nessuna parte e francamente non so se si possa fare (premetto che la parola impossibile non è da me contemplata).
Veniamo al dunque: Dal pacco batterie rilevo la tensione di ogni singola batteria tramite un voltmetro a partitore di tensione (poi se trovo qualcosa di più preciso meglio) e quindi ogni ingresso rileva una tensione.
Dovrei prendere questi valori ed individuare quale ingresso ha il valore istantaneo più basso.
a questo ingresso associo un uscita che piloterà la corrente di ricarica.
Non posto alcun codice perchè al momento non so proprio come fare e quindi non ho ancora scritto niente.

  • Leggi il primo e metti il valore in min
  • Leggi il secondo: se è minore di min metti il valore in min
    ...

In pratica prendo il primo ingresso, lo confronto con il secondo poi il risultante con il terzo e cosi via. alla fine dovrebbe restarmi la variabile più bassa.
Grazie ci proverò.

Ho guardato le specifiche della programmazione: "min" restituisce il valore più basso nel confronto tra due valori e non va bene.
A me serve sapere quale ingresso ha il valore più basso, non il valore più basso di tutti gli ingressi.
Esempio:
io ho 4 ingressi A0,A1,A2,A3. A3 ha il valore più basso, confronto A0 con A1 con "min"
Variabile 1 = min (A0,A1), mi da ipotesi A1 il risultato sarà che variabile 1 avrà il valore di A1 ma non so più a che ingresso si riferisce.

Ciao.

risultato = 0;
Variabile  = min (A0,A1);
if (Variabile  =  A1) {risultato = 1;}
Variabile  = min (Variabile,A2);
if (Variabile  =  A2) {risultato = 2;}
Variabile  = min (Variabile,A3);
if (Variabile  =  A3) {risultato = 3;}
// lo stesso per A4 e A5, alla fine il risultato conterrà il numero di porta

Saluti

Dai su un po' di impegno, questo è uno dei primi algoritmi che si inizia a studiare :wink:

Scherzi a parte, il principio di funzionamento è quello già descritto da @Datman
Per sapere quale è l'ingresso associato al valore potrebbe essere una buona soluzione usare un array per i tuoi ingressi analogici, o ancora meglio un'array di struct che "rappresenta" il tuo ingresso analogico singolo cosi una volta trovato l'indice corrispondente al valore minimo hai accesso immediato a tutte le proprietà della struct che possono tornarti utili.

Un esempio simulabile: FindMinAnInput.ino - Wokwi ESP32, STM32, Arduino Simulator

Sì, in effetti avevo scritto come trovare il valore minimo, ma è simile...
Nota: per min intendevo una variabile!

  • Leggi il primo, metti il valore in minimo e m=1;
  • Leggi il secondo: se è minore di minimo metti il valore in minimo e m=2;
  • Leggi il terzo: se è minore di minimo metti il valore in minimo e m=3;
    ...

Si ragazzi mi cospargo il capo di cenere subito ho pensato non andasse proprio dopo però pensandoci su con un ciclo "if" poteva andare.
Ora però diventa più difficile perchè devo capire come discriminare gli altri ingressi.
In pratica si tratta di un BMS dinamico ( ce ne sono in giro ma non con queste potenze).
La parte misuratori ( che è un altro Arduino ) trasmette i valori di potenza a questa board tramite UDP, questa board attiva in base ai valori che arrivano uno o più uscite.
Non attiva però delle uscite fisse ma deve attivare quelle corrispondenti agli ingressi con tensione piu basse. E' come arrivasse un carico di panini, ne arriva uno lo dai a quello che ha più fame, ne arrivano 5 cominci da quello che ha più fame poi a quello che ne ha un po meno e così via.
Per ora ho sfamato il primo, ora resta capire come fare con gli altri.
Io purtroppo vengo dalla termotecnica la parte informatica l'ho studiata da autodidatta e molto su PLC che è tutta un altra cosa.
Grazie per l'aiuto
Direi che per ora è risolto.

L'esempio di @cotestatnt è un ottimo punto di partenza. Metti le tensioni dentro l'array e poi scorrendolo vedi quali uscite attivare.

Volendo non serve nemmeno un array

Un minimo di pensiero laterale:

Due variabili, contengono il minimo e il pin corrispondente

I pin che comandano la carica sono in offset rispetto a quelli della misura

Al termine della scansione degli ingressi alzi il pin corrispondente al pin di ingresso trovato...

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.