Ho caricato questo codice, del voltmetro, senza la parte di librerie e pin riconducibili a tali.
#define Vref 5.0 /* calibrazione della tensione di riferimento delle misure */
/*
siccome Arduino legge in entrata al massimo 5 v, devo dividere con un partitore di tensione la Vin.
Per fare ciò utilizzo una Ra = 681 k Ohm 1% e una Rb = potenziometro multigiro 200 k Ohm.
*/
/*
Vin(max) viene calcolata con Vout(max) / (Rb / (Ra + Rb)). Quindi coef = (Ra + Rb) / Rb.
Ma siccome Ra è fisso, basta inserire il valore di Rb.
*/
#define Ra1 680000 /* valore in Ohm di Ra1. 681 k Ohm 1% */
#define Rb1 200000 /* valore in Ohm di Rb1. potenziometro multigiro 200 k Ohm */
#define Ra2 680000 /* valore in Ohm di Ra2. 681 k Ohm 1% */
#define Rb2 200000 /* valore in Ohm di Rb2. potenziometro multigiro 200 k Ohm */
#define Ra3 680000 /* valore in Ohm di Ra3. 681 k Ohm 1% */
#define Rb3 200000 /* valore in Ohm di Rb3. potenziometro multigiro 200 k Ohm */
#define Ra4 680000 /* valore in Ohm di Ra4. 681 k Ohm 1% */
#define Rb4 200000 /* valore in Ohm di Rb4. potenziometro multigiro 200 k Ohm */
float coef[4] = {((Ra1 + Rb1) / Rb1), ((Ra2 + Rb2) / Rb2), ((Ra3 + Rb3) / Rb3), ((Ra4 + Rb4) / Rb4)}; /* array di valori fissi dati dalle resistenze di ogni canale. */
float Vanalog[4] = {0.00, 0.00, 0.00, 0.00}; /* array di valori di tensione, convertiti in analogico tra 0 e 5 v. i valori sono a 2 cifre decimali. */
float VanalogMAX[4] = {0.00, 0.00, 0.00, 0.00}; /* array di valori di tensione massimi, convertiti in analogico tra 0 e 5 v. i valori sono a 2 cifre decimali. */
#define Sample 32 /* numero dei campionamenti */
#define Channel 4 /* numero dei canali */
int CH[4] = {18, 19, 20, 21}; /* array che per elementi ha i numeri dei pin per richiamare i pin analogici su Arduino Pro Micro. */
int Vdigital[4] = {0, 0, 0, 0}; /* array di valori di tensione, convertiti in digitale tra 0 e 1023. i valori sono interi. */
int VdigitalMAX[4] = {0, 0, 0, 0}; /* array di valori di tensione massimi, convertiti in digitale tra 0 e 1023. i valori sono interi. */
void readCH(byte n){
unsigned int Somma; /* variabile che contiene la somma di tutti i campionamenti (1023 * 32 = 32736 al massimo) */
byte varSample; /* variabile del campionamento */
for (varSample <= (Sample - 1); varSample++;){ /* ciclo for per i campionamenti, da 0 a 31, quindi 32 campionamenti */
Somma += analogRead(CH[n]); /* ad ogni ciclo aggiungi una lettura */
}
Vdigital[n] = Somma / Sample; /* salva nell'array la media dei campionamenti */
Somma = 0; /* uscito dal ciclo for azzera la sommatoria per il prossimo richiamo della funzione */
varSample = 0; /* uscito dal ciclo for azzera la variabile da 0 a 31 per il prossimo richiamo della funzione */
}
void detectMAX(){
for (byte varCH = 0; varCH < (Channel - 1); varCH++){ /* ciclo for per i canali */
if(Vdigital[varCH] > VdigitalMAX[varCH]){ /* if per trovare il valore più alto */
VdigitalMAX[varCH] = Vdigital[varCH]; /* se trovo un valore più alto del precedente lo salvo al posto del precedente */
}
}
}
#define KeyboardPin A10 /* pin lettura tastiera */
byte varKeyboard = 0; /* variabile byte che contiene il valore della lettura del pin anallogico della tastiera */
bool select = false; /* variabile booleana per il pulsante select */
bool reset = false; /* variabile booleana per il pulsante reset */
void keyboard(){
varKeyboard = analogRead(KeyboardPin); /* lettura del pin analogico della tastiera */
if (varKeyboard > 767){select = true;} /* se la lettura è maggiore del valore, allora il pulsante select è premuto e la variabile booleana è true */
else {select = false;} /* in caso contrario la variabile booleana è false */
if(varKeyboard < 767 && varKeyboard > 255){reset = true;} /* se la lettura è minore del valore e allo stesso tempo maggiore di 255, allora il pulsante reset è premuto e la variabile mooleana è true */
else {reset = false;} /* in caso contrario la variabile booleane è false */
}
byte varMAX = 0; /* variabile che contine il numero del canale in base a quante volte schiaccio il tasto select */
void resetMAX(){
if (select){varMAX++;} /* se select è true, aggiungi un valore alla variabile varMAX */
for (varMAX; varMAX <= (Channel - 1);){ /* ciclo for, finché la variabile è minore o uguale del numero dei canali */
if (reset){VdigitalMAX[varMAX] = 0;} /* se reset è true, azzera l'elemento dell'array della tensione digitale corrispondente al canale selezionato */
}
varMAX = 0; /* azzera la variabile */
}
void conversionDA(byte n){
Vanalog[n] = ((Vref * Vdigital[n]) / 1023) * coef[n]; /* conversione tensione da digitale intero ad analogico decimale, da 0 a 22 Volt */
VanalogMAX[n] = ((Vref * Vdigital[n]) / 1023) * coef[n]; /* conversione tensione MAX da digitale intero ad analogico decimale, da 0 a 22 Volt */
}
void setup() {
Serial.begin(9600);
pinMode(18, INPUT);
pinMode(19, INPUT);
pinMode(20, INPUT);
pinMode(21, INPUT);
pinMode(A10, INPUT);
}
void loop() {
readCH(0);
readCH(1);
readCH(2);
readCH(3);
detectMAX();
keyboard();
resetMAX();
conversionDA(0);
conversionDA(1);
conversionDA(2);
conversionDA(3);
Serial.print("varKeyboard: "); Serial.print(varKeyboard); Serial.print(" select: "); Serial.print(select); Serial.print(" reset: "); Serial.print(reset); Serial.print(" varMAX: "); Serial.println(varMAX);
}
Non funziona.
Ma se nella sezione loop scrivo soltanto:
void loop() {
Serial.print("varKeyboard: "); Serial.print(varKeyboard); Serial.print(" select: "); Serial.print(select); Serial.print(" reset: "); Serial.print(reset); Serial.print(" varMAX: "); Serial.println(varMAX);
}
Mantenendo inalterato il resto del codice, la comunicazione avviene correttamente.