Se afișează postările cu eticheta niq_ro. Afișați toate postările
Se afișează postările cu eticheta niq_ro. Afișați toate postările

sâmbătă, 25 ianuarie 2014

Variator de tensiune pentru bec cu Arduino (VII)

   Dupa cum am scris si in articlul anterior, Smartphone ca telecomanda prin bluetooth pentru Arduino (II), acum am completat partea de variator de tensiune pentru becuri cu incandescenta cu comanda prin bluetooth de pe un telefon cu Android, care era prezentata in articolul Variator de tensiune pentru bec cu Arduino (VI).
   Schemele de conectare sunt combinatia celor 2:
iar modulul notat in schema "AC dimmer unit" are schema:
   Nota: Detalii de realizare a acestuia gasiti in articolul Variator de tensiune pentru bec folosind un Arduino !!!
   Am folosit urmatorul sketch (care nu-i "periat", dar e functional):
/*
AC Light Control
 Updated by Robert Twomey <rtwomey@u.washington.edu>
 Thanks to http://www.andrewkilpatrick.org/blog/?page_id=445 
 and http://www.hoelscher-hi.de/hendrik/english/dimmer.htm
 adapted sketch by niq_ro from
 http://www.tehnic.go.ro 
 http://www.niqro.3x.ro 
 http://nicuflorica.blogspot.com 

IR Remote Kit Test
 Uses YourDuino.com IR Infrared Remote Control Kit 2
 http://arduino-direct.com/sunshop/index.php?l=product_detail&p=153
 based on code by Ken Shirriff - http://arcfn.com
 Get Library at: https://github.com/shirriff/Arduino-IRremote

Bluetooth:
// adapted sketch from http://english.cxem.net/arduino/arduino4.php
*/

#include <LiquidCrystal.h>
// use LiquidCrystal.h library for alphanumerical display 1602
LiquidCrystal lcd(13,12,11,10,9,8);
/*                                     -------------------
                                       |  LCD  | Arduino |
                                       -------------------
 LCD RS pin to digital pin 13          |  RS   |   D13   |
 LCD Enable pin to digital pin 12      |  E    |   D12   |
 LCD D4 pin to digital pin 11          |  D4   |   D11   |
 LCD D5 pin to digital pin 10          |  D5   |   D10   |
 LCD D6 pin to digital pin 9           |  D6   |    D9   |
 LCD D7 pin to digital pin 8           |  D7   |    D8   |
 LCD R/W pin to ground                 |  R/W  |   GND   |
                                       -------------------
*/

#include "IRremote.h"
//-----( Declare Constants )-----
int receiver = 7; // pin 1 of IR receiver to Arduino digital pin 7
//-----( Declare objects )-----
IRrecv irrecv(receiver);           // create instance of 'irrecv'
decode_results results;            // create instance of 'decode_results'
//-----( Declare Variables )-----


#include <TimerOne.h>           // Avaiable from http://www.arduino.cc/playground/Code/Timer1

volatile int i=0;               // Variable to use as a counter
volatile boolean zero_cross=0;  // Boolean to store a "switch" to tell us if we have crossed zero
int AC_pin = 3;                 // Output to Opto Triac
int buton1 = 4;                 // first button at pin 4
int buton2 = 5;                 // second button at pin 5
int dim2 = 0;                   // led control
int dim = 128;                  // Dimming level (0-128)  0 = on, 128 = 0ff
int pas = 8;                    // step for count;
// version: 4m7 (15.04.2013 - Craiova, Romania) - 16 steps, 4 button & LED blue to red (off to MAX) 
// version: 7m6.1 (23.01.2014 - Craiova, Romania) - 16 steps, 2 button & LCD1602

int freqStep = 75;    // This is the delay-per-brightness step in microseconds.

char incomingByte;  // incoming data from serial 9bluetooth)
 
void setup() {  // Begin setup

  Serial.begin(9600); // initialization
  
  irrecv.enableIRIn(); // Start the IR receiver (classic remote)

  pinMode(buton1, INPUT);  // set buton1 pin as input
  pinMode(buton2, INPUT);  // set buton1 pin as input
  pinMode(AC_pin, OUTPUT);                          // Set the Triac pin as output
  attachInterrupt(0, zero_cross_detect, RISING);    // Attach an Interupt to Pin 2 (interupt 0) for Zero Cross Detection
  Timer1.initialize(freqStep);                      // Initialize TimerOne library for the freq we need
  Timer1.attachInterrupt(dim_check, freqStep);      
  // Use the TimerOne Library to attach an interrupt

 lcd.begin(16, 2); // set up the LCD's number of columns and rows: 
 lcd.clear(); // clear the screen
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("16 steps AC"); // print a text
 lcd.setCursor(0, 1); // put cursor at colon 0 and row 1
 lcd.print("dimmer for bulb"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
 lcd.setCursor(1, 0); // put cursor at colon 0 and row 0
 lcd.print("this sketch is"); // print a text
 lcd.setCursor(1, 1); // put cursor at colon 0 and row 1
 lcd.print("made by niq_ro"); // print a text
 delay (3000);
 lcd.clear(); // clear the screen
}

void zero_cross_detect() {    
  zero_cross = true;               // set the boolean to true to tell our dimming function that a zero cross has occured
  i=0;
  digitalWrite(AC_pin, LOW);
}                                 

// Turn on the TRIAC at the appropriate time
void dim_check() {                   
  if(zero_cross == true) {              
    if(i>=dim) {                     
      digitalWrite(AC_pin, HIGH);  // turn on light       
      i=0;  // reset time step counter                         
      zero_cross=false;    // reset zero cross detection
    } 
    else {
      i++;  // increment time step counter                     
    }                                
  }    
}                                      


//-----( Declare User-written Functions )-----
void translateIR() // takes action based on IR code received

// describing Car MP3 IR codes 
{
  switch(results.value)
  {
  case 0xFFA25D:  
    Serial.println(" CH-            "); 
    break;

  case 0xFF629D:  
    Serial.println(" CH             "); 
    break;

  case 0xFFE21D:  
    Serial.println(" CH+            "); 
    break;

  case 0xFF22DD:  
    {
    Serial.println(" PREV           "); 
    dim=128;
    }
    break;

  case 0xFF02FD:  
    {
    Serial.println(" NEXT           "); 
    dim=0;
    }
    break;

  case 0xFFC23D:  
    Serial.println(" PLAY/PAUSE     "); 
    break;

  case 0xFFE01F:  
    {
    Serial.println(" VOL-           "); 
    if (dim<127)  
   {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
    }
    }
    break;

  case 0xFFA857:  
    {
    Serial.println(" VOL+           "); 
      {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
   }
    break;

  case 0xFF906F:  
    Serial.println(" EQ             "); 
    break;

  case 0xFF6897:  
    {
    Serial.println(" 0              "); 
 //   analogWrite(ledr, 0); 
 //   analogWrite(leda, 0); 
 //   analogWrite(ledv, 0); 
     }
    break;

  case 0xFF9867:  
    Serial.println(" 100+           "); 
    break;

  case 0xFFB04F:  
    Serial.println(" 200+           "); 
    break;

  case 0xFF30CF:  
    {
    Serial.println(" 1              "); 
 //   analogWrite(leda, 255);
    }
    break;

  case 0xFF18E7:  
    {  
    Serial.println(" 2              "); 
 //   analogWrite(ledv, 255);
    }
    break;

  case 0xFF7A85:  
    {
    Serial.println(" 3              "); 
 //   analogWrite(ledr, 255);
    }
    break;

  case 0xFF10EF:  
    {
    Serial.println(" 4              "); 
 //   analogWrite(leda, 122);
    }
    break;

  case 0xFF38C7:  
    {
    Serial.println(" 5              "); 
 //   analogWrite(ledv, 122);
    }
    break;

  case 0xFF5AA5:  
    {
    Serial.println(" 6              "); 
 //   analogWrite(ledr, 122);
    }
    break;

  case 0xFF42BD:  
    {
    Serial.println(" 7              "); 
 //   analogWrite(leda, 0);
    }
    break;

  case 0xFF4AB5:  
    {
    Serial.println(" 8              "); 
 //   analogWrite(ledv, 0);
    }
    break;

  case 0xFF52AD:  
    {
    Serial.println(" 9              "); 
 //   analogWrite(ledr, 0);
    }
    break;

  default: 
    Serial.println(" other button   ");

  }

}

void blustuf()
{
    incomingByte = Serial.read(); // read byte
    if(incomingByte == '0') {
       }
    if(incomingByte == '1') {
    }
    if(incomingByte == '2') {
    }
    if(incomingByte == '3') {
    }
    if(incomingByte == '4') {
    }
    if(incomingByte == '5') {
    }
    if(incomingByte == '6') {
    }
    if(incomingByte == '7') {
    }
  if(incomingByte == 'a') {   //step up
  if (dim<127)  
   {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; 
    }
    }  
  }
  
  if(incomingByte == 's') {  //step down
  if (dim>5)  
   {
    dim = dim - pas;
    if (dim<0) 
    {
      dim=0; 
    }
    }  
  }
 
  if(incomingByte == 'w') {  // power is 100%
    dim=0; 
  }
  if(incomingByte == 'z') {  // power is 0% (off)
    dim=128; 
  }
}

void stelute()
{
if (dim2<1) lcd.print("----------------");
else 
if (dim2<9) lcd.print("*---------------");
else 
if (dim2<17) lcd.print("-*--------------");
else
if (dim2<25) lcd.print("--*-------------");
else
if (dim2<33) lcd.print("---*------------");
else
if (dim2<41) lcd.print("----*-----------");
else
if (dim2<49) lcd.print("-----*----------");
else
if (dim2<57) lcd.print("------*---------");
else
if (dim2<65) lcd.print("-------*--------");
else
if (dim2<73) lcd.print("--------*-------");
else
if (dim2<81) lcd.print("---------*------");
else
if (dim2<89) lcd.print("----------*-----");
else
if (dim2<97) lcd.print("-----------*----");
else
if (dim2<105) lcd.print("------------*---");
else
if (dim2<113) lcd.print("-------------*--");
else
if (dim2<121) lcd.print("--------------*-");
else
if (dim2>127) lcd.print("---------------*");
}


void loop() {  
  digitalWrite(buton1, HIGH);
  digitalWrite(buton2, HIGH);

 if (Serial.available() > 0) blustuf();  // if bluetooth is present

 if (digitalRead(buton1) == LOW)   
   {
  if (dim<127)  
  {
    dim = dim + pas;
    if (dim>127) 
    {
      dim=128; // in vechiul sketch era 127
    }
  }
   }
  if (digitalRead(buton2) == LOW)   
   {
  if (dim>5)  
  {
     dim = dim - pas;
  if (dim<0) 
    {
      dim=0;  // in vechiul sketch era 1
    }
   }
   }
    while (digitalRead(buton1) == LOW) {  }              
    delay(10); // waiting little bit...  
    while (digitalRead(buton2) == LOW) {  }              
    delay(10); // waiting little bit...    

 
// remote
   if (irrecv.decode(&results)) // have we received an IR signal?
  {
    translateIR(); 
    irrecv.resume(); // receive the next value
  }  

 delay (100);
 lcd.setCursor(2, 0); // put cursor at colon 0 and row 0
 lcd.print("power is "); // print a text
 lcd.print(100*(128-dim)/128);
 lcd.print("%    "); // print a text

lcd.setCursor(0, 1); // put cursor at colon 0 and row 1

dim2=128-dim; // variable use for graphics
stelute();
}

   Am facut si 2 filmulete (primul in romana si al doilea in engleza):
ac light dimmer with Arduino (XXI)
ac light dimmer with Arduino (XXII)

sâmbătă, 11 ianuarie 2014

Noii senzori de temperatura MAX31820 fata de "clasicii" DS18B20

  Cautand la Maxim Integrated pe site, am descoperit un senzor nou, MAX31820, care are fisa de catalog (datasheet) si ca prezentare "1-Wire Ambient Temperature Sensor", asa ca am cerut si eu 2 monstre (samples) si, spre uimirea mea, in 3 zile a si sosit tocmai din Filipine:
  La inceput nu mi-am dat seama care e diferenta fata de "clasicul" DS18B20,care are fisa de catalog si are denumirea de "Programmable Resolution 1-Wire Digital Thermometer".
  Diferenta este de gama de masura cu precizie mare de +0,5 grade Celsius, care este la DS18B20 de la -10 pana la +85 grade Celsius, iar la MAX31820 de la +10 pana la +45 grade Celsius, pana si cei 8 biti de identificare ai familiei de senzori este identic 028h.
   Prima data am conectat doar un senzor MAX31280 in paralel cu DS18B20, ca sa-i aflu adresa, folosind 2 sketch-uri, unul fin cel din exemplul de la libraria OneWire si celalalt in care masoara temperaturi si cu un LM35:
 
   Am conectat si pe al doilea senzor MAX31820, folosind cele 2 sketch-uri si am obtinut:
 
   Modul de conectare in paralel este prezentat, de exemplu, in articolul Temperature Sensing using DS18B20 Digital Sensors:
   Primul sketch folosit, in care se folosesc doar senzorii DS1820, respectiv MAX31820, este cel clasic din exemplul de la libraria OneWire, cu mici modificari:
#include <OneWire.h>
// OneWire DS18S20, DS18B20, DS1822 Temperature Example
//
// http://www.pjrc.com/teensy/td_libs_OneWire.html
//
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)

void setup(void) {
  Serial.begin(9600);
}

void loop(void) {
  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;
  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }
  
  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(3000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("  Temperature = ");
  Serial.print(celsius);
  Serial.print(" Celsius, ");
  Serial.print(fahrenheit);
  Serial.println(" Fahrenheit");
  Serial.println("-----------------------");
}
  Al doilea sketch, care masoara si cu un LM35:
// original sketch from http://learn.adafruit.com/tmp36-temperature-sensor/using-a-temp-sensor
// adapted sketch by niq_ro from http://nicuflorica.blogspot.com
// LM35 datasheet: http://www.ti.com/lit/ds/symlink/lm35.pdf
// inspired by http://www.roroid.ro/wiki/pmwiki.php/Main/TermometruCuArduino
// OneWire DS18S20, DS18B20, DS1822 Temperature Example: http://www.pjrc.com/teensy/td_libs_OneWire.html
// The DallasTemperature library can do all this work for you!
// http://milesburton.com/Dallas_Temperature_Control_Library
#include <OneWire.h>


//LM35 Pin Variables
int sensorPin = 0; //the analog pin the LM35 Vout (sense) pin is connected to A0
                        //the resolution is 10 mV / degree centigrade with a
int diodePin = 1;  //pin for measure voltage diode             

 /*
 * setup() - this function runs once when you turn your Arduino on
 * We initialize the serial connection with the computer
 */

// added part by niq_ro
float vmed = 0;
float ve = 0;  

OneWire  ds(10);  // on pin 10 (a 4.7K resistor is necessary)


void setup()
{
  Serial.begin(9600);  //Start the serial connection with the computer
                       //to view the result open the serial monitor 
}
 
void loop()                     // run over and over again
{
 vmed = 0;
 ve=0;
  
 for (int j = 0; j < 10; j++)  {
  
 //getting the voltage reading from the temperature sensor
 int reading = analogRead(sensorPin);  
 int reading1 = analogRead(diodePin);  
    
 // converting that reading to voltage, for 3.3v arduino use 3.3
 float voltage = (reading - reading1) * 5.0;
 voltage /= 1023.0; 
 
 vmed = vmed + voltage;
 delay(200);
 
 }
 ve = vmed/10;
 // print LM35 logo
 Serial.println("--------------------");
 Serial.print("   LM35: ");

/* 
 // print out the voltage
 Serial.print(ve); Serial.println(" volts");
*/

 // now print out the temperature
 float temperatureC = ve * 100 ;  //converting from 10 mv per degree 
                                               //to degrees (voltage) times 100)
 Serial.print(temperatureC); Serial.println(" degrees C");
/* 
 // now convert to Fahrenheit
 float temperatureF = (temperatureC * 9.0 / 5.0) + 32.0;
 Serial.print(temperatureF); Serial.println(" degrees F");
*/
 Serial.println("----------------");
 delay(1000);                                     //waiting a second

// DS18B20 part

  byte i;
  byte present = 0;
  byte type_s;
  byte data[12];
  byte addr[8];
  float celsius, fahrenheit;

  
  if ( !ds.search(addr)) {
    Serial.println("No more addresses.");
    Serial.println();
    ds.reset_search();
    delay(250);
    return;
  }


  Serial.print("ROM =");
  for( i = 0; i < 8; i++) {
    Serial.write(' ');
    Serial.print(addr[i], HEX);
  }

  if (OneWire::crc8(addr, 7) != addr[7]) {
      Serial.println("CRC is not valid!");
      return;
  }
  Serial.println();
 
  // the first ROM byte indicates which chip
  switch (addr[0]) {
    case 0x10:
      Serial.println("  Chip = DS18S20");  // or old DS1820
      type_s = 1;
      break;
    case 0x28:
      Serial.println("  Chip = DS18B20");
      type_s = 0;
      break;
    case 0x22:
      Serial.println("  Chip = DS1822");
      type_s = 0;
      break;
    default:
      Serial.println("Device is not a DS18x20 family device.");
      return;
  } 

  ds.reset();
  ds.select(addr);
  ds.write(0x44, 1);        // start conversion, with parasite power on at the end
  
  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.
  
  present = ds.reset();
  ds.select(addr);    
  ds.write(0xBE);         // Read Scratchpad

  Serial.print("  Data = ");
  Serial.print(present, HEX);
  Serial.print(" ");
  for ( i = 0; i < 9; i++) {           // we need 9 bytes
    data[i] = ds.read();
    Serial.print(data[i], HEX);
    Serial.print(" ");
  }
  Serial.print(" CRC=");
  Serial.print(OneWire::crc8(data, 8), HEX);
  Serial.println();

  // Convert the data to actual temperature
  // because the result is a 16 bit signed integer, it should
  // be stored to an "int16_t" type, which is always 16 bits
  // even when compiled on a 32 bit processor.
  int16_t raw = (data[1] << 8) | data[0];
  if (type_s) {
    raw = raw << 3; // 9 bit resolution default
    if (data[7] == 0x10) {
      // "count remain" gives full 12 bit resolution
      raw = (raw & 0xFFF0) + 12 - data[6];
    }
  } else {
    byte cfg = (data[4] & 0x60);
    // at lower res, the low bits are undefined, so let's zero them
    if (cfg == 0x00) raw = raw & ~7;  // 9 bit resolution, 93.75 ms
    else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
    else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
    //// default is 12 bit resolution, 750 ms conversion time
  }
  celsius = (float)raw / 16.0;
  fahrenheit = celsius * 1.8 + 32.0;
  Serial.print("DS18B20: ");
  Serial.print(celsius); Serial.println(" degrees C");
/*
  Serial.print(fahrenheit); Serial.println(" degrees F");
*/
delay(2000);
}
   Concluzionand, acest tip senzor MAX31820 poate fi folosit ca inlocuitor pentru DS18B20, mai ales daca domeniul de temperatura este cel ambiant (+10..+45 grade Celsius). 
   Am facut si un mic filmulet, ca un rezumat, numit noii senzori MAX31820 fata de DS18B20
   PS: Am desenat si schema de conectare a senzorilor pentru a nu aparea dificulatati in intelegerea modului de conectare:
   Daca se doreste conectarea doar a senzorilor digitali DS18B20 si/sau MAX31280  schema devine:
12.ian.2014
PS2: Am mai pus 2 filmulete (scuze pentru calitatea sunetului):
new MAX31820 vs DS18B20 and Arduino
17.01.2014
PS2: Trebuie sa mentionez ceva, de care am uitat, in datasheet-ul senzorilor MAX31820, se mentioneaza ca tensiunea de alimentare normala este intre 3 si 3,7V deci ar functiona perfect cu microcontroler-e alimentate la tensiunea de 3,3V. Tot in datasheet se mentioneaza ca tensiunea maxima admisa este de 6V, exact ca la DS18B20... Eu le-am alimentat la 5V, cat era la Arduino si au mers perfect.


marți, 10 septembrie 2013

Modul de conectare rapida a unui afisaj LCD1602 (HD44780) la Arduino sau alta placa de dezvoltare

    De multe ori am nevoie de conectarea rapida a unui afisaj LCD cu 16 coloane si 2 randuri si lumina de fundal (1602A, comandat de HD44780 sau echivalent).


    Dispun de o intefata pe protocolul i2c, dar vreau ceva rapid pentru interfatarea paralela.
    Cand am achizitionat placa Arduino, am luat si un afisaj, asa ca am fost nevoit sa-i fac si atunci o interfata, dar nu aveam prea multa experienta cu modul rapid de conectare:
    Toate detaliile se gasesc in articolul Arduino si un afisaj LCD clasic (16 caractere si 2 randuri), iar schema este:
    Am redesenat partea de modul, pastrand optiunea de a putea controla LED-ul de fundal (stins permanent, aprins permanent sau functie de comanda data de pe placa de dezvoltare).

    Dupa cum se observa, vom conecta doar 6 pini digitali si alimentarea, optional putand comanda si lumina de fundal...

24.10.2013
    Cu cablajul facut de Alex
am realizat montajul adaptor:
si l-am pus la afisajul meu de teste:
si o comparatie cu varianta anterioara:
 
si pus la treaba:
 
   Am facut si un filmulet numit LCD1602 with homemade module for connect an Arduino

joi, 29 august 2013

Senzorul de temperatura LM335

    Un senzor de temperatura cu pret acceptabil este LM335, care are o precizie bunicica.
    Fara calibrare, precizia pe tot domeniul de masura de -40..+100 grade Celsius este de +2 grade Celsius, dar poate ajunge si la +5 grade Celsius, iar daca se face calibrare (in datasheet se face la +25 grade Celsius, astfel incat la iesire sa avem 2,982V), precizia creste la +2 grade Celsius pe tot domeniul de masura.
    Schema clasica de conectare este foarte simpla:
iar schema in care se face calibrare:
    cel mai ieftin este cel in capsula TO-92:
    Pentru dimensionarea rezistentei R1 din schema clasica, se tine cont ca senzorul LM335 functioneaza corect cand prin el trece un curent de la 0,4mA pana la 5mA. Un calcul rapid de dimensionare s epoate face astfel: curentul prin senzor de 2mA, caderea de tensiune pe el e de 3V, alimentarea se face de la 5V, deoarece vrem sa-l folosim cu un microcontroler (placa de dezvoltare Arduino), deci rezistenta va avea valoarea de 1kohm:
    Daca vrem sa fim mai meticulosi si sa vedem exact valorile necesare, vom calcula valoarea tensiunii la extremele domeniului de masura, stiind ca formula de calcul a tensiunii functie de temperatura este:
    Pentru limita extrema de jos:
iar pentru cea de sus:
    Verificam daca calculul nostru rapid este bun, pentru o rezistenta de 2kohmi, curentul fiind la jumate fata de cel pentru o rezistenta de 1kohm:
si este bun, deoarece curentul este intre valorile recomandate de fabricant:
.
    Pentru rezistenta de 1kohm:

    Producatorul recomanda calibrarea la o temperatura de 25 grade Celsius, reglajul facandu-se din semireglabil, astfel incat sa avem la iesire o tensiune de:
    Deoarece e greu de obtinut o temperatura de +25 grade Celsius, putem face calibrarea la 0 grade Celsius, prin masurarea temperaturii apei topite de deasupra ghetii (pahar cu apa pus in congelator).

    Schema clasica de conectare, redesenata cu Eagle PCB Software arata asa:
iar o varianta de montaj a unei placute (brick) arata asa:

    Schema, cu calibrare:


13.10.2013
   Uitasem ceva important, adica partea de calcul pentru o placa de dezvoltare Arduino, unde intrarile analogice, cand tensiunea de referinta este de 5V:
deci rezolutia va fi de cca. 0,5 grade Celsius.

  Formula de calcul a temperaturii functie de tensiunea de pe LM-u este:
  Formula de calcul a temperaturii, functie de valoarea citita la o intrare analogica este:


- va urma -