domenica 27 gennaio 2013

Controllo delle bottiglie di plastica


Una bottiglia viene posta sotto un pistone che combacia con il collo della bottiglia sigillandola.
Un flusso di aria compressa viene in essa iniettata finchè la pressione è uguale a 1023, l'iniettore d'aria si chiude.
Dopo un paio di secondi si misura la pressione interna della bottiglia.
Se è inferiore a quella di riferimento di 500 ( o impostabile tramite TRIMMER) c'è stata una perdita quindi la bottiglia ha qualche foro mentre se non c'è stato calo di pressione la bottiglia è integra.
Nota sull'uso del delay: il loop si blocca ma durante questo tempo di blocco Arduino non deve svolgere altri operazioni per cui è inutile complicarsi la vita usando la funzione millis con laboriose righe di codice.

  
   # define PRESSOMETRO     A0
  // # define TRIMMER         A1
   # define START           3
   # define INIETTORE       4
   # define SCARTA          5
   # define PISTONE         6

   long ValPressione = 0;
   long ValRif= 500;


   void setup() 
   {  pinMode(PRESSOMETRO,   INPUT);    
      //pinMode(TRIMMER,       INPUT);
      pinMode(START,         INPUT);
      pinMode(INIETTORE,    OUTPUT); 
      pinMode(SCARTA,       OUTPUT);
      pinMode(PISTONE,      OUTPUT);
      Serial.begin(9600); 
    Serial.println("   Premi START per simulare la presenza della bottiglia"); } 
 
   void loop() {
 
  
   int valoreSTART = digitalRead(START);

        if (valoreSTART == HIGH)
           { Serial.println("   BOTTIGLIA IN POSIZIONE");
             digitalWrite (PISTONE,HIGH);
             Serial.println("   ");
             Serial.println("   PISTONE GIU'");
             Serial.println("   Il Pistone combacia con il collo della bottiglia");
             delay(5000);
             
             digitalWrite(INIETTORE, HIGH); 
             Serial.println("   ");
             Serial.println("   INIETTORE ON");
             Serial.println("   Elettrovalvola compressore d'aria aperto.");
             Serial.println("   Portare A0 al max per simulare la pressione di prova.");
             delay (5000);
                                    
             ValPressione = analogRead(PRESSOMETRO); 
             Serial.println("   ");
             Serial.print("   PRESSIONE INIETTATA       ");
             Serial.println(ValPressione);
            // ValRif = analogRead(TRIMMER);            
             Serial.print("   PRESSIONE RIFERIMENTO     ");
             Serial.println(ValRif);
             delay(5000);
             
             if (ValPressione >= ValRif)              
                { Serial.println("   ");
                  digitalWrite(INIETTORE,LOW);
                  Serial.println("   INIETTORE OFF");
                  Serial.println("   Portare A0 al Min. per simulare perdita di pressione.");
                  Serial.println("   A0 rimane al MAX. per simulare la NON perdita di pressione. ");
                  delay(5000);                       
                
                  ValPressione = analogRead(PRESSOMETRO);
                  Serial.println("   ");
                  Serial.print("   PRESSIONE MISURATA        ");
                  Serial.println(ValPressione);
                 //ValRif = analogRead(TRIMMER); 
                  Serial.print("   PRESSIONE RIFERIMENTO     ");
                  Serial.println(ValRif);
                  delay(5000);
                 
                  if (ValPressione < ValRif)
                     { digitalWrite(SCARTA,HIGH);
                       Serial.println("   ");
                       Serial.println("   BOTTIGLIA SCARTATA");
                       Serial.println("   PISTONE SU"); } 
                    
                  
                  if (ValPressione >=ValRif)
                     { digitalWrite(PISTONE ,LOW);
                       Serial.println("   ");
                       Serial.println("   BOTTIGLIA OK");
                       Serial.println("   PISTONE SU");
                       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.