joi, 30 ianuarie 2014

LM35 + LCD Display + PIC 16F887 ( un mic termometru digital )

Cu ajutorul acestei aplicatii ( proiect ) vom utiliza convertorul analog-digital al microcontroller-ului PIC16F887 ( in general al oricarui tip de microcontroller ).

Ca senzor de temperatura folosesc LM35 ( ieftin si se gasesc oriunde ) ( datasheet ). Acest senzor va scoate pe iesire o tensiune proportionala cu temperatura, iar gama de masurare a temperaturii este: -55 - 150 grade Celsius. Pentru mai multe detalii consultati datasheet-ul .

Pentru afisearea temperaturii vom folosi un display LCD 2x16 ( doua randuri a cate 16 caractere ).

Inainte de a incepe trebuie sa facem o scurta ( foarte scurta ) introducere in ceea ce inseamna convertorul analog-digital ( ADC ).
-un ADC este un circuit electronic care converteste o marime analogica ( tensiune, curent,...etc ) de intrare intr-o marime digitala de iesire.


O caracteristica importanta a unui ADC este rezolutia acestuia, adica numarul de valori pe care poate sa-l furnizeze convertorul la iesirea sa in intervalul de masura. Lucrand cu date binare , rezolutia se va masura in biti.

Ex: daca rezolutia ADC-ului este pe 10 biti, convertorul poate furniza 1024 valori diferite la iesire.

Sa facem cateva calcule pe exemplul nostru:

  •  LM35 - iesirea se modifica cu 10mV la fiecare grad celsius.
  • ADC-ul microcontrollerului nostru este pe 10 biti
  • Tensiunea de referinta Vref = 5V
  • ADCrez = 5V/1024 = 0,004882=4,88mV
Consideram temperatura ambientala 25,5 grade C si stim ca iesirea lui LM35 se modifica cu 10mV /grad C, in aceste conditii va rezulta ca pentru o temperatura de 25,5 tensiunea pe iesirea senzorului ( LM35 ) va fi:

          25,5 * 10mV = 255mV=0,255V.

Cunoscand aceasta tensiune putem sa calculam ce valoare va avea ADC-ul la iesire astfel:

      VALadc = 0,255 V / 0,004882 V = 52,22950.

Dupa ce am calculat VALadc putem sa calculam si tempratura :

      Temp = VALadc *ADCrez (V) / 10 (mV/C ) = 52,22950 * 0,004882 (V) / 0,01 ( V/C ) =  25,5 C

Stiind toate acestea formula Temp va fi folosita si in programul nostru pentru microcontroller.

Schema proiectului :


Codul sursa:

sbit LCD_RS at RB4_bit;
sbit LCD_EN at RB5_bit;
sbit LCD_D4 at RB0_bit;
sbit LCD_D5 at RB1_bit;
sbit LCD_D6 at RB2_bit;
sbit LCD_D7 at RB3_bit;

sbit LCD_RS_Direction at TRISB4_bit;
sbit LCD_EN_Direction at TRISB5_bit;
sbit LCD_D4_Direction at TRISB0_bit;
sbit LCD_D5_Direction at TRISB1_bit;
sbit LCD_D6_Direction at TRISB2_bit;
sbit LCD_D7_Direction at TRISB3_bit;

char message1[] = "Temperatura:";

char tempC[15];

unsigned int tempinC;
float temp_value=0;

void main()
 {
ANSEL = 0x04;     // Selectare port AN2 ca fiind analog
ADCON1=0X80;
TRISA = 0x04;
ANSELH=0;

Lcd_Init();
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);

Lcd_Out(1,1,message1);
Lcd_Chr(2,6,223);
Lcd_Chr(2,15,223);
Lcd_Chr(2,7,'C');

do {
tempinC = ADC_Read(2);
temp_value = tempinC*0.4882;           // formula de calcul a temperaturii

FloatToStr(temp_value,tempC);  // conversia in char a valorii lui temp_value

Lcd_Out(2, 1, tempC);

Delay_ms(1000);
 } while(1);
}


Un mic filmulet demonstrativ:



vineri, 17 ianuarie 2014

NETDUINO - Aplicatii cu led-uri folosind Netduino2

Vom avea la baza proiectul de la articolul " Aplicatii cu Led-uri folosind PIC16F877 partea.I " diferenta fiind doar de numarul de led-uri folosite 5 in cazul nostru.

Plecand de la schema:



SPER CA DATA VIITOARE O SA-MI ACHIZITIONEZ O TABLETA GRAFICA PENTRU A FACE DESENELE MAI BINE !!!!!

Va trebui sa aprindem cele 5 led-uri pe rand ( unul dupa altul ) D1 - D5 si apoi sa le stingem tot pe rand ( unul dupa altul ) D5 - D1.

Modul de creare a unui program este:

Visual C# 2010 Express ------- New Project ------ MicroFramwork ------ Netduino2 application ----- etc.

Folosind cunostintele acumulate din articolulPulsare Led ( onboard) Netduino 2 " codul sursa va arata astfel: 

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;
using Microsoft.SPOT;
using Microsoft.SPOT.Hardware;
using SecretLabs.NETMF.Hardware;
using SecretLabs.NETMF.Hardware.Netduino;

namespace NetduinoApplication1
{
    public class Program
    {
        static OutputPort[] led = new OutputPort[8]; //declaram un vector in care tinem 
                                                                         // minte unde sunt conectate cele 5                                                                                // led-uri
        public static void Main()
        {
            int i;
            led[0] = new OutputPort(Pins.GPIO_PIN_D0, false);  // declararea fiecarui led in 
            led[1] = new OutputPort(Pins.GPIO_PIN_D1, false);  //parte, pinul unde este 
            led[2] = new OutputPort(Pins.GPIO_PIN_D2, false);  //conectat si starea lui initiala
            led[3] = new OutputPort(Pins.GPIO_PIN_D3, false);
            led[4] = new OutputPort(Pins.GPIO_PIN_D4, false);

            while (true)
            {
                for (i = 0; i <= 4; i++) // aprinde fiecare led in parte 
                {
                    led[i].Write(true);
                    Thread.Sleep(300); // asteapta 300 milisecunde
                }                               // acest for se executa de 5 ori ( i=0;i=1,i=2,i=3,i=4 )

                for (i = 4; i >= 0; i--) // stinge fiecare led pe rand in ordine inversa fata de                                                     // aprindere
                {
                    led[i].Write(false);
                    Thread.Sleep(300); // asteapta 300 milisecunde
                }                               // acest for se executa de 5 ori ( i=4;i=3,i=2,i=1,i=0 )
            }


        }

    }

}

Mai jos va prezint un filmulet cu realizarea practica:








duminică, 12 ianuarie 2014

PIC - Folosirea Butoanelor (TouchButton) in aplicatii cu microcontroller PIC

In articolul "Aplicatii cu led-uri folosind PIC16F877 partea I" v-am explicat cum putem sa ne jucam cu led-urile implicit si cu porturile microcontroller-ului. In articolul de azi vom vedea cum ne "jucam" cu butoane si anume vom conecta 3 butoane la microcontoler si cate 8 led-uri la porturile B, C, D. Butoanele vor fi conectate la portul A pinii RA1, RA2, RA3.
La apasarea butonului conecat la pinul RA1 se vor aplrinde led-urile de la portul B, la apasarea butonului conectat la pinul RA2 se vor aprinde led-urile de la portul C si la apasarea butonului conectat la pinul RA3 se vor aprinde led-urile de la portul C.

Mai jos va prezint schema electronica realizata in proteus, unde am facut si simularea:


Pe schema: butonul B1 este conectat la pinul RA1 ---- la apasarea lui se vor aprinde ledurile de la portul B
butornul B2 este conectat la pinul RA2 ---- la apasarea lui se vor aprinde led-urile de la portul C;
butonul B3 este conecat la pinul RA3 ---- la apasarea lui se vor aprinde led-urile de la portul D.
 In continuare va afisez codul sursa a programului:

bit stareB,stareC,stareD;

void main() {

  ANSEL  = 0;                                    // Configureaza pinii AN ca fiind digitali
  ANSELH = 0;
  C1ON_bit = 0;                                  // Dezactiveaza comparatoarele
  C2ON_bit = 0;


  TRISA1_bit=1;
  TRISA2_bit=1;               // seteaza pinii RA1,RA2,RA3 ca fiind de intrare
  TRISA3_bit=1;
  TRISB = 0;
  TRISC = 0;
  TRISD = 0;                                 // Configurare PORTC ca iesire
  PORTB = 0;
  PORTC = 0;
  PORTD = 0;                                  // valoarea Initiala a PORTx
  stareB = 0;
  stareC = 0;
  stareD=0;
  
  while(1) {
    if (Button(&PORTA,1,0,1)) {   PORTB=0xFF;
                                                    stareB = 1;
                                                 }
    if (stareB&&Button(&PORTA, 1, 0, 0)) {
                                                                       PORTB=0x00;
                                                                       stareB=0;
                                                                   }
   if (Button(&PORTA,2,0,1)) {
                                                 PORTC=0xFF;
                                                 stareC=1;
                                              }
    if (stareC&&Button(&PORTA, 2, 0, 0)) {
                                                                       PORTC =0x00;
                                                                       stareC=0;
                                                                   }
    if (Button(&PORTA,3,1,1)) {
                                                 PORTD=0xFF;
                                                 stareD=1;
                                                }
    if (stareD&&Button(&PORTA,3,1,0)) {
                                                                      PORTD=0x00;
                                                                      stareD=0;  
                                                                }
  }
}

In program a aparut functia Button() care are urmatoarea structura:

unsigned short Button(unsigned short *port, unsigned short pin, unsigned short time, unsigned short active_state);
             unde: unsigned short *port : portul la care este conectat butonul;
                      unsigned short pin : pinul la care este conectat butonul;
                      unsigned short time : intarzierea la apasarea butonului in milisecunde;
                      unsigned shortactive_state : starea butonului apasat/neapasat  ( 1/0 );

if(Button(&PORTA,1,0,1))  : daca butonul conecat la portul a ( PORTA ) pinul 1 (RA1) cu intarzierea 0 este apsat (1) executa ceva.