Salve a tutti sto facendo un progetto nel quale ho la necessità di leggere un partitore resistivo tramite l'ATTINY85 e inviare all'esterno 3 bit tramite 3 piedini in modo da avere il codice binario delle 8 posizioni del partitore.
Il partitore è costituito da 7 resistenze da 2.2k e 1 da 4.7k, in più è presente una resistenza aggiuntiva di 47k che collega l'analog in a massa come suggerito in un altro post.
L'attiny è alimentato a 3.3V e facendo un rapido calcolo ottengo le seguenti tensioni e valori analogici come soglie :
Dove il Quanto è la tolleranza che offro al valore letto per essere riconducibile ad un determinato livello.
Una volta programmato l'attiny e inserito nel progetto noto che le tensioni sul pin analogico rispecchiano quelle in tabella ma le usciite si fermano al 5 valore anche se seleziono quelli successivi. Quindi anche se posiziono il partitore sull'8 valore, in uscita dall'attiny avrò sempre il codice binario 100 invece di 111.
Le saldature sembrano fatte bene e non dovrebbero esserci corti poiché sull'analog in leggo le tensioni cosi come in tabella.
Non credo di aver sbagliato il codice perchè è praticamente identico ad un progetto che avevo fatto con arduino a 5V, lo allego di seguito :
#define RED 2
#define YELLOW 1
#define GREEN 0
int BUTTON = A2;
//Valore posizione pulsante :
int oldPuls;
int newPuls;
//Valori soglie pulsanti
int V_puls1 = 993;
int V_puls2 = 847;
int V_puls3 = 716;
int V_puls4 = 598;
int V_puls5 = 490;
int V_puls6 = 381;
int V_puls7 = 288;
int V_puls8 = 186;
//Tolleranza per la soglia che non sarà perfettamente V_pulsn ma leggermente diversa
int dev = 30;
//int contatore = 0; // il contatore varia da 0 a 7 (8 variazioni)
int Val_1=0; //variabile lettura pin analogico
int diff =0; //differenza tra oldPuls e newPuls
void setup() {
// put your setup code here, to run once:
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
pinMode(BUTTON, INPUT);//ingresso analogico
}
void loop() {
//Val_1 = 0;
Val_1 = analogRead(BUTTON); //leggo il valore del pin anologico BUTTON
//confronto tale lettura con i valori in memoria e assegno alla variabile
//newPuls il valore corrente
LeggiPulsante();
switch (newPuls) {
case 0:
//tutti spenti
write_leds(LOW, LOW, LOW);
break;
case 1:
//Valore 1 (001)
write_leds(LOW, LOW, HIGH);
break;
case 2:
//valore 2 (010)
write_leds(LOW, HIGH, LOW);
break;
case 3:
//valore 3 (011)
write_leds(LOW, HIGH, HIGH);
break;
case 4:
//valore 4 (100)
write_leds(HIGH, LOW, LOW);
break;
case 5:
//valore 5 (101)
write_leds(HIGH, LOW, HIGH);
break;
case 6:
//valore 6 (110)
write_leds(HIGH, HIGH, LOW);
break;
case 7:
//valore 7 (111)
write_leds(HIGH, HIGH, HIGH);
break;
}
}
void write_leds(byte state1, byte state2, byte state3) {
//modifica le porte dei 3 LED
digitalWrite(RED, state1);
digitalWrite(YELLOW, state2);
digitalWrite(GREEN, state3);
}
void LeggiPulsante(){
Val_1 = 0;
Val_1 = analogRead(BUTTON); //leggo il valore del pin anologico BUTTON
//confronto tale lettura con i valori in memoria e assegno alla variabile
//newPuls il valore corrente
if((Val_1 <=(V_puls1 + dev)) && (Val_1 >(V_puls1-dev)))
newPuls =0;
if((Val_1 <=(V_puls2 + dev)) && (Val_1 >(V_puls2-dev)))
newPuls =1;
if((Val_1 <=(V_puls3 + dev)) && (Val_1 >(V_puls3-dev)))
newPuls =2;
if((Val_1 <=(V_puls4 + dev)) && (Val_1 >(V_puls4-dev)))
newPuls =3;
if((Val_1 <=(V_puls5 + dev)) && (Val_1 >(V_puls5-dev)))
newPuls =4;
if((Val_1 <=(V_puls6 + dev)) && (Val_1 >(V_puls6-dev)))
newPuls =5;
if((Val_1 <=(V_puls7 + dev)) && (Val_1 >(V_puls7-dev)))
newPuls =6;
if((Val_1 <=(V_puls8 + dev)) && (Val_1 >(V_puls8-dev)))
newPuls =7;
}
Ringrazio chiunque possa aiutarmi.