1000 kişiden bir kişi için ! devam.... 320volt blog

Elektronik Devreler Projeler » Microchip PIC devreleri bilgiler, Yazar Projeleri Makaleler Elektronik Genel »

Kablosuz Sıcaklık Nem Basınç Kaydedici

kablosuz-sicaklik-nem-basinc-kaydedici

16F877, SHT11 ve MPC5100 sensörlerinin kullanıldığı bu devrede Sıcaklık,nem ve basınç değerleri ölçülerek seri port üzerinden PC’ye aktarılır ve hazırlanan arayüz programı aracılığıyla grafiksel olarak gösterilir ve veritabanına kaydedilir. Devre üzerinde bulunan RS232 donanımı üzerinden kablo ile veri iletilebileceği gibi RF modüller kullanılarak kablosuzda veri iletilebilir. Devre tasarımı Proteus ISIS ve ARES kullanılarak hazırlanmıştır. PIC kodları CCS C programında PC arayüz programı ise Visual Basic 6.0 programında hazırlanmıştır.

pic16f877-SHT11-MPC5100-isi-nem-basinc pic16f877-SHT11-MPC5100-isi-nem-basinc-2 pic16f877-SHT11-MPC5100-isi-nem-basinc-3 pic16f877-SHT11-MPC5100-isi-nem-basinc-4

Kablosuz Sıcaklık Nem Basınç Kaydedici (Malzemeler)



MALZEME ADET
16F877 1
16X2 LCD 1
MAX232 2
MPX5100 BASINÇ SENSÖRÜ 1
SHT11 NEM SENSÖRÜ 1
RF ALICI MODÜL 1
RF VERİCİ MODÜL 1
7805 REGÜLATÖR 2
1N4004 DİYOD 1
1N4148 DİYOD 2
1uf KONDANSATÖR 8
220uF KONDANSATÖR 1
100nF KONDANSATÖR 1
47uF KONDANSATÖR 1
4MHz KRİSTAL 1
33pF KONDANSATÖR 2
10K ? POT 1
10K ? DİRENÇ 4
1K ? DİRENÇ 2
330? DİRENÇ 2
KIRMIZI LED 1
YEŞİL LED 1
D-SUB 9 PİN DİŞİ KONNEKTÖR 2
RS232 KABLO 1
DİĞER

Kablosuz Sıcaklık Nem Basınç Kaydedici (Devre ve Baskı Devre Şeması)

kaydedici-isis-SHT11-MPC5100 sicaklik-nem-basinc-kaydedici-SHT11-MPC5100 SHT11-MPC5100-pcb

Kablosuz Sıcaklık Nem Basınç Kaydedici (PC Programı)

SHT11-MPC5100-program-ayarlar

PC programında öncelikle PORT AYARLARI yapılarak AYARLARI UYGULA butonuna tıklanır. Böylece Devremiz ve program arasında iletişim ayarları yapılmış olur. Daha sonra BAĞLAN butonuna tıklanarak devreye bağlanılır ve veri almaya başlanır.

Alınan veriler gerekli filtrelerden geçirilerek (Devreden xxxxS???N???B???Fxxxx şeklinde veri gönderilir.) pencerede gerekli yerlere yazılır. Kayıt Aralığı kısmında belirtilen aralıklarla veriler tazelenir,veritabanına kaydedilir ve grafiklere yansıtılır. Program her açılışta kendi dizininde bulunan veri.mdb dosyasını okuyarak grafik oluşturur.

Kod.c İçeriği

//**********************************************************
//* Proje:PIC16F877 ile Sıcaklık-Nem-Basınç Ölçümü ve RF ile PC'ye aktarılması *
//* Kullanılan sensörler:SHT11,MPX5100                                         *
//* Tarih:28.06.2010-12.07.2010                                                *
//**********************************************************

// Denetleyici konfigürasyon ayarları
#include <16F877.h>     // Kullanılacak denetleyicinin başlık dosyası tanıtılıyor.
#device ADC=10          // 10 bitlik ADC kullanılacağı belirtiliyor.
#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD
#use delay (clock=4000000) // Gecikme fonksiyonu için kullanılacak osilatör frekansı belirtiliyor.
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io(e)            //Port yönlendirme komutları E portu için geçerli
#use fast_io(a)            //Port yönlendirme komutları A portu için geçerli
#include <benim_lcd.c>     // lcd.c dosyası tanıtılıyor
#include <stdio.h>
#define sht_data_pin   PIN_c1    //SHT11 data ucu
#define sht_clk_pin    PIN_c0    //SHT11 clock ucu
#INT_AD                          // ADC çevrimi bitti kesmesi
unsigned long int bilgi;
float voltaj;
float basinc;

//***** SHT11 Başlatma *****

void comstart (void)
{
output_float(sht_data_pin);  //data high
output_bit(sht_clk_pin, 0);  //clk low
delay_us(1);
output_bit(sht_clk_pin, 1);  //clk high
delay_us(1);
output_bit(sht_data_pin, 0); //data low
delay_us(1);
output_bit(sht_clk_pin, 0);  //clk low
delay_us(2);
output_bit(sht_clk_pin, 1);  //clk high
delay_us(1);
output_float(sht_data_pin);  //data high
delay_us(1);
output_bit(sht_clk_pin, 0);  //clk low
}

//***** SHT11 yazma fonksiyonu*****

int1 comwrite (int8 iobyte)
{
int8 i, mask = 0x80;
int1 ack;

//Komut gönderilir
delay_us(4);
for(i=0; i<8; i++)
{
output_bit(sht_clk_pin, 0);                          //clk low
if((iobyte & mask) > 0) output_float(sht_data_pin); //data high if MSB high
else output_bit(sht_data_pin, 0);                    //data low if MSB low
delay_us(1);
output_bit(sht_clk_pin, 1);                          //clk high
delay_us(1);
mask = mask >> 1;                                    //shift to next bit
}

//Shift in ack
output_bit(sht_clk_pin, 0);  //clk low
delay_us(1);
ack = input(sht_data_pin);   //get ack bit
output_bit(sht_clk_pin, 1);  //clk high
delay_us(1);
output_bit(sht_clk_pin, 0); //clk low
return(ack);
}

//***** SHT11 veri okuma fonksiyonu *****

int16 comread (void)
{
int8 i;
int16 iobyte = 0;
const int16 mask0 = 0x0000;
const int16 mask1 = 0x0001;

//shift in MSB data
for(i=0; i<8; i++)
{
iobyte = iobyte << 1;
output_bit(sht_clk_pin, 1); //clk high
delay_us(1);
if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
else iobyte |= mask0;
output_bit(sht_clk_pin, 0);                //clk low
delay_us(1);
}

//send ack 0 bit
output_bit(sht_data_pin, 0); //data low
delay_us(1);
output_bit(sht_clk_pin, 1);  //clk high
delay_us(2);
output_bit(sht_clk_pin, 0);  //clk low
delay_us(1);
output_float(sht_data_pin);  //data high

//shift in LSB data
for(i=0; i<8; i++)
{
iobyte = iobyte << 1;
output_bit(sht_clk_pin, 1); //clk high
delay_us(1);
if (input(sht_data_pin)) iobyte |= mask1;  //shift in data bit
else iobyte |= mask0;
output_bit(sht_clk_pin, 0);  //clk low
delay_us(1);
}

//send ack 1 bit
output_float(sht_data_pin);  //data high
delay_us(1);
output_bit(sht_clk_pin, 1);  //clk high
delay_us(2);
output_bit(sht_clk_pin, 0);  //clk low

return(iobyte);
}

//***** SHT11 okuma için bekleme fonksiyonu *****

void comwait (void)
{
int16 sht_delay;

output_float(sht_data_pin);                     //data high
output_bit(sht_clk_pin, 0);                     //clk low
delay_us(1);
for(sht_delay=0; sht_delay<30000; sht_delay++)  // wait for max 300ms
{
if (!input(sht_data_pin)) break;  //if sht_data_pin low, SHT75 ready
delay_us(10);
}
}

//***** SHT11 iletişimini resetleme fonksiyonu *****

void comreset (void)
{
int8 i;

output_float(sht_data_pin);    //data high
output_bit(sht_clk_pin, 0);    //clk low
delay_us(2);
for(i=0; i<9; i++)
{
output_bit(sht_clk_pin, 1);  //toggle clk 9 times
delay_us(2);
output_bit(sht_clk_pin, 0);
delay_us(2);
}
comstart();
}

//***** SHT11 soft-reset fonksiyonu *****

void sht_soft_reset (void)
{
comreset();           //SHT75 communication reset
comwrite(0x1e);  //send SHT75 reset command
delay_ms(15);         //pause 15 ms
}

//***** SHT11 sıcaklık ölçüm fonksiyonu *****

int16 measuretemp (void)
{
int1 ack;
int16 iobyte;

comstart();             //alert SHT75
ack = comwrite(0x03);   //send measure temp command and read ack status
if(ack == 1) return;
comwait();              //wait for SHT75 measurement to complete
iobyte = comread(); //read SHT75 temp data
return(iobyte);
}

//***** SHT11 nem ölçüm fonksiyonu *****

int16 measurehumid (void)
{
int1 ack;
int16 iobyte;

comstart();            //alert SHT75
ack = comwrite(0x05);  //send measure RH command and read ack status
if(ack == 1) return;
comwait();             //wait for SHT75 measurement to complete
iobyte = comread();    //read SHT75 temp data
return(iobyte);
}

//***** SHT11 sıcaklık & nem hesaplama fonksiyonu *****

void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue)
{
float  rh;

//calculate temperature reading
tc = ((float) temp * 0.01) - 40.0;

//calculate Real RH reading
rh = (float) humid;

rhlin = (rh * 0.0405) - (rh * rh * 0.0000028) - 4.0;

//calculate True RH reading
rhtrue = ((tc - 25.0) * (0.01 + (0.00008 * rh))) + rhlin;
}

//***** SHT11 sıcaklık &nem ölçme ve hesaplama fonksiyonu *****

void sht_rd (float & temp, float & truehumid)
{
int16 restemp, reshumid;
float realhumid;
restemp = 0; truehumid = 0;

restemp = measuretemp();    //measure temp
reshumid = measurehumid();  //measure RH
calculate_data (restemp, reshumid, temp, realhumid, truehumid);  //calculate temp & RH
}

//***** SHT11 başlatma fonksiyonu *****

void sht_init (void)
{
comreset();    //reset SHT75
delay_ms(20);  //delay for power-up
}

//***** MPX5100 okuma fonksiyonu *****
void mpx5100_read(){
set_adc_channel(0);                    // RA0/AN0 ucundaki sinyal A/D işlemine tabi tutulacak
delay_us(20);                          // Kanal seçiminde sonra bu bekleme süresi verilmelidir
bilgi=read_adc();                      // ADC sonucu okunuyor ve bilgi değişkenine aktarılıyor
voltaj=0.0048828125*bilgi;             // Dijitale çevirme işlemine uğrayan sinyalin gerilimi hesaplanıyor
basinc=((voltaj+5*0.085)/(5*0.0090));  //Gerilim değerinden basınç hesaplama formulu
}

//********** ANA PROGRAM FONKSİYONU*******

void main()
{
float restemp, truehumid;
int i=0,k=0;
setup_psp(PSP_DISABLED);        // PSP birimi devre dışı
setup_spi(SPI_SS_DISABLED);     // SPI birimi devre dışı
setup_timer_1(T1_DISABLED); // T1 zamanlayıcısı devre dışı
setup_timer_2(T2_DISABLED,0,1); // T2 zamanlayıcısı devre dışı
setup_CCP1(CCP_OFF);            // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF);  // CCP2 birimi devre dışı
set_tris_C(0xFF);
set_tris_E(0x0F);
set_tris_A(0x0F);
set_tris_D(0x00);

setup_adc(adc_clock_div_32);   // ADC clock frekansı fosc/32
setup_adc_ports(ALL_ANALOG);   // Tüm AN girişleri analog

enable_interrupts(INT_AD);     // AD çevrimi bitti kesmesi tanıtılıyor
enable_interrupts(GLOBAL);     // Tüm kesmeler aktif

lcd_hazirla();                            // LCD hazır hale getiriliyor
sht_init();
delay_ms(500);
lcd_komut(0x01);
output_high(PIN_D7);  //LCD backlight aktif
printf(lcd_veri," ISI-NEM-BASINC");
imlec(2,1);
printf(lcd_veri,"   KAYDEDiCi");
delay_ms(1500);
lcd_komut(0x01);
i=0;

while(1)   // sonsuz döngü
{
sht_rd (restemp, truehumid);
mpx5100_read();

if(i>8){
i=0;
imlec(2,15);
printf(lcd_veri,"->");
printf("xxxxxS%3.1fN%3.1fB%3.1fFxxxxxr",restemp,truehumid,basinc);
imlec(2,15);
printf(lcd_veri,"  ");
}

imlec(1,1);
printf(lcd_veri,"S:%3.1f%cC N:%3.1f%%",restemp,223,truehumid);
imlec(2,1);
printf(lcd_veri,"B:%3.1f kPa",basinc);
delay_ms(100);
i=i+1;
}
}

benim_LCD.c İçeriği

//////////////////////////////////////////////////////////////
//                    benim_LCD.c                           //
// Bu LCD sürücü dosyası 2x16 HD44780 uyumlu LCD'ler        //
// için yazılmıştır. LCD'den sadece okuma yapılacağı için   //
// R/W ucu şaseye bağlanmalıdır. LCD bağlantısı aşağıdadır. //
//////////////////////////////////////////////////////////////
// RB0 D4
// RB1 D5
// RB2 D6
// RB3 D7
// RB4 RS
// RB5 E
// R/W ucu direkt şaseye bağlanacak

#define e   pin_b4 // LCD'nin E ucu RB5 pinine bağlı
#define rs  pin_b5 // LCD'nin RS ucu RB4 pinine bağlı

//****** LCD'ye Komut Gönderme Fonksiyonu **********
void lcd_komut(byte komut)
{
output_b(komut>>4); // Komutun yüksek değerli 4 bitini gönder
output_low(rs);       // LCD komut almak için ayarlandı
output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(2); // 2 msn gecikme veriliyor

output_b(komut&0x0F); // Komutun düşük değerli 4 bitini gönder
output_low(rs);       // LCD komut almak için ayarlandı
output_high(e);        // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(2);        // 2 msn gecikme veriliyor
}

//******* LCD'ye Veri Gönderme Fonksiyonu **********
void lcd_veri(byte veri)
{
output_b(veri>>4);    // Verinin yüksek değerli 4 bitini gönder
output_high(rs); // LCD veri almak için ayarlandı
output_high(e);       // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(1);          // 1 msn gecikme veriliyor

output_b(veri&0x0F); // Verinin düşük değerli 4 bitini gönder
output_high(rs);     // LCD veri almak için ayarlandı
output_high(e);  // E ucu lojik-1'den lojik-0'a çekiliyor
output_low(e);
delay_ms(1);         // 1 msn gecikme veriliyor
}

//******* LCD'de İmlec Konumlandırma Fonksiyonu ********
void imlec(byte satir, byte sutun)
{
if (satir==1)      // Eğer satır değişkeni "1" ise
lcd_komut(0x80|(sutun-1));

if (satir==2)      // Eğer satır değişkeni "2" ise
lcd_komut(0x80|(0x40+(sutun-1)));
}

//********* LCD Başlangıç Ayarları Fonksiyonu ******
void lcd_hazirla()
{
lcd_komut(0x02);// LCD'yi kullanıma hazır hale getir, imleç                // 1.satır 1.sütunda komutu
lcd_komut(0x28);//2 satır, 4 bit iletişim, 5x8 dot matris seçildi
lcd_komut(0x08);//Display kapalı,alt çizgi ve yanıp sönme yok
lcd_komut(0x0C);//Display açık,imleç alt çizgi ve yanıp sönme yok
lcd_komut(0x06);// Her veri yazıldığında imleç bir sağa gitsin
lcd_komut(0x01);// Display sil. İmleç 1.satır 1.sütunda
delay_ms(1);    // 1 msn bekle
}

Uygulamanın Proteus isis, kaynak kod, program dosyaları: kablosuz-sicaklik-nem-basinc-kaydedici.rar

Yazar: Konyalı

Yazarımızın 320volt.com Blog üzerinde şu an okuduğunuz yazı dahil 15 yazısı bulunmaktadır. Yazarımız hakkında bilgileri ve diğer yazılarını görmek için bakınız;

Elektronik

 
  1. blacknirvana says:

    hocam şematik mi doğru pcb mi doğru. ikisi arasında çok fark var.

  2. emin says:

    iyi günler arkadaşlar bu rf alıcı verici modülleri ile ilgili bilgi verebilirmisiniz nerden temin edebiliriz ilginiz için teşekkürler

  3. yasin says:

    mrabalar ben bu cihazın aynısını yapıcam fakat tek fark bilgileri usb ile pc ye aktarmam gerekyior ne yapmalıyım ekstra?

  4. selçuk says:

    selamun aleyküm arkadaşlar bu devrede 18f4550 microdenetleyici kullanmak istiyorum ve usb çıkışlı yapmak istiyorum.Devre şemasını çizdim ama kod bölümünde zorlanıyorum. Yukardaki kodu nasıl usb baglantılı bir yapıya cevire bilirim. yardımcı olurmusunuz

Yorum Sayfaları
1 4 5 6

Yorum yapın

Doğrulama: (kutuyu işaretleyiniz)

  • Lütfen Türkçe imla kurallarına dikkat etmeye özen gösteriniz.
  • Yorumunuz yönetici tarafından kontrol edilmeden yayımlanmaz.
  • Paylaşılan devrelerin malzeme listesini istemeyiniz. Olsa zaten paylaşılırdı şema üzerinden listeyi çıkartabilirsiniz
  • Gavatar sitesine avatarınızı yükleyebilirsiniz.