adafruit neopixel stick 8 & lm35

Ciao a tutti.
In questi giorni di vacanza quando ho tempo libero mi sto divertendo a lavorare insieme ad un semplice sensore di temperatura lm35.
Il mio progetto è quello di misurare la temperatura e in base alla temperatura voglio far accendere i led.
Fin qui tutto ok.
Ho un problema però, se uso l’lm35 da solo usando questo codice semplice

void setup() {
  Serial.begin(9600);
}
void loop() {
  int Valore = analogRead(A0);
  Serial.println(5*Valore*100/1024);
  delay(2000);
}

rilevo la temperatura correttamente ad esempio ci sono 15 gradi adesso, rilevo sempre 15 gradi e se tocco il sensore sale subito la temperatura;
Se invece uso questo codice che integra la neopixel

#include <Adafruit_NeoPixel.h>
int sensorPin = 0;
#define PIN            10
#define NUMPIXELS      8
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
  strip.begin();
 Serial.begin(9600);
}
void loop() {
   int reading = analogRead(sensorPin);  
 int voltage = reading * 5;
 voltage /= 1024; 
 Serial.print(voltage); Serial.println(" volts");
 int temperatureC =  reading*5*100/1024;
 Serial.print(temperatureC); Serial.println(" degrees C");
 delay(800);

rilevo sempre la temperatura, i led si accendono come dico io ma non rileva correttamente.

0 volts
16 degrees C
0 volts
15 degrees C
0 volts
14 degrees C
0 volts
15 degrees C
0 volts
15 degrees C
0 volts
13 degrees C
0 volts
12 degrees C

Come posso risolvere? I due codici fanno la stessa cosa più o meno, se stacco la neopixel mi funziona normalmente se invece uso la neopixel insieme al sensore mi sballa i dati, inoltre dovrò integrare anche due display a 7 segmenti. Non vorrei fosse un problema di alimentazione.
Sto usando un arduino mega adk la neopixel è collegata direttamente a 5v e gnd, stessa cosa il sensore.

guixi:
Come posso risolvere? I due codici fanno la stessa cosa più o meno,

la variabile "voltage" è di tipo intero, se la dividi per 1024 è normale che il risultato è sempre 0 visto che al massimo vale 200 (~40 count *5) a 20°

astrobeed:
la variabile "voltage" è di tipo intero, se la dividi per 1024 è normale che il risultato è sempre 0 visto che al massimo vale 200 (~40 count *5) a 20°

Come devo modificarla? al posto di 1024 cosa devo mettere? 200?
di visualizzare i volt non mi importa niente, non capisco perchè con quel codice dove ho integrato la neopixel rilevo la temperatura sballata solo quando è collegata la neopixel.. se scollego la neopixel la misura delle temperatura è giusta come nel primo codice semplice..
questo è con la neopixel scollegata

0 volts
19 degrees C
0 volts
19 degrees C
0 volts
19 degrees C
0 volts
19 degrees C
0 volts
19 degrees C

questo con la neopixel collegata

0 volts
24 degrees C
0 volts
23 degrees C
0 volts
23 degrees C
0 volts
21 degrees C
0 volts
22 degrees C
0 volts
23 degrees C
0 volts
22 degrees C

guixi:
Come devo modificarla? al posto di 1024 cosa devo mettere? 200?

Dipende da come vuoi visualizzare la tensione, se ti vanno bene i mV elimina la divisione per 1024, non è il valore preciso in quanto ogni count del ADC non sono 5 mV esatti, però può bastare per una verifica.

di visualizzare i volt non mi importa niente, non capisco perchè con quel codice dove ho integrato la neopixel rilevo la temperatura sballata solo quando è collegata la neopixel.. se scollego la neopixel la misura delle

Quasi sicuramente è un problema di alimentazione, i WS2812 usati per i NeoPixel possono consumare fino a 60 mA ciascuno e questo influisce sul valore di tensione di alimentazione di Arduino e sul riferimento di default per l'ADC, che è la tensione di alimentazione, dato che il LM35 non è raziometrico se la tensione di riferimento del ADC cala anche la lettura cala e questo altera la lettura della temperatura.
Soluzione, usare per l'ADC il reference esterno collegando Aref al 3.3V di Arduino, ovviamente devi attivare la cosa anche da software, e rifare i conti sulla base di 3.3 mV per count invece di 5 mV, in questo modo elimini gli errori lettura ADC dati da tensione non precisa/stabile.

astrobeed:
Soluzione, usare per l'ADC il reference esterno collegando Aref al 3.3V di Arduino, ovviamente devi attivare la cosa anche da software, e rifare i conti sulla base di 3.3 mV per count invece di 5 mV, in questo modo elimini gli errori lettura ADC dati da tensione non precisa/stabile.

lascio il ponte 5v e gnd sulla basetta? o devo mettere la 3.3v al posto della 5v sulla basetta?
e poi usare l'AREF?

basta che metto "analogReference(EXTERNAL)" nel void setup?

guixi:
o devo mettere la 3.3v al posto della 5v sulla basetta?
e poi usare l'AREF?

Devi collegare Aref di Arduino ai 3.3 V e poi inizializzare l'ADC per l'uso della tensione esterna come riferimento tramite "analogReference(EXTERNAL)".

astrobeed:
Devi collegare Aref di Arduino ai 3.3 V e poi inizializzare l'ADC per l'uso della tensione esterna come riferimento tramite "analogReference(EXTERNAL)".

ho risolto questo problema della misura sballata ma ora mi esce sbagliata, dice che ci sono 30° invece ce ne sono 22

void setup() {
  strip.begin();
 Serial.begin(9600);
 analogReference(EXTERNAL);
}
void loop() {
   int reading = analogRead(sensorPin);  
 int temperatureC =  reading*5*100/1024;
 Serial.print(temperatureC); Serial.println(" degrees C");
 delay(800);

guixi:
ho risolto questo problema della misura sballata ma ora mi esce sbagliata, dice che ci sono 30° invece ce ne sono 22

Ti sei scordato di rifare i conti con ~3.3 mV per count invece di 5 mV per count come ti avevo detto.

astrobeed:
Ti sei scordato di rifare i conti con ~3.3 mV per count invece di 5 mV per count come ti avevo detto.

posso mettere nel setup due analogreference?

devo inserire i display a 7 segmenti e ho sviluppato il codice usando analogreference(internal1v1).

RIESUMO LA DISCUSSIONE,

void setup() {
  strip.begin();
 Serial.begin(9600);
 analogReference(EXTERNAL);
}
void loop() {
   int reading = analogRead(sensorPin);  
 int temperatureC =  reading*3.0*100/1024;
 Serial.print(temperatureC); Serial.println(" gradi");
 delay(600);
}

non riesco a fare scendere la temperatura sotto lo zero, l'ho messo in un frigorifero a -18° e dava sempre 0...
come posso risolvere??

guixi:
non riesco a fare scendere la temperatura sotto lo zero, l’ho messo in un frigorifero a -18° e dava sempre 0…
come posso risolvere??

Non puoi leggere una temperatura negativa direttamente dal LM35, 0° = 0V, per poter leggere temperature minori di 0° occorre creare un offset sul gnd del LM35 e fare una lettura differenziale.

Esempio di collegamento per poter leggere temperature negative, è la soluzione più semplice possibile, se AD1 = AD2 = 0°, se AD1 < AD2 la temperatura è negativa, vale sempre la regola dei 10 mV/C°.

dovrò usare un attiny85, come faccio a dargli il riferimento 3.3v??
dici di collegare il sensore in quel modo?