Go Down

Topic: Problema con PIN analogici (Read 1 time) previous topic - next topic

Imer

Primo progetto che sto cercando di portare a termine con arduino , ho fatto un termostato differenziale in pratica ho finito lo sketch e come sensori utilizzo 2 LM35 .
Per non dover amplificare il segnale ho usato il riferimento interno a 1,1 V.
Solo che ho fatto tutto usando 2 trimmer da 10 Kohm , ora mi sono arrivati i sensori in questione e li ho applicati , pero mi sono accorto che se aumenta la temperatura di un sensore mi sposta il valore anche dell'altro , mi sembra molto un problema di impedenze , c'è modo di eliminare questo problema ?

CIao IMer

uwefed

Ciao Imer

Facci vedere come hai collegato i 2 sensori.

Ciao Uwe

Imer

Ho semplicemente connesso i 2 pin dell'alimentazione al 5 V e GND e l'uscita all'ingresso analogico , i 2 sensori  sono montati direttamente sui Pin di Arduino.
Adesso stavo sfogliando il datasheet del sensore incerca di una soluzione e mi sono accorto che ci va una resistenza da 200 ohm verso massa , il problema potrebbe essere questo ?

Ciao IMer

uwefed

Ciao Imer

È giusto e non serve una resistenza.
Le uscite dei 2 LM35 li colleghi sullo stesso pin analogico o su 2 pin analogici diversi?
Ciao Uwe

Imer

Sono collegati su 2 pin diversi , per la precisione A0 e A1 e la lettura avviene una in successione all'altra.

Ciao IMer

uwefed

Ciao Imer,

è giusto.
Strano l'effetto. Hai un errore nel programma?
Lo incolli?

Ciao Uwe

Imer

È il mio primo lavoro , quindi è scritto molto da analfabeta tieni presente questo .
Rispetto a quello che ti ho scritto mi ero scordato di che ho cambiato i PIN dei sensori , ma ti ricordo che quando lo provavo con i potenziometri il problema non c'è.

CIao e grazie per l'aiuto  IMer

/*

 The circuit:
* LCD RS pin to digital pin 2
* LCD Enable pin to digital pin 3
* LCD D4 pin to digital pin 4
* LCD D5 pin to digital pin 5
* LCD D6 pin to digital pin 6
* LCD D7 pin to digital pin 7
* 10K resistor:
* ends to +5V and ground
* wiper to LCD VO pin (pin 3)
*/

// include the library code:
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(2, 3, 4, 5, 6, 7);
int analogPin0 = 0  ;// Differenza di temperatura per Accensione
int analogPin1 = 1  ;// Temperatura  Accumulo
int analogPin2 = 2  ;// Temperatura Camino
int analogPin3 = 3  ;// Differenza di temperatura per spegnimento

int buttonState = 0; // Stato del pulsante in Pin 7

float Accumulo = 0   ;// temperatura Accumulo
float Camino = 0     ;// temperatura Camino
float val = 0        ;// temperatura di accensione pompa
float scatto = 0     ;// temperatura di spegnimento pompa
float costante = 0   ;
float ripristino = 0 ;
String messaggio     ;

long previousMillis = 0  ;
long interval = 1000     ;// Lampeggio RUN per capire se funziona
long luce = 10           ;// Tempo di accensione retro illuminazione
int a = 0 ;
int b = 0 ;

void setup() {
 // Serial.begin(9600);
 
 pinMode(11, INPUT)               ;// Pulsante cambio finestra
 pinMode(13, OUTPUT)             ;// Per accendere la pompa
 pinMode (12,OUTPUT)             ;// Attiva la retroilluminazione
 digitalWrite(12,LOW);
 costante = (float) 4/40         ;//Taratura lettura in temperatura in funzione della sonda
 lcd.begin(20,2)                 ;// Setto LCD 20 caratteri 2 righe
 lcd.clear()                     ;// Cancello tutto il display
 lcd.setCursor(0, 0)             ;// Sposto il cursore in colonna e riga
 lcd.print("Termostato by Imer") ;
 lcd.setCursor(0, 1);
 lcd.print ("differenziale V2.0");
 delay (2000);
 lcd.clear () ;
 lcd.setCursor(7, 0);
 lcd.print ("Per");
 lcd.setCursor(3, 1);
 lcd.print ("Marco Molinari");
 delay (2000);
 lcd.clear () ;
 digitalWrite(12,HIGH);
}

void loop() {
 char str[12] = {'0','0','0','0','0','0','0','0','0','0','0','0'} ; //stringa che conterrà la stringa risultato
 
 buttonState = not(digitalRead(11))  ; //Legge lo stato del pulsante

 Accumulo = (analogRead(analogPin1) * (float)costante) ;
 Camino   = (analogRead(analogPin2) * (float)costante) ;
 val      = (analogRead(analogPin3) * (float)costante) ;
 scatto   = (analogRead(analogPin0) * (float)costante) ;
 
 if (scatto <= 1 ) {scatto = 1 ; }
 if ((val - scatto) <= 1 ) { val = (scatto + 1) ; }
 
 
 if (buttonState == LOW) {  
 messaggio = dtostrf (Accumulo,5,1,str);
 lcd.setCursor(0, 0);
 lcd.print ("Boiler = " + String(messaggio) + char(223) + " " );
 messaggio = dtostrf (Camino,5,1,str);
 lcd.setCursor(0, 1);
 lcd.print ("Camino = " + String(messaggio) + char(223) + " " );
 }

 if (buttonState == HIGH) {
 if (b == 0 ){ b ++ ; } ; // fa partire il tempo della retroinluminazione per b = 0
 digitalWrite (12,LOW)  ; // accende la retro illuminazione
 messaggio = dtostrf (val,4,1,str);
 lcd.setCursor(0, 0);
 lcd.print ("Temp. ON = " + String(messaggio) + char(223));
 messaggio = dtostrf (scatto,4,1,str);
 lcd.setCursor(0, 1);
 lcd.print ("Temp.OFF = " + String(messaggio) + char(223));
 }
 
 if ((Camino - val + ripristino) > Accumulo) {
 lcd.setCursor(17, 0);
 lcd.print (" ON");
 digitalWrite(13, HIGH)        ; //accende la pompa
 ripristino = (float)scatto;
 } else{
 lcd.setCursor(17, 0);
 lcd.print ("OFF");
 digitalWrite(13, LOW)         ; //spegne la pompa
 ripristino = (float)0;
 }

 unsigned long currentMillis = millis();

 if(currentMillis - previousMillis > interval) {
   
 previousMillis = currentMillis;  
 
 if (a == 0){                       ;// pulsazione per verifica funzionamento display
            a = 1  ;
            lcd.setCursor (17,1);
            lcd.print ("RUN");
            }else{
            a = 0;
            lcd.setCursor (17,1);
            lcd.print ("   ") ;
            }  
 if (b!= 0) {                        ;// calcolo tempo di accensione retro illuminazione display
           if (buttonState == LOW)  { b++   ; }
           if (buttonState == HIGH) { b = 1 ; }
            }
            if(b >= (luce * 2) ) {   ;// calcolo tempo di accensione retro illuminazione display
            b = 0                    ;// luce è moltiplicata per 2 perchè il passaggio avviene 2 volte uno per "RUN" e " "
            digitalWrite (12,HIGH);
            }
 }
 // Serial.println (b);
 }


uwefed

#7
Nov 17, 2010, 09:17 pm Last Edit: Nov 17, 2010, 09:19 pm by uwefed Reason: 1
ciao Imer
vedo 2 cose a prima vista:
definisci
"float costante = 0;"
che dovrebbe essere il fattore per calcolare la temperatura.

poi
Accumulo = (analogRead(analogPin1) * (float)costante) ;
Camino   = (analogRead(analogPin2) * (float)costante) ;
val      = (analogRead(analogPin3) * (float)costante) ;
scatto   = (analogRead(analogPin0) * (float)costante) ;

manda dopo ogni analogRead il valore sul terminale seriale:

nel setup() aggiungi " Serial.begin(9600);  "
e poi dopo ogni lettura analogica fai stampare il valore sul terminale del IDE con
Serial.println(Accumulo);  ecc

Cosí vedi se é un problema di lettura o di elaborazione.

Ciao Uwe

Imer

Vado a fare questa prova , ma ti avviso che ho sbagliato a mandarti il programma quella è la penultima versione , adesso è stata aggiunta questa riga :

void setup() {
 analogReference(INTERNAL)       ;// Setta la tensione di riferimento a 1.1 V

Per portare al referenza 1.1 V per il resto è uguale , la costante la definisco 0 e poi le cambio il valore  , ho fatto cosi perchè non riuscivo a fare i calcoli e per capirci qualcosa ho separato la definizione dal calcolo , se guardi troverai dopo la riga :

costante = (float) 4/40         ;//Taratura lettura in temperatura in funzione della sonda


mentre ora è definita cosi :

costante = (float) ((1.1/1024) * 100)    ;//Taratura lettura in temperatura in funzione della sonda


CIao IMer

uwefed

ok quello elimina il problema dellla conversione.

sono curioso per il resto della prova.

Ciao Uwe

Imer

Io ho aggiunto le seguenti righe:

Accumulo = (analogRead(analogPin1) * (float)costante) ;
 Serial.print (String("accumulo = " )+ int ((analogRead(analogPin1))));
 
 Camino   = (analogRead(analogPin2) * (float)costante) ;
 Serial.println (String("    Camino = ") + int ((analogRead(analogPin2))));

cosi mi svincolo da ogni mio calcolo e verifico solo il valore in digit ,
ma se scaldo una sonda anche l'altra segue , mi sembra un problema di conversione del A/D , ma come eliminarlo ?

CIao IMer

lesto

#11
Nov 18, 2010, 12:57 am Last Edit: Nov 18, 2010, 12:59 am by lestofante Reason: 1
credo che questo sia errato:
costante = (float) ((1.1/1024) * 100)
1.1/1024 (float e int, il valore viene troncato a int) *100 (stessa cosa ma orami il danno è fatto. fai così:
costante = ((1.1/1024.0) * 100.0) (forzatura a float dei valori, senza bisogno di cast dispendiose :-) )

stessa cosa, il cast di "costante" non è necessario (è già float), e neccessario il cast di analogRead(int):
Accumulo = (float)analogRead(analogPin1) * costante;
Camino   = (float)analogRead(analogPin2) * costante;
val      = (float)analogRead(analogPin3) * costante;
scatto   =  (float)analogRead(analogPin0) * costante ;

edit: magari è una cazzata enorme, ma un condensatorino piccolino in parallelo tra massa e analogpin?
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Imer

OK lesto quello puo essere un problema , ma se gia la conversione del A/D sballa quello puo essere un secondo problema ,se leggi sopra ho mandato in seriale il dato puro del A/D e gia' li si vede che se scaldo un sensore l'altro lo segue , per dar ìe un numero se da 22° scaldo uno dei sensori a 30° quello non riscaldato guadagna 1° grado e lo si vedo nella sola lettura in digit m quindi non é un problema di calcolo, per il condensatore posso provare , ieri sera ho controllato l'alimentazione ed era stabile , questa sera provo con il condensatore , tanto male non le fa , quanto 10 mF ?

Ciao IMer

uwefed

#13
Nov 18, 2010, 10:05 am Last Edit: Nov 18, 2010, 11:28 am by uwefed Reason: 1
Mi viene in mente:
come scaldi il sensore e quanto vicino sono i due sensori?
Sei sicuro che non scaldi il secondo quando scaldi il primo?

Se lavori con costanti é meglio fare i calcoli piú semplici possibili.
Al posto di  ((1.1/1024) * 100) scrivi (110/1024). È la stessa cosa e hai una moltiplicazione in meno.

Ciao Uwe

Imer

Ho avuto anche quel dubbio perché usavo le dita , ieri sera ho messo tra i 2 sensori una piastrina di vetronite e scaldavo il sensore sul lato opposto con la punta del saldatore , e la temperatura variava ugualmente , a meno che il calore non si trasferisce con i piedini del sensore , questa sera lo smonto dallo stampato e lo collego con un filo , cosi sono sicuro anche di questo.

Ciao Imer

Go Up