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.
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ı)
Kablosuz Sıcaklık Nem Basınç Kaydedici (PC Programı)

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; Konyali


















@Osman
evet doğru internetten max232 bağlantılarına bakarak teyit edebilirsiniz.
rf modüllerinlerin ismi nedir..?
hocam kullandığınız rf ler ATX-34 mü?
@Derya
RF modüller ATX-34 değildi tam olarak markasını hatırlamıyorum ama herhangi bir modülle bağlantıları düzenleyerek çalıştırabilirsiniz. Benim modüllerin bağlantısı şu sitede var,
http://www.rentron.com/rf_remote_control.htm
derya www.direnc.net ten alabilirsin rf modullerı kristalli olanı
teşekkürler…
rica ederim malzeme hakkında sorunun oldu mu sorabilirsın bende bu devreyi yapıyorum
direnç.net de bulamadım ismi TWS-34A mı sendemi bunu kullandın
nasıl arayacağız direnç.net de?
konyalı hocam sizin verdiğiniz rentron .com daki rf verici pin diagramında pin 1 gnd pin 2 ise data input görünüyor ama sizin hazırladığınız baskı devreye baktığım da ise tam tersi rica etsem bakabilirmisiniz hangisi doğru yoksa ben mi yanılıyorum….?
http://www.direnc.net/main/433mhz_rf_alici_verici_kristalli-9128-517-498.html ben bunu aldım
@Derya
evet bende şimdi inceledim ve aradaki farkı gördüm. Sanırım yanlış hatırlıyorum projeyi yaparken incelediğim bir siteydi aklımda öyle kalmış. En iyisi siz aldığınız/alacağınız rf modülü breadboard üzerinde test edin öyle kullanın bağlantıları ben datasheet bulamadığım için çeşitli sitelerdeki rf mofül bağlantılarına bakarak deneme yoluyla bulmuştum.
merhaba konyalı hocam devrede kullandıgınız MPX5100 bulamadık onun yerine MPX5010 kullanırsak devre çalışırmı? bize yardım aederseniz seviniriz iyi çalışmalar..