RF Isı ve Nem Algılayıcı
Merhaba Sevigli okurlarim Yeni islerimin yogunlugundan dolayi pek buralara ugrayamiyorum 🙂
ama arada yaptiklarim ile ilgili bir seyler blog'a gireyim istedim.
sizinle su videoyu paylasmak istedim : http://vimeo.com/41487894
RF - SHT - LCD - PIC16F877 - PIC16F84 from Recep Akkoc on Vimeo.
Bu yaptigim devre Micro islemciye uzaktan erisimin (RF modulasyonu ile) ornegini seri iletisimi sht'nin kullanimini birden fazla RS232'nin veya UART protokondeki cihazin kullanimin ornekleyen bir sey oldu.
devrenin icerigi hakkinda iletisime gecmek isterseniz yorum bolumunden veya ozel olarak iletisim sayfasinda bilglerimden ulasabilirsiniz;
Cihazin Alici kit'ndeki malzemelerim
RXN3 315/433.92 MHz Hybrid Receiver,
PIC16F84,
Max232,
4mhz kristal,
10k drenc,
33o ohm drenc,
LED,
button,
(5 tane) 1uf kapasitor,
5V adaptor,
RS232 Connector
Verici devrede ise
TXC1 315/433.92MHZ Hybrid Transmitter,
PIC16F877A,
LCD 2x16,
10K Pot,
(3 tane) 10K drenc,
330 Ohm drenc,
LED,
SHT11,
7805,
USB - Adaptor - Pil connectorleri
Tabiki devrelerde saymadigim delikli plaket 🙂 tel, lehim ve disi Pin girisi.
CCS Pic C ile SHT XX serisi kullanimi.
Merhaba sevgili okurlarim bir arkadasimi projesinde kullanmak uzere SHT11 isi ve nem sensorunun kodlarina ihtiyac duymustum cok guzel bir c dosyasina ulastim ve sizinle de paylasmak istedim. Proje bittiginde sitemde yayinlamaktan guru duyacagim cihazin hazir sinifi su sekildedir.
benim sht11.c dosyam
/////////////////////////////////////////////////////////////////////////////// // // // Driver file for SHT75 Temperature & Humidity Sensor // // // // ***** To initialise SHT75 sensor upon power up ***** // // // // Function : sht_init() // // Return : none // // // // // // ***** To measure and caluculate SHT75 temp & real RH ***** // // // // Function : sht_rd (temp, truehumid) // // Return : temperature & true humidity in float values // // // /////////////////////////////////////////////////////////////////////////////// #define sht_data_pin PIN_D7 #define sht_clk_pin PIN_D6 //***** Function to alert SHT75 ***** 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 } //***** Function to write data to SHT75 ***** int1 comwrite (int8 iobyte) { int8 i, mask = 0x80; int1 ack; //Shift out command 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); } //***** Function to read data from SHT75 ***** 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); } //***** Function to wait for SHT75 reading ***** 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); } } //***** Function to reset SHT75 communication ***** 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(); } //***** Function to soft reset SHT75 ***** void sht_soft_reset (void) { comreset(); //SHT75 communication reset comwrite(0x1e); //send SHT75 reset command delay_ms(15); //pause 15 ms } //***** Function to measure SHT75 temperature ***** 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); } //***** Function to measure SHT75 RH ***** 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); } //***** Function to calculate SHT75 temp & RH ***** void calculate_data (int16 temp, int16 humid, float & tc, float & rhlin, float & rhtrue) { float truehumid1, 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; } //***** Function to measure & calculate SHT75 temp & RH ***** 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 } //***** Function to initialise SHT75 on power-up ***** void sht_init (void) { comreset(); //reset SHT75 delay_ms(20); //delay for power-up }
SHT75.C olarak internette geciyor; orjinal olarak SHT75 icin yazilmis olsada SHT11, SHT71 ve SHT15 ilede sorunsuz calisiyor.
PIC16F877 icin ornek kodu asagidaki sekildedir:
#include <16F877A.h> #fuses HS,NOWDT,PUT,NOPROTECT,NOLVP #use delay(clock=20000000) #include<lcd.c> #include<sht75.c> void main() { float restemp, truehumid; lcd_init(); sht_init(); while(1) { sht_rd (restemp, truehumid); lcd_gotoxy(1,1); printf(lcd_putc, "Temp : %3.1f %cC ", restemp, 223); printf(lcd_putc, "\nRH : %3.1f %% ", truehumid); delay_ms(500); //delay 500 ms between reading to prevent self heating of sensor } }
bu kodlarin orjinal hali CCS PIC C forumlarinda mevcuttur. benim kullanmakta oldum expkits urunu olan EX8B2 pic gelistirme bordunda bu kodlari kullanacak olursaniz degistirmeniz gereken bazi bolumler mevcut.
ilk degistirmeniz gereken bolum SHT75.c dosyasinda bulunan
#define sht_data_pin PIN_D7 #define sht_clk_pin PIN_D6
bolumunu kendi data pinimiz ve clock sinyali pinimiz olan C4; C3 ile degistirmeliyiz.
#define sht_data_pin PIN_C4 #define sht_clk_pin PIN_C3
bundan sonraki adimda ise expkitsin LCD data gondermede kullandigi exLCD.c dosyasi ile normal ccs pic cnin LCD.C dosyasi farklidir.
(Bunun expkits bordunun LCD cikisi default portta kullanilmiyim portB ile calismasi icin modifiye edilmis olmasidir)
yani uzun lafin kisasi
#include<lcd.c>
satirini
#include<exlcd.c>
olarak degistirdiginizde yazilimsal olarak expkits'de kullanima hazirsiniz.
DIKKAT : Kullanim esnasinda sorun yasamamaniz icin asagidaki maddelere dikkat ediniz.
- SHT sensorunuz bordun uzerine dogru polarize edilecek sekilde takilmalidir.
(normalde algiliyici yukari bakacak sekilde; ama GND ve VCC nin yerini kontrol etmeniz daha dogru olur) - SWDIP7 deki SDA ve SCK nin ON konumunda olduguna dikkat ediniz.
- Expkits bordunuzun C4 ve C3 PINlerinin PULL DOWN olarak tanimlarsaniz (Normalde 1 basinca 0 olacak sekilde) sorunsuz olcum yaparsiniz.
(Bu adimi atlarsaniz ISI -40, -39 gibi bir sey gosteriyor olacaktir.)