Pages: [1] 2   Go Down
Author Topic: Problema con PIN analogici  (Read 1424 times)
0 Members and 1 Guest are viewing this topic.
Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Imer

Facci vedere come hai collegato i 2 sensori.

Ciao Uwe
Logged

Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Ciao IMer
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao Imer,

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

Ciao Uwe
Logged

Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

È 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);
  }

Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: November 17, 2010, 03:19:05 pm by uwefed » Logged

Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ok quello elimina il problema dellla conversione.

sono curioso per il resto della prova.

Ciao Uwe
Logged

Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

0
Offline Offline
Shannon Member
****
Karma: 132
Posts: 10502
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
« Last Edit: November 17, 2010, 06:59:51 pm by lestofante » Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

BZ (I)
Online Online
Brattain Member
*****
Karma: 271
Posts: 21881
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: November 18, 2010, 05:28:19 am by uwefed » Logged

Verbania Lago Maggiore
Offline Offline
Jr. Member
**
Karma: 0
Posts: 74
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Pages: [1] 2   Go Up
Jump to: