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



















hocam cevabınız için teşekkürler o dirençleride koydum daa çalışmadı büyük ihtimalle simülasyonda hata var.
simülasyonada pek güvenmemek lazım zaten. çalışan devre varken en iyisi aynı malzemeleri almak
MPX5100 yerine başka basınç sensörü kullanabilirmiyiz?
@Muhammet
tabiki kullanabilirsin ancak bağlantıları ve pic kaynak kodu içerisindeki mpx5100_read() fonksiyonunu taktığın sensöre göre değiştirmen gerekir.
RF alıcı verici moduller nereden bulabiliriz birde kaç metreye kadar sinyal veriyor
devrenin alttan görünüşünü koyarmısnız lütfen yardımcı olursanız çok sevinirim bir türlü çızemedim baskı devresini parçaları bulamıyorum bazıların çıkmıyor
@Muhammet
RF modülleri direnç.net ten almıştım açık havada 10m kadar veri aktarabiliyordum. Alttan görünüş içinde proje dosyalarının bulunduğu klasörden baskı devreye ait adsız.bmp dosyasını Paint te açın Resim->Döndür/Çevir->Yatay çevir işlemini yaparsanız devrenin ayna görüntüsünü yani alttan görünüşünü elde edersiniz.
Kolay gelsin
atlamaları nasıl silebilirim elinde aresden çizilmiş sadece bakır yolları olan resım var mı yardımcı olursanız sevinirim tek sonurum bu
Merhaba konyalı abi öncelikle bu tasarımınızı yapıpta bizlerle paylaştığınız için size çoook teşekkür ederim fakat ben bunun baskı devresini bir türlü oluşturamadım. Devrenin baskı devresinin sade halini bizimle paylaşırmısınız hocamdan böyle bir devre tasarımı ödevi aldım bu devreyi yapmam lazım yardım ederseniz çok sevinirim. iyi çalışmalar! iyi akşamlar!!
@Halit
Maalesef diğer yazılarımda belirttiğim üzere internette baskı devre paylaşmama kararı aldım. Tasarım ödevi olarak aldığınıza göre teknik eğitim alan bir öğrencisiniz. Baskı devre çıkartmak çok problem olmayacaktır. Baskı devre çizimi ve plakete basma konusunda hem bu sitede hem internette bolca örnek var.
Kolay gelsin
konyalı hocam devreyi yaptım vericinin çıkışında grafiksel olarak gördüm de aynı garafikleri rf alıcının çıkışında göremiyorum yoksa sadece veri mi iletiyor ?
@Osman
Tam olarak sorununuzu anlamadım ama devre sadece Devre->PC çalışıyor yani PC den devreye veri iletimini kablosuz yapamazsınız PC den devreye veri aktarmak için devre üzerinde ki seri haberleşme donanımını kullanın( yani rf modülle değilde direk kart üzerindeki seri porta bağlayın) benim kullandığım rf modüller tek yönlüydü o yüzden mevcut haliyle full duplex bir haberleşme sistemi kuramazsınız
hocam c8 ve c2 kondansatörlerinin bağlantıları doğru mu ?