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
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°.