Salve, sono nuovo di Arduino e sul forum, volevo avere un parere su un problema che ho riscontrato mentre svolgevo un esercizio.
Dico subito che potrei commettere errori banali di nomenclature o altro, dato che è solo da pochi giorni che sto smanettando con l'elettronica, ma veniamo al dunque.
Ho acquistato lo starter kit "ufficiale" con Arduino UNO all'interno, e sono arrivato a svolgere il progetto numero 3 che viene presentato sul libro incluso: l'Amorometro.
Questo consiste nell'utilizzare il sensore di temperatura TMP36 collegato al piedino analogico A0, ricavarsi la temperatura tramite software, dopodichè accendere alcuni LED a seconda della temperatura raggiunta, e controllare i dati attraverso il monitor seriale.
A grandi linee funziona, ma ci sono dei comportamenti strani da parte del sensore. Aggiungo, inoltre, di aver già cercato su altri topic un problema simile al mio, ma senza successo. Di solito quello che gli altri utenti lamentano, è che il sensore sia poco preciso di qualche grado, oppure che surriscaldi, o altro.
Quello che lamento io è che il sensore, inizialmente, mi dà in output una temperatura plausibile (circa 18 gradi, che purtroppo non posso confermare poichè non posseggo un termometro ambientale in casa). Dopodichè poggio le dita sopra il sensore per potergli far captare la mia temperatura (come previsto dall'esercizio) e qui accade l'arcano. Dopo qualche secondo in cui la temperatura rimane costante, schizza all'improvviso sui 60, 70 gradi, e rimane così anche per minuti interi dopo che io l'abbia lasciato.
Effettivamente quando lo tocco sembra caldo, o forse è solo suggestione ahah, ma non mi spiego perchè prima segnasse i 18 gradi...
Poi mi basta chiudere il monitor seriale, riaprirlo subito dopo, ed ecco che la temperatura ritorna sui 18!
Non credo che le mie mani siano assolutamente così calde, anzi.
Lo stesso fenomeno si ripropone anche solo soffiando aria calda sul sensore per qualche secondo.
Che sia qualcosa che riguarda l'umidità a causare un malfunzionamento?
Qualcuno consiglia di usare un condensatore mi pare, ma ad ora non so neanche cosa sia.
Il sensore mi pare proprio di averlo messo nel verso giusto, ho consultato anche il datasheet del componente.
Può essere che il sensore sia danneggiato? O che l'abbia danneggiato io piegando i piedini per farli entrare nella breadboard?
Non ho neanche a disposizione un multimetro per controllare l'ingresso nell'A0, visto che dovrebbe essere questo la causa di tutto... mi dispiace.
Se mi venisse in mente altro, lo scriverò.
Nel frattempo allego la foto del circuito, lo sketch, e il datasheet.
Grazie mille!
P.S. mi scuso nel caso abbia infranto qualche regola del forum o abbia sbagliato titolo, ho fatto del mio meglio!
const int sensorPin = A0;
const float baselineTemp = 18.36;
void setup() {
// put your setup code here, to run once:
Serial.begin(9600); //apri una porta seriale
for(int pinNumber = 2; pinNumber<5; pinNumber++) {
// settiamo i pin da 2 a 4 su LOW
pinMode(pinNumber, OUTPUT);
digitalWrite(pinNumber, LOW);
}
}
void loop() {
// put your main code here, to run repeatedly:
int sensorVal = analogRead(sensorPin); // il piedino riceve un valore da 0 a 1023
Serial.print("Sensor Value: ");
Serial.print(sensorVal);
float voltage = (sensorVal/1024.0) * 5.0; // convertiamo il valore che viene inviato al piedino analogico nei reali Volts che riceve (da 0 a 5)
Serial.print(", Volts: ");
Serial.print(voltage);
Serial.print(", degrees C: ");
float temperature = (voltage - .5) * 100; // ricaviamo la temperatura tramite questa formula
Serial.println(temperature);
// gestione dei led
if(temperature < baselineTemp) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
} else if (temperature >= baselineTemp + 2 && temperature < baselineTemp+4) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
} else if (temperature >= baselineTemp + 4 && temperature < baselineTemp+6) {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
} else if (temperature >= baselineTemp + 6) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, HIGH);
}
delay(500);
}