Visualizzazione post con etichetta Sensore. Mostra tutti i post
Visualizzazione post con etichetta Sensore. Mostra tutti i post

domenica 3 agosto 2014

Sensore analogico

Collegare un potenziometro da 47K fra +Vcc e GND.Il perno centrale su A0. Esso simulerà un qualunque sensore analogico.

 # define Sensore A0
   
   int ValoreSensore = 0;
   
   void setup() 
       { pinMode (Sensore,INPUT);
         Serial.begin(9600);}

   void loop(){
       
       ValoreSensore = analogRead(Sensore);
  
       Serial.print("Lettura:   ");
       Serial.println(ValoreSensore);
       
       delay(1000);
        }


map()
Il valore in ingresso varia da 0 a +5Vcc. Arduino lo elabora come un valore 0 -1023.
Con l'istruzione map questo valore viene rimappato avendo come limiti 20 e 200 (o altri valori. Quando la tensione in ingresso è zero la lettura sarà 20,quando è invece +5V sarà 200.

 # define Sensore A0
   
   int ValoreSensore = 0;
   
   void setup() 
       { pinMode (Sensore,INPUT);
         Serial.begin(9600);}

   void loop(){
       
       ValoreSensore = analogRead(Sensore);
       
       ValoreSensore = map(ValoreSensore, 0, 1023, 20, 200);
       Serial.print("Lettura:   ");
       Serial.println(ValoreSensore);
       
       delay(1000);
        }


sabato 26 luglio 2014

Termostato con LM335


Il datasheet del LM335 da cui sono state estratte le immagini, riporta una tensione di alimentazione compresa fra +5V e +40V.
Usando il sensore con Arduino tanto la tensione di alimentazioni quanto il valore della resistenza e del potenziometro si riducono di 1/3: Vcc= +5V; R= 4 Kohm (valore standard 3,9 Kohm; potenziometro = 3,3 Kohm o valori simili.


In questa tabella è evidenziato che a 25°C la tensione di uscita è di 2,98 V e che in assenza del potenziometro di taratura l'errore di lettura può oscillare fra i 2 ed i 4 gradi.



A 25°C la tensione analogica di A0 è di 2,98V con un rapporto di 2,98 / 25 = 0,1192.
Tale rapporto, essendo il dispositivo lineare, è uguale per tutti i valori di tensione.
Alla tensione di ingresso di 2,98V corrisponde, posto 0V = 0 bit e 5V=1023bit, un valore di 610 bit ed il valore 610 è ciò che si legge su display LCD o sull'IDE di Arduino. Il rapporto

C° = 25
Vin = 2,98 V
Vin / °C = 0,1192
bit = (+Vin * 1023) / +Vcc
bit = 2,98 * 1023 / 5 = 2,98 * 204,6 = 610

Il valore su seriale, espresso in bit, può quindi essere semplificato con la formula:

b>bit = +Vin * 204,6

Il rapporto gradi °C / bit, uguale per tutti i valori di tensione (il dispositivo è lineare) è:

25 : 204,6 = 0,040983606

La formula diretta da inserie nello sketch sarà sunque semplificata a:

°C= +Vin * 0,040983606



Con le formule inverse si costruisce la seconda tabella dove viene evidenziato che il valore massimo di temperatura è poco meno di 42°C.

Lo scketch che segue permette, con il raffronto con un sensore DHT11 la taratura del LM335

 /* Si confrantano fra loro tre sensori di
    temperatura.
    Il sensore DHT11  pin 2
    Il sensore LM335  pin A0 */
 
    #include <dht11.h>
   
    #define DHT11        2
    #define LM335       A0
   
    dht11 ValoreDHT11; 
  
     
    float clsiusLM335      =0;
    
   void setup()
         { pinMode(LM335, INPUT);    
           Serial.begin(9600);    }
 
   void loop(){
 
       ValoreDHT11.read(DHT11);
       float celsiusDHT =ValoreDHT11.temperature;
      
       clsiusLM335 = analogRead(LM335) *0.040983606 ;    
       
       Serial.println("\n");
       Serial.print("DHT11 Celsius  ");
       Serial.println(celsiusDHT);
       Serial.print("LM335 Celsius: ");
       Serial.println(clsiusLM335);

        
     delay(5000); }




domenica 6 gennaio 2013

NTC - Temperatura

La resistenza NTC (Negative Temperatur Coefficient) non ha un andamento lineare, ciò rende necessario l’uso di apposite formule.

Non essendo un valore lineare ,oltre a conoscere i valori minimo e massimo della prevista temperatura da misurare (esempio: da -10°C a +60°C) occorre correggere il valore letto con apposite formule.

sabato 5 gennaio 2013

DHT11 - Temperatura ed umidità


      /*Librerie:
            dht11.cpp VER.0.4.1
            dht11.h   VER 0.4.1 */
            
        
      #include <dht11.h>
     
      #define SensoreDHT11 2
     
      dht11 ValoreDHT11;
       
      void setup()
          {Serial.begin(9600);   }
      
      void loop(){
        
           Serial.println("\n");
      
           ValoreDHT11.read(SensoreDHT11);
                             
      
           float h =ValoreDHT11.humidity;
               Serial.print("Humidity (%): ");
               Serial.println(h);
      
           float t =ValoreDHT11.temperature;
               Serial.print("Temperature (C): ");
               Serial.println(t);
           
        delay(2000);
      }
  




// FILE: dht11.cpp
// VERSION: 0.4.1
// PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino
// LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html)
//
// DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf
//
// HISTORY:
// George Hadjikyriacou - Original version (??)
// Mod by SimKard - Version 0.2 (24/11/2010)
// Mod by Rob Tillaart - Version 0.3 (28/03/2011)
// + added comments
// + removed all non DHT11 specific code
// + added references
// Mod by Rob Tillaart - Version 0.4 (17/03/2012)
// + added 1.0 support
// Mod by Rob Tillaart - Version 0.4.1 (19/05/2012)
// + added error codes
//

#include "dht11.h"

// Return values:
// DHTLIB_OK
// DHTLIB_ERROR_CHECKSUM
// DHTLIB_ERROR_TIMEOUT
int dht11::read(int pin)
{
// BUFFER TO RECEIVE
uint8_t bits[5];
uint8_t cnt = 7;
uint8_t idx = 0;

// EMPTY BUFFER
for (int i=0; i< 5; i++) bits[i] = 0; // REQUEST SAMPLE pinMode(pin, OUTPUT); digitalWrite(pin, LOW); delay(18); digitalWrite(pin, HIGH); delayMicroseconds(40); pinMode(pin, INPUT); // ACKNOWLEDGE or TIMEOUT unsigned int loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; // READ OUTPUT - 40 BITS => 5 BYTES or TIMEOUT
for (int i=0; i<40; i++) { loopCnt = 10000; while(digitalRead(pin) == LOW) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; unsigned long t = micros(); loopCnt = 10000; while(digitalRead(pin) == HIGH) if (loopCnt-- == 0) return DHTLIB_ERROR_TIMEOUT; if ((micros() - t) > 40) bits[idx] |= (1 << cnt); if (cnt == 0) // next byte? { cnt = 7; // restart at MSB idx++; // next byte! } else cnt--; } // WRITE TO RIGHT VARS // as bits[1] and bits[3] are allways zero they are omitted in formulas. humidity = bits[0]; temperature = bits[2]; uint8_t sum = bits[0] + bits[2]; if (bits[4] != sum) return DHTLIB_ERROR_CHECKSUM; return DHTLIB_OK; } // // END OF FILE // // // FILE: dht11.h // VERSION: 0.4.1 // PURPOSE: DHT11 Temperature & Humidity Sensor library for Arduino // LICENSE: GPL v3 (http://www.gnu.org/licenses/gpl.html) // // DATASHEET: http://www.micro4you.com/files/sensor/DHT11.pdf // // URL: http://playground.arduino.cc/Main/DHT11Lib // // HISTORY: // George Hadjikyriacou - Original version // see dht.cpp file // #ifndef dht11_h #define dht11_h #if defined(ARDUINO) && (ARDUINO >= 100)
#include
#else
#include
#endif

#define DHT11LIB_VERSION "0.4.1"

#define DHTLIB_OK 0
#define DHTLIB_ERROR_CHECKSUM -1
#define DHTLIB_ERROR_TIMEOUT -2

class dht11
{
public:
int read(int pin);
int humidity;
int temperature;
};
#endif
//
// END OF FILE
//


venerdì 4 gennaio 2013

Ostacolo a IR


Un diodo LED emette un fascio di luce. Un foto LED lo riceve e va in consuzione solo se il raggio viene riflesso.Se i due LED sono paralleli fra loro o divergenti l'ostacolo non potrà essere rilevato.

Lo Sketch consite nella lettura digitlae del pin di ingresso della shiled.

      /*
     Shield    ARDUINO 
     GND  GND
      +  5v
      Out  PIN 2
      EN  Non collegato
      */
     
      # define Sensore 2
      # define LED     7
      
      int StatoSensore= 0;
      
      void setup() 
          { pinMode (Sensore, INPUT); 
            pinMode (LED, OUTPUT);  
            digitalWrite(Sensore, HIGH);
            digitalWrite(LED, LOW); 
            Serial.begin (9600);  }
            
      void loop() {
       
           StatoSensore = digitalRead (Sensore);
           Serial.println("\n");
           if (StatoSensore == LOW) 
              { digitalWrite(LED, HIGH); 
                Serial.print ("Attenzione Ostacolo ");} 
           
           else 
              {digitalWrite(LED, LOW);
               Serial.print ("Nessun Ostacolo ");}
                  
           delay (500); 
      }

giovedì 3 gennaio 2013

MCP700A.- Temperatura

Sensore di temperatura MCP9700A

Vcc = 5 Volt ; Vout a 0°C Vo = 0.5 Volt ; Coeffciente di temp. ct = 10 mV/ °C
Temperatura = ct * gradi + Vo



La seconda tabella evidenzia come il valore in bit sia il 51,17188% superiore al valore in gradi, basta quindi considerare tale differenza per far conicidere il valor 0 con il valore 0°C.



mercoledì 2 gennaio 2013

SRF05 - Sonar per ostacoli


/* Spazio = Velocità del suono : tempo
   Spazio = 343 m/sec : tempo
   tempo = tempo impiegato dall'infrasuono
   dall'emissione, al rimbalzo al ritorno.*/

     # define TRIECO   2
     
     int durata    = 0;      
     int distanza  = 0;   
     int segnale   = 0 ;  
  
     void setup() 
               {Serial.begin(9600);}
 
     void loop(){
//------- Il pin2 diventa uscita----       
         pinMode(TRIECO, OUTPUT);
//-- Il pin 2 emette un treno di impusi.       
         digitalWrite(TRIECO, LOW);       
         delayMicroseconds(2); 
         digitalWrite(TRIECO, HIGH);      
         delayMicroseconds(10);               
         digitalWrite(TRIECO, LOW);  
         
//------- Il pin2 diventa ingresso----    
         pinMode(TRIECO, INPUT);
//--il pin2 riceve il treno di impulsi-----           
         durata = pulseIn(TRIECO, HIGH); 
         distanza = durata/58;               
         Serial.println(distanza);           
         delay(100); }



Altro sketch in cui si usano 4 pin
  /* Sonar SRF05
  ________|-----------|_____
   2 ySec.   10 ySec
  Si calcola il tempo impiegato da un impulso
  di 10ySec per:partire(TX), sbattere contro
  l'ostacolo, ritornare(RX). Nota la velcità
  del suono si calcola lo spazio.   */
  
     #define RXECO 2                              
     #define TXECO 3 

     int spazio = 0;     
 
     void setup()
            {pinMode(RXECO,  INPUT);
             pinMode(TXECO, OUTPUT);
             Serial.begin(9600);     }

     void loop(){
  
             digitalWrite(TXECO, LOW);                
             delayMicroseconds(2);
             digitalWrite(TXECO, HIGH);                
             delayMicroseconds(10);
             digitalWrite(TXECO, LOW);                   
             int spazio = pulseIn(RXECO, HIGH);       
             spazio= spazio/58;                       
             Serial.println(spazio);                     
             delay(50);                  }



martedì 1 gennaio 2013

LM335-Temperatura




// Sensore di Temperatura LM335

   #define SENSORE A0
   
   float kelvin     =0;
   float clsius      =0;
    
   void setup()
         {pinMode(SENSORE, INPUT);    
          Serial.begin(9600);}
 
   void loop(){
 
      kelvin = analogRead(SENSORE) * 0.488758553;    
      clsius = kelvin - 273.15; 
    
      Serial.print("Kelvin: ");  
      Serial.println(kelvin);
      Serial.print("Celsius: ");
      Serial.println(clsius);
      Serial.println();
     delay(5000); }




Il datasheet del LM335 riporta una tensione di 2.93V alla temperatura di 298,15 K°.
(298,15K° : 2.93V)= 101,7577K°/V
101.7577 K°/V * 5V= 508.78 K°

1023bit:5V * 2.93V = 599 bit

segue tabella.