Letture analogiche

Buongiorno a tutti. Mi è capitato e continua tutt'oggi che leggendo più ingressi analogici i valori si sballano.
Se leggo solo una temperatura il tutto funziona perfettamente, ma se provo a inserire nello sketch anche la lettura di una tensione
la temperatura si sballa anche di diversi gradi... qualcuno sa dirmi il perchè?
Grazie

Il codice è corretto ?
verifica.

davideanubi:
Buongiorno a tutti. Mi è capitato e continua tutt'oggi che leggendo più ingressi analogici i valori si sballano.
Se leggo solo una temperatura il tutto funziona perfettamente, ma se provo a inserire nello sketch anche la lettura di una tensione
la temperatura si sballa anche di diversi gradi... qualcuno sa dirmi il perchè?
Grazie

Se le letture le fai sequenzialmente devi mettere sempre una lettura "a perdere" quando cambi pin perché l'ADC utilizza la prima lettura per riallineare il MUX interno.

Quindi fai sempre:

int tempLett = analogRead(PIN);
int lettura = analogRead(PIN);

Ne sei sicuro. In tutti gli esempi dove si utilizza un accelerometro tipo MMA7361 (esempio o qualsiasi sensore multi canale) non è c'è questa lettura a perdere. Pure io leggevo/leggo i dati dall'accelerometro su tre pin diversi senza l'utilizzo della lettura a perdere.

gcam:
Ne sei sicuro. In tutti gli esempi dove si utilizza un accelerometro tipo MMA7361 (esempio o qualsiasi sensore multi canale) non è c'è questa lettura a perdere. Pure io leggevo/leggo i dati dall'accelerometro su tre pin diversi senza l'utilizzo della lettura a perdere.

Non è il primo che lamenta di questo problema. Sul datasheet c'è scritto che in free running mode la prima lettura su un nuovo canale riflette la lettura fatta sul precedente canale. Ora non so se il core di Arduino setta l'ADC in free running mode o no, però io metto sempre una serie di 3/5 letture sullo stesso pin e poi conservo l'ultima oppure faccio la media delle ultime.

Ma io da qualche parte ho sentito che é un problema di hardware. Ovvero dicono di inserire in serie una resistenza da 10 kohm e un condensatore a massa.
Letti individualmente i valori sono giusti ma se provo tutti e due mi da noie quindi il codice è giusto.

davideanubi:
Letti individualmente i valori sono giusti ma se provo tutti e due mi da noie quindi il codice è giusto.

Hai provato come ti ho detto oppure no?

Ma non capisco cosa intendi per lettura a perdere....io in sequenza ho... anzi ti posto il codice che facciamo prima...

#include <SPI.h>
#include <Ethernet.h>
int PIN_TEMP=0; //Assegniamo alla variabile il pin di ingresso analogico scelto
int temp; //Dichiariamo la variabile che conterrà il valore della temperatura
int pianoT=5;
int stato;

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,1, 177 };
EthernetServer server(80);
String query;

void setup()
{
query = String("");
Ethernet.begin(mac, ip);
server.begin();
pinMode(5,OUTPUT);
}
void loop()
{
stato=analogRead(pianoT);

temp= analogRead(PIN_TEMP)*0.5;//Assegniamo alla variabile temp il valore restituito dalle lettura del pin 0

delay(100); //Aspettiamo 100 mS prima di leggere un nuovo valore

EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
char c = client.read();
query.concat(c);
if (c == '\n') {
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println();

client.print("");
client.print("");
client.print("");
client.print("");
client.print("<link href='http://code.jquery.com/mobile/1.2.0/jquery.mobile-1.2.0.min.css'rel='stylesheet'type='text/css'/>");
client.print("");
client.print("");
client.print("");

//PRIMA PAGINA
client.print("");
client.print("<div data-role='page' id='home'data-theme='a'>");
client.print("

My Home

");
client.print("
");//APRO IL CONTENUTO

client.print("

");
client.print("

Temperatura Garage

");
client.print(" La Temperatura Attuale e di ");
client.print(temp);
client.print("&#176");
client.print("C");
client.print("
");

//APRO IL CONTENUTO PIEGHEVOLE
client.print("

");
client.print("

Cancello

");
client.print("<a href='accendi5'data-role='button'data-inline='true'>ON");
if (query.indexOf("accendi") > 0) {
digitalWrite(5,HIGH);
}

client.print("<a href='spegni5'data-role='button'data-inline='true'>OFF");
if (query.indexOf("spegni") > 0) {
digitalWrite(5,LOW);
}
client.print("

");
//CHIUDO IL CONTENUTO PIEGHEVOLE

//APRO IL SECONDO CONTENITORE PIEGHEVOLE
client.print("

");
client.print("

Garage

");
client.print("<a href='accendi5'data-role='button'data-inline='true'>ON");
client.print("<a href='spegni5'data-role='button'data-inline='true'>OFF");
client.print("
");//CHIUDO IL SECONDO CONTENITORE PIEGHEVOLE

//APRO IL TERZO CONTENITORE PIEGHEVOLE
client.print("

");
client.print("

Ingresso

");
client.print("<a href='accendi5'data-role='button'data-inline='true'>ON");
client.print("<a href='spegni5'data-role='button'data-inline='true'>OFF");
client.print("
");//CHIUDO IL TERZO CONTENITORE PIEGHEVOLE

client.print("

");
client.print("

Controllo Inserimenti

");
client.print("Stato Piano Terra");
client.print(" ");
client.print("'");
if(stato>=1023){
client.print("Inserito");
}
else{
client.print("disinserito");
}
client.print("'");

client.print("

");

client.print("

");//CHIUDO IL CONTENUTO DELLA PAGINA
//FONDO PAGINA
client.print("
");
client.print("

Tecnica Impianti

");
client.print("
");
client.print("");
//FINE PAGINA UNO

client.print("");
client.print("");

break;//fermo il ciclo
}
}
}
delay(1);
client.stop();
query = String("");
}
}

davideanubi:
Ma non capisco cosa intendi per lettura a perdere....

Più che metterti l'esempio... :*

leo72:
Se le letture le fai sequenzialmente devi mettere sempre una lettura "a perdere" quando cambi pin perché l'ADC utilizza la prima lettura per riallineare il MUX interno.

Quindi fai sempre:

int tempLett = analogRead(PIN);
int lettura = analogRead(PIN);

Comunque nel tuo codice non vedo il cambio di canale analogico.
Leggi sempre pianoT, che è inizializzato a 5 nel setup e poi mai più cambiato.
Dov'è che cambieresti pin analogico, scusa?

scusa ma non riesco proprio a seguire quello che dici.....sono un novellino quindi ti devi esprimere al mio livello

davideanubi:
scusa ma non riesco proprio a seguire quello che dici.....sono un novellino quindi ti devi esprimere al mio livello

Trasforma il tuo codice in:

stato=analogRead(pianoT);
stato=analogRead(pianoT);
temp= analogRead(PIN_TEMP)*0.5;
temp= analogRead(PIN_TEMP)*0.5;

e poi dimmi se risolvi.

cavolo ho risolto..... ti ringrazio veramente..... non avevo proprio capito di raddoppiare la lettura in questo modo.... mi spieghi con parole terrene perchè cosi funziona?

leo72:
Se le letture le fai sequenzialmente devi mettere sempre una lettura "a perdere" quando cambi pin perché l'ADC utilizza la prima lettura per riallineare il MUX interno.

Internamente al microcontrollore c'è un unico convertitore analogico/digitale che fa la conversione di una lettura di tensione in un valore numerico. L'ADC è multiplexato in ingresso: per leggere su più canali c'è un circuito che switcha da un pin analogico all'altro. Il problema è che passando da un canale al successivo il convertitore mantiene in memoria la lettura del canale precedente per cui la prima lettura dopo un cambio di canale va fatta sempre a perdere.

adesso ho capito.... quindi ogni volta che aggiungerò una lettura di qualsiasi cosa devo necessariamente eseguire queste letture a vuoto per ogni pin...
bene ora è tutto chiaro... ti ringrazio...
Se ti capita prova il mio sketch e dimmi se ti piace, l'ho fatto con jqueryMobile che si adatta a qualunque schermo.
Naturalmente con internet Explorer fa schivo ma con gli altri browser è una figata..
Grazie ancora..

Non me ne intendo di web. Cosa sarebbe, in pratica? Un server a cui ti colleghi per farci cosa? Un sistema di domotica?

L'ho provato io per Leo, lui non ha la ethernet :slight_smile:

@Leo .... Cosa aspetti a prenderla ]:slight_smile: ci fai un sacco di belle cosette.

@davideanubi qualche problemuccio lo sketch lato web ce l'ha.
questo refresh ogni 10 sec client.print(""); crea seri problemi
poi ogni tanto tutto salta stampando caratteri a muzzo schiantando la scheda.

Però è interessante va perfezionato

ciao

in sostanza il server diventa Arduino.... e si serve per il controllo di casa e tante altre cose.... io di lavoro faccio proprio questo 'impianti domotici, elettrici,etc etc'... e sto cercando una soluzione economica per i clienti, perché credo che tutti abbiano il diritto di poter avere una casa che gestisca le utenze e crei risparmio energetico.
I principali fornitori di impianti domotici come ad esempio Vimar ti chiedono per 55Mq circa di casa e con un impianto base minimo 12.000 euro.. cifre improponibili oggi come oggi..

davideanubi:
in sostanza il server diventa Arduino.... e si serve per il controllo di casa e tante altre cose.... io di lavoro faccio proprio questo 'impianti domotici, elettrici,etc etc'... e sto cercando una soluzione economica per i clienti, perché credo che tutti abbiano il diritto di poter avere una casa che gestisca le utenze e crei risparmio energetico.
I principali fornitori di impianti domotici come ad esempio Vimar ti chiedono per 55Mq circa di casa e con un impianto base minimo 12.000 euro.. cifre improponibili oggi come oggi..

Impropobili a prescindere se ieri, oggi o domani! Sono pazzi ]:smiley:

ma io lo provo da un pezzo anche su smartphone e il problema che dici tu non l'ho rilevo...
comunque il refresh si può anche levare tanto basta farlo dal browser direttamente...