Ho iniziato a sperimentare con Arduino realizzando un indicatore di temperatura con indicazione analogica.
Il circuito usa come sensore di temperatura un LM35 e come indicatore visivo di temperatura un servo per modellismo HXT500 che muove una lancetta.

Questo è il circuito di prova:
CircuitoCircuito
e un dettaglio del servo:
CircuitoCircuito
Per chi volesse realizzarlo, questo è lo schema di collegamento:
LM35 e ServoLM35 e Servo
con la pedinatura dell'LM35 e i collegamenti del servo:
LM35 e ServoLM35 e Servo
L'LM35 puo leggere temperature che vanno da -55 + 150 °C (gradi centigradi) e fornisce in uscita un segnale analogico proporzionale alla temperatura senza necessità di calibrazione. La sensibilità è di 10mV/°C ovvero ogni grado provoca una variazione di 10mV.
Come si vede in figura:
  • il pin 1 va collegato ai +5V
  • il pin 2 è l'uscita del segnale analogico
  • il pin 3 è la massa (GND)
LM35 pin 2 è collegato al pin A1 che è un ingresso analogico (ADC a 10 bit) che ritorna un valore compreso tra 0 e 1023.

Il servo ha questi collegamenti:
  • Cavo rosso alimentazione +5V
  • Cavo arancione ingresso segnale PWM
  • Cavo marrone massa (GND)

Il servo è collegato all'Arduino sul pin 9, la prima uscita digitale che può funzionare anche in PWM (Pulse Width Modulation). Con questa tecnica si genera un segnale a onda quadra con frequenza costante dove la posizione del servo è controllata dal duty cicle ovvero il rapporto tra il periodo in cui l'onda è alta (+5V) rispetto a quando è Bassa (0V). Un duty cicle del 50% posiziona il servo al centro.
PWMPWM

Per programmare l'Arduino per questo esempio è necessario scaricare l'editor dal sito e caricare questo codice:
Arduino
// Legge la temperatura da un LM 35
// e la converte in un angolo del servo
// by Sgart.it
// http://www.sgart.it

#include <Servo.h>

/* definizione variabili */
Servo myservo;      // creo l'oggetto servo
const int pinLM35 = 1;    // pin analogico dove è collegato LM35
const int pinServo = 9;   // pin uscita digitale per il servo (PWM)

const float vref = 1.1;   // valore di riferimento per la lettura dell'LM35

//valori di temperatura minimo e massimo gestiti
const float tempMin = -10.0;
const float tempMax = 50.0;

// valori minimo e massimo in gradi relative escursione del servo
const int servoMin = 165;
const int servoMax = -30;

float tempPrec = -100;  // memorizzo la lettura precedente
const float tempOffset = 0.2;  // variazione minima prima di aggiornare il valore (evito pendolamenti)

void setup() {
  analogReference( INTERNAL );  // per la conversione analogica digitale (ADC) uso il riferimento di tensione interno 1.1V
  analogRead( pinLM35 );        // lettura a vuoto x assestamento
  myservo.attach(pinServo);     // aggancio l'oggetto servo sul pin 9
  Serial.begin(9600);           // imposto la seriale che userò per stampare i valori letti
}

void loop() {
  Serial.println("");           // nuova linea
  float temp = readTemp();      // leggo la temperatura
  //temp= 20;     // decommentare per tarare il circuito in base alle variabili servoMin e servoMax (provare vari valori)
  temp = constrain(temp, tempMin, tempMax);     // limito la temperatura ai valori min e max

  int pos = map(temp, tempMin, tempMax, servoMin, servoMax);  // converto la temperatura nella posizione del servo
  myservo.write(pos);    // aggiorno la posizione del servo

  Serial.print("Pos: "); Serial.print(pos);

  // aspetto che il servo vada in posizione (basterebbe un valore 15)
  // essendo la temperatura una grandezza che non varia velocemente posso mettere un valore più elevato
  delay(500);
}

// legge la temperatura
float readTemp() {
  int val = analogRead(pinLM35);              // legge il dato dall'LM35 [0÷1023]
  float temp = ( 100.0 *  vref * val ) / 1024.0;  // lo converte in °C

  Serial.print("Temp: "); Serial.print(temp); Serial.print(", ");

  //per evitare pendolamenti faccio in modo che la temperatura vari solo se esce dalla finestra impostata (tempOffset)
  if (temp > (tempPrec + tempOffset) || temp < (tempPrec - tempOffset)) {
    tempPrec = temp;
  }
  Serial.print("TempPrec: "); Serial.print(tempPrec); Serial.print(", ");
  return  tempPrec;
}
Il servo dovrebbe avere una escursione di 180° ma in realtà ne ha molto meno. Per compensare questa limitazione ho introdotto le variabili servoMin e servoMax che vanno tarate in base al modello di servo

Attivando il serial monitor è possibile vedere i valori di temperatura e posizione del servo:
com serialecom seriale

Alcune info sull'LM35 le ho prese da questo sito http://www.adrirobot.it/sensori/lm35...no_lm35.htm.
Potrebbe interessarti anche: