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

Kablosuz Sıcaklık Nem Basınç 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)



MALZEMEADET
16F8771
16X2 LCD1
MAX2322
MPX5100 BASINÇ SENSÖRÜ1
SHT11 NEM SENSÖRÜ1
RF ALICI MODÜL1
RF VERİCİ MODÜL1
7805 REGÜLATÖR2
1N4004 DİYOD1
1N4148 DİYOD2
1uf KONDANSATÖR8
220uF KONDANSATÖR1
100nF KONDANSATÖR1
47uF KONDANSATÖR1
4MHz KRİSTAL1
33pF KONDANSATÖR2
10K ? POT1
10K ? DİRENÇ4
1K ? DİRENÇ2
330? DİRENÇ2
KIRMIZI LED1
YEŞİL LED1
D-SUB 9 PİN DİŞİ KONNEKTÖR2
RS232 KABLO1
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
}

Paylaş:

Yorum Yap