Elektronik / Mikrodenetleyici Projeleri/

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

Sponsorlu Bağlantılar

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.1fFxxxxx\r",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 Sıcaklık Nem Basınç Kaydedici

Dosya indirme LINK listesi (HTML formatında) link-10780.zip şifre-pass: 320volt.com

  • halit

    mrb muhammet hocam ben sizin söyle diginizi de denedim. devre yine çalışmıyor. ne yapacagımı bilmiyorum. acaba yine yanlış bir baglantısımı var onuda çözemedim. bu devrenin fotograflarını derya arkadaşa gönderirken banada göndere bilirmisiniz rica etsem. meilim: (halit_1071@hotmail.co) ilgilendiginiz için teşşekkür ederim iyi çalışmalar..

  • muhammet

    gelmedi isteğin tekrar bak istersen ?

  • Konyali

    Arkadaşlar devredeki tek eksik PIC’in altındaki GND hattının besleme GND sine bağlanmaması. PIC’in GND ucunu toprağa bağlamanız yeterli.Zaten devredeki tüm toprak hattı PIC’in 12. ucunda birleşiyor 12. ucu toprağa beğladığınızda çalışır.

  • özkan

    ışık nem ve sıcaklık ölçerek bunları pcde görebilicegim bir sisteme ihtiyacım var bu konuda bana yardımcı olurmusunuz

  • BERAT

    ben bu programı açamadım hata veriyor win7 ultimate kullanıyoum

  • Konyali

    @BERAT
    Keşke nasıl bir hata verdiğini belirtseydin:(
    Program VB6 kullanılarak yazıldığı için bazı ocx ve dll dosyalarında problem çıkabiliyor. Uyumluluk modunu XP SP2 ayarlayın ve yönetici modunda çalıştırmayı deneyin

  • egeli

    biz mekatronik 2 öğrencisiyiz bu projeyi yapamya karar verdık ama C de yazılmış iki program var hangisini yazacağız.LCD.c ne işe yarıyor onu anlamdık alt yapımız zayıf derslerımiz uygulamasız yüzeysel lütfen yardımcı olurmusunuz engin bilgilerinizle bizide aydınlatırsanız çok makbule geçersiniz. bizde kendimizi geliştrmek için bir şeyler yapmak istiyoruz… bu hafta içinde yardımcı olursanız çok makbule geçersiniz. proje araştrdık en aklımıza yatan bu oldu şimdiden teşekkür ederiz saygılarmızla…

  • BERAT

    pc aşağıda ki hatayı veriyor

    component-mscomm32-ocx-or-one-of-its-dependencies-not-correctly-registered

  • Konyali

    @Berat
    “MSCOMM32.OCX dosyası kaydedilmemiş,dosya kayıp yada geçersiz”
    MSCOMM32.OCX dosyasını C:\Windows\System32 içine at ve Çalıştır (Yada Bul) programına “regsvr32 mscomm32.ocx” yazıp enter tuşuna bas olumlu bir uyarı alırsan program çalışacaktır olumsuz bir uyarı alırsan yönetici modunda çalıştırmayı dene

  • ogrenci

    Run time error “8002”
    invalid port number
    hatası alıyorum sebebi ne olabilir?

  • blacknirvana

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

  • emin

    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

  • yasin

    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?

  • selçuk

    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

  • CİHAT KURT

    KONYALI HOCAM TEŞEKKÜR EDİYORUM.

  • Serkan

    Merhabalar ben bu devreyi yapmaya karar verdim ama mpx5100 basınç sensörünü bualmadım. Onun yerine mpx5700 önerdiler kullanmAm bu devrede olur mu

  • Serkan

    Merhabalar öncelikle bu devreyi bizimle paylaştığınız için teşekkür ederim. Devreyi yaptım çalıştırdım fakat bilgisayara bağladığımda Run-time error’8012′
    the device not open hatası veriyor yardımcı olursanız çok sevinirim. Şimdiden teşekkür ederim…

  • eee

    hocam MSCOMM32.OCX indirdigim dosyada yok pc programı calısmıyor yardımcı olursanız sevınırım

  • Cihan

    Basınç sensörü ve LCD ye gerek duymadığım sadece sıcaklık bilgisini karşı tarafa RF ile aktarabileceğim bir devreye ihtiyacım var.Bu devrede sadece pt100 den değer alıp karşıya aktaracak durumda düzenleme şansımız varmıdır ?Bu konuda yardımcı olurmusunuz
    teşekkürler

  • ERSİN

    merhaba hocam bu devreyle birden fazla cihaz kontrol edebilirmiyiz ben soğutma işiyle ilgileniyorum birden fazla cihaz oluyor hepsinin ayrı ayrı nem ve ısısını pc üzerinden kontol ve kayıt etmek istiyorum bu mümkünmüdür

  • Mahmut Baş

    aynı cihazın üzerine bir led koyup nem miktarı düşünce yakılacak bu şekilde bir proje ödevim var onu nasıl yapabilirim pc yazılımında da yardımcı olabilirmisiniz

  • Kerem Özkök

    Bu projenin aresi varmı acaba elinizde

  • Semih

    Alt gorunus baski devre dosyanin icindemi.dsn uzantili dosyayi nasil acariz