salve A tutti, gli Arduiniani
dopo qualche mese mi sono cimentato in nuovo proggettino per leggere la temperatuta del motore della moto e indicarla con due led 7seg per ragioni di spazio sul cruscotto.
Girando sul web ho trovato un schema semplice che fa al caso mio ed ancke lo sketch.
Originariamente lo sketch aveva qualche errore che ho eliminato.
Ora lo sketch funziona correttamente con imprecisione di +- 1 ° almeno sul simulatore proteus8.1
Quando misura temperature (es 15° e 16°) li indica come 19 e 18, mentre il 17 torna ad indicarlo corretamente, se imposto una temperatura a 18° rimane ad indicare 17°,
Che una erronea conversione AD di un grado mi sta anche bene ma non che mi indichi un numero sballato. Questa erronea indicazione si ripete per ogni decade dei numeri rappresentati allego qualche foto dove si vede la temp a 44° 45, 46, 47.
ho provaro anche aseguire un suggerimento di usare il Aref per aumentare un po di èpiù la precisione di lettura ma nulla cambia rimene sempre quella indicazione anomala.
Qui di seguito trovate anche lo sketch.
ci sto sbattendo da 1 gg ma non riesco a caprire dove sia l'errrore di conversione o di rappresentazione.
Ho visto anche che ci sono circuiti che utilizzano dei 74hc595 per pilotare i led 7seg in multiplex che andrò sicuramente ad usare ma prima voglio capire, se mi aiutate vi rinhrazio, dov'è l'errore
Un sentito grazie a tutti coloro che mi diano suggerimenti.
int analogPin = A0; // sensore TM36 applicato al analog pin A0
float temp =0;
int val = 0; // variabile di lettura temp
byte seven_seg_digits[10][7] =
{ //seg. a,b,c,d,e,f,g nr
{ 1,1,1,1,1,1,0 }, // = 0
{ 0,1,1,0,0,0,0 }, // = 1
{ 1,1,0,1,1,0,1 }, // = 2
{ 1,1,1,1,0,0,1 }, // = 3
{ 0,1,1,0,0,1,1 }, // = 4
{ 1,0,1,1,0,1,1 }, // = 5
{ 1,0,1,1,1,1,1 }, // = 6
{ 1,1,1,0,0,0,0 }, // = 7
{ 1,1,1,1,1,1,1 }, // = 8
{ 1,1,1,1,0,1,1 }, // = 9
};
void setup()
{
Serial.begin(9600); // setup serial
/*pinMode(0, OUTPUT); //unita a primo led
pinMode(1, OUTPUT); //unita b
pinMode(2, OUTPUT); //unita c
pinMode(3, OUTPUT); //unita d
pinMode(4, OUTPUT); //unita e
pinMode(5, OUTPUT); //unita f
pinMode(6, OUTPUT); //unita g
pinMode(7, OUTPUT); //decine A 2ndo led
pinMode(8, OUTPUT); //decine B
pinMode(9, OUTPUT); //decine C
pinMode(10, OUTPUT); //decine D
pinMode(11, OUTPUT); //decine E
pinMode(12, OUTPUT); //decine F
pinMode(13, OUTPUT); //decine G
*/
DDRD=0b11111111;
DDRB=0b00111111;
//utilizzando l'istruzione analogReference
//indico al convertitore AD che deve impiegare
//la tensione presente sul pin AREF come
//valore di riferimento per la conversione
analogReference(EXTERNAL); // 3.3V
}
void loop()
{
//init variabile
val = 0;
//eseguo un ciclo
for(byte Ciclo = 0; Ciclo<100; Ciclo++)
{
//acquisisco il valore e lo sommo alla
//variabile
val += analogRead(0);
float temp= val;
//questo ritardo serve per dare il tempo
//all' ADC di eseguire correttamente
//la prossima acquisizione
delay(10);
}
//eseguo la media dei 100 valori letti
val /= 100;
//calcolo la temperatura in °C
temp = ((val * 0.003222) - 0.5) / 0.01; // 0.003222 valore di precisione di conversione AD
int pin=0 ; // per i primo 7-seg pins 0,1,2,3,4,5,6 collegati ai pin led posiz. a,b,c,d,e,f,g
int pin1=7; // per 2ndo 7-seg pins 7,8,9,10,11,12,13 collegati ai pin led A,B,C,D,E,F,G
// Serial.println("temperature in C =");
//Serial.println(temp); // debug value
int tempH;//high number
tempH=int(temp/10);
int tempL; //low number
tempL=int(temp-tempH*10);
for(int j=0;j<7;j++)
{
digitalWrite(pin,seven_seg_digits[tempL][j]);
pin++;}
for(int i=0;i<7;i++)
{
digitalWrite(pin1,seven_seg_digits[tempH][i]);
pin1++;}
delay(1000);
}