Buongiorno a tutti, sono un principiante autodidatta di arduino, e sto cercando di realizzare un piccolo progetto di idroponica, e mi trovo a programmare la sonda tds, mi sono ispirato a questa fonte qui Gravity__Analog_TDS_Sensor___Meter_For_Arduino_SKU__SEN0244-DFRobot
per cercare di capirci qualcosa in più l’ho italianizzato, ma nonostante ciò tanti punti ancora mi rimangono oscuri ed eccovi un riassunto di tutto quello che non riesco a capire di queste righe, spero che riusciate ad aiutarmi
#define VREF 5.0
“I convertitori analogico-digitali (ADC) richiedono un ingresso di tensione di riferimento (V REF ) per funzionare correttamente. Gli ADC convertono gli ingressi analogici che possono variare da zero volt fino a un livello di tensione massimo chiamato tensione di riferimento. La tensione di riferimento determina il limite massimo di ciò che l'ADC può convertire ed è essenzialmente il parametro rispetto al quale viene misurata ogni proporzione e risultato. Pertanto, nella scelta di una tensione di riferimento (V REF ) il livello di uscita della tensione e la precisione iniziale sono la prima preoccupazione.”
Se ho capito bene ogni qual volta che a Arduino si collega un sensore analogico bisogna indicare la tensione massima di riferimento, in questo caso 5V, quindi ogni volta che inserirò la sonda nell’acqua ad Arduino arriverà un’onda tonda che varia da 0 a 5 v il quale lui la trasformerà in una onda quadra sempre nel solito range.
Adesso le domande
Qual è la tensione massima che posso dichiarare?
può capitare di avere due convertitori che abbiano due tensioni di riferimento differenti?
E in questo caso come ci comportiamo?
int Array_ValoreAnalogico[SCOUNT]; // memorizzare il valore analogico nell'array, letto da ADC
int Array_ValoreAnalogico_Temp[SCOUNT];
In queste righe dichiariamo due array, una che si chiama Array_ValoreAnalogico e l’altra Array_ValoreAnalogico_Temp, e tra le parentesi quadre è indicato la grandezza di queste array, e in questo caso è indicata dalla variabile SCOUNT.
Però ho provato leggendo e rileggendo il codice a capire quanto vale la variabile SCOUNT, ma non ci sono riuscito, potete aiutarmi a capire anche questo?
int posizione_array = 0,copyIndex = 0;
float averageVoltage = 0,tdsValue = 0,temperature = 25;
in queste righe dichiariamo una serie di variabili con il valore di 0 tranne temperature che vale 25
Serial.begin(115200);
Leggendo e guardando tutorial ho capito che con Serial.begin si dichiara la velocità con cui Arduino dovrà trasmettere dati, ma quasi sempre ho trovato indicato 9600 mentre questa volta si trova una velocità molto più alta, come mai?
Altra domanda, visto il codice d’esempio da cui sono partito che scrive i dati sulla seriale, mentre io li scrivo sul display, questa riga la potrei omettere?
static unsigned long punto_di_campionamento = millis();
In questa riga dichiariamo una variabile dal nome punto_di_campionamento, e gli assegnamo il valore di millis, che è il tempo trascorso dall’accensione di Arduino
Con static si indica una variabile che viene usata in tutta la funzione
mentre con unsigned si indica che la variabile può indicare solo numeri positivi
[color=#859900] if(millis()-punto_di_campionamento > 40U) //ogni 40 millisecondi, leggere il valore analogico dall'ADC[/color]
[color=#859900] {[/color]
[color=#859900] punto_di_campionamento = millis();[/color]
[color=#859900] Array_ValoreAnalogico[posizione_array] = analogRead(Sensore_TDS); //leggere il valore analogico e memorizzarlo nel buffer[/color]
[color=#859900] posizione_array++;[/color]
[color=#859900] if(posizione_array == SCOUNT) [/color]
[color=#859900] posizione_array = 0;[/color]
[color=#859900] }[/color]
Con questo if creo una condizione dove ogni 40 millisecondi memorizzo un dato dal sensore tds, ogni volta che questa condizione è vera, memorizzo il valore nella array Array_ValoreAnalogico, nella posizione indicata dalla variabile posizione_array, che di conseguenza la stessa variabile viene aumentata di uno. Quando posizione_array equivale al valore di SCOUNT posizione_array torna a 0
Su queste righe le domande sono
Cosa indica quella U dopo 40
static unsigned long punto_temporale = millis();
if(millis()-punto_temporale > 800U)//ogni 800 millisecondi
{
punto_temporale = millis();
for(copyIndex=0;copyIndex<SCOUNT;copyIndex++)
Array_ValoreAnalogico_Temp[copyIndex]= Array_ValoreAnalogico[copyIndex];
averageVoltage = getMedianNum(Array_ValoreAnalogico_Temp,SCOUNT) * (float)VREF / 1024.0; // leggere il valore analogico più stabile dall'algoritmo di filtraggio mediano e convertirlo in valore di tensione
float compensationCoefficient=1.0+0.02*(temperature-25.0); //formula di compensazione della temperatura: fFinalResult (25 ^ C) = fFinalResult (corrente) / (1.0 + 0.02 * (fTP-25.0));
float compensationVolatge=averageVoltage/compensationCoefficient; //temperature compensation
tdsValue=(133.42*compensationVolatge*compensationVolatge*compensationVolatge - 255.86*compensationVolatge*compensationVolatge + 857.39*compensationVolatge)*0.5; //convert voltage value to tds value
lcd.home();
lcd.print("TDS Value= ");
lcd.print(tdsValue,0);
lcd.println("ppm");
}
}
A questo punto del codice vado un po’ più a intuito, ho capito che tramite un’altra condizione che avviene ogni 800 millisecondi attiviamo un ciclo in cui viene inserito altri dati in alcune array, e vengono fatti una serie di calcoli dove il risultato finale è il tdsvalue (vi giuro sono andato a cercare su internet ma non c’ho capito molto di più) e lo stampo sul display
Adesso veniamo alla parte per me più incomprensibile
int getMedianNum(int bArray[], int iFilterLen)
{
int bTab[iFilterLen];
for (byte i = 0; i<iFilterLen; i++)
bTab[i] = bArray[i];
int i, j, bTemp;
for (j = 0; j < iFilterLen - 1; j++)
{
for (i = 0; i < iFilterLen - j - 1; i++)
{
if (bTab[i] > bTab[i + 1])
{
bTemp = bTab[i];
bTab[i] = bTab[i + 1];
bTab[i + 1] = bTemp;
}
}
}
if ((iFilterLen & 1) > 0)
bTemp = bTab[(iFilterLen - 1) / 2];
else
bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
return bTemp;
}
Alla fine di tutto il codice, addirittura dopo il loop mi trovo tutta queste serie di calcoli, mi sapete dire che funzione abbiano?
In passato mi è capitato di scrivere qualcosa dopo il loop, ma andava dichiarata un nuovo void, in questo caso non è stato fatto niente di tutto ciò ... come mai?
Vi sono molto grato se mi aiutate a capire tutta questa roba, sia per la realizzazione del mio progetto sia per la mia crescita nel mondo di Arduino, vi ringrazio ancora tantissimo