saçma bir giriş…

      Günümüzde sıcaklık ve nem takibi cihazları birçok alanda kullanılır. Bu cihazlar istediğimiz ortamın sıcaklık ve nem değerlerini en doğru şekilde takip etmemizi sağlar. Bu değerleri bilgisayar ortamına aktardığımız taktirde; sıcaklık ve nem değerlerinin ölçülmesini istediğimiz ortamda olmasak dahi uzaktan takip edebiliriz. Ve bu sayede ortamın istediğimiz sıcaklık değerlerine gelmesi için gereken işlemleri yapmamız o ortamda olmadığımız halde mümkün olur.

   Bu cihazlara eczane depoları, soğuk hava depoları ( meyve, et, balık… ) , seracılıkta, tavuk çiftliklerinde ( civcivlerin sağlıklı gelişimi için ), diğer çiftliklerde uzaktan kontrol amaçlı ihtiyaç duyulur. Bu sayede zamandan ve paradan tasarruf sağlanır, her defasında sıcaklık ve nem kontrolü için o ortamda bulunmamıza gerek kalmaz.

PROJEMİZ NASIL ÇALIŞACAK

   Projemiz bilgisayar yardımı ile uzaktan sıcaklık ve nem takibi yapacak. Bunun için genel manada SENSÖR(SHT11) + PIC(sensörden aldığı verileri matematiksel olarak işleyecek) + PC ( uzaktan bilgi erşimini sağlayacak) kullanılacak.

pl2303

Image

rs-232ye nazaran çok daha kullanışlı olan cihaz ne max232 ne de diğer fazlalıklara ihtiyaç duyar. Rx, tx, 5V ve gnd uçlarını kullanarak mikrodenetleyici ile hızlı bir şekilde bağlantınızı yapabilirsiniz.

SHT11 Datasheet (TÜRKÇE)

Image

SHT11

(Nem ve Sıcaklık Sensörü)

  •   Tam kalibre
  •  Dijital çıkış
  •  Düşük güç tüketimi
  • Mükemmel uzun süreli stabilite
  • SMD tipi paketi – lehimlemeye    

Ürün Özeti

   SHT11 Sensirion firmasına ait sayısal çıkış veren sıcaklık ve bağıl rutubet sensörüdür. SHT11 içinde 14 bitlik AD dönüştürücü ve seri haberleşme ünitesi vardır. Algılama sonucu seri haberleşme birimi ile iki kablo üzerinden mikro denetçiye sayısal olarak iletilir. Sıcaklık değeri 14 bit çözünürlükte (varsayılan değerdir, istendiğinde 12 bit seçilebilmektedir) , bağıl rutubet değeri ise 12 bit çözünürlükte (varsayılan değerdir, istendiğinde 8 bir seçilebilmektedir) mikro denetçiye iletilmektedir. -40 °C ile +128 °C sıcaklıkları arasında ± 0.5 °C hata ile sıcaklık ölçümü, ± % 3.5 hata ile de bağıl rutubet ölçümü yapabilmektedir.

Boyutlar

Image

1:GND, 2:DATA, 3:SCK, 4:VDD

Sensör Performansı

– Bağıl Nem

 Image

Image

                                           Bağıl Nem (% RH)

 

Not: Sensör 25 ° C’de maksimum RH-doğruluk sağlar

 

 

 

– Sıcaklık

 Image

 

Image

 

                                                Sıcaklık (° C)

 

 

 

 

 

Genel

 

Image

 

Çalışma Koşulları

Image

Max koşullarda uzun süre çalıştırıldıktan 60 saat sonra stabilitesini tekrar yakalıyor.

Saklama Koşulları

*Sıcaklık 10 ° C – 50 ° C (0-125 ° C sınırlı bir süre için)

*nem 20 – 60% RH

*SHT1x ışığa duyarlı değildir. Direkt güneş ışığı yada yüksek UV ışınlara uzun süreli maruz kaldığında arıza oluşabilir.

*nem algılama kısmında herhangi bir koruyucu zar yoktur aşağıdaki gibi ekleme yapılabilir. Fakat bu hassasiyeti düşürür.

Image

Arayüz Özellikleri

Image

Güç Pinleri (VDD, GND)

SHT1x besleme gerilimi 2.4V – 5.5V aralığında olmalıdır (önerilen besleme gerilimi 3.3V ).

Serial clock input (SCK)

SCK, mikrodenetleyici ve SHT1x arasındaki iletişimi senkronize etmek için kullanılır.

Serial data (DATA)

Sensörden mikro denetleyiciye veri aktarımı için kullanılır.

Image

Elektriksel Özellikler

Image

Image

Image

 

Sensör ile İletişim

Image

Image

***Bağıl nem için ‘00000101’, sıcaklık için ‘00000011’

Bağlantı sıfırlama dizisi

Image

Status Register

               Image

                                                         (Status Register Write)           

Image           

                                                          (Status Register Read)

                Image

           TS = Transmission Start                                                MSB = Most Significant Byte

           LSB = Last Significant Byte                                          LSb = Last Significant Bit

 Image

“0000’0100“0011’0001” = 1073 = 35.50%RH

 

   Image

                                                           (Status Register Bits )

 

Bağıl Nem

Image

Image

                                            (Nem dönüşüm katsayıları)

 Image

Nem Sinyalnin sıcaklık companzasyonu

 Image

Sıcaklık

Image

Image

Çiğ noktası

-40 – 50°C arasında iyi sonuçlar verir.

Image = çiğ noktası

Image

Image

Çevresel stabilite

Image

HTSL = High Temperature Storage Lifetime               TC = Temperature Cycles

UHST = Unbiased Highly Accelerated Stress Test      THB = Temperature Humidity Unbiased

SHT11 C# CODES

 

 

Image

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.IO.Ports;
using System.Diagnostics;

namespace Seri_Port_Terminal
{
public partial class Form1 : Form
{
string Gelen = string.Empty;
string[] ports = SerialPort.GetPortNames();

public Form1()
{
InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
chbCR.Visible = false;
chbLF.Visible = false;
rtbEkran.Visible = false;
/* Pc’ye bağı olan portlar ekleniyor */
foreach (string port in ports)
{
cbComPort.Items.Add(port);
}
/* Baudrateler ekleniyor */
cbBaud.Items.Add(“2400”);
cbBaud.Items.Add(“4800”);
cbBaud.Items.Add(“9600”);
cbBaud.Items.Add(“19200”);
cbBaud.Items.Add(“115200”);
cbBaud.SelectedIndex = 3;
/* Aktif/Pasif resmi ekleniyor */
pbAktifPasif.ImageLocation = “pasif.png”;
}

private void btnBaglan_Click(object sender, EventArgs e)
{
if (SeriPort.IsOpen == false)
{
if (cbComPort.Text == “”)
return;
SeriPort.PortName = cbComPort.Text;
SeriPort.BaudRate = Convert.ToInt16(cbBaud.Text);
try
{
SeriPort.Open();
pbAktifPasif.ImageLocation = “aktif.png”;
}
catch (Exception hata)
{
MessageBox.Show(“Hata:” + hata.Message);
}
}
else
{
rtbEkran.Text = “seriport zaten açık”;
}
}

private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
if (SeriPort.IsOpen == true)
{
SeriPort.Close();
}
}

private void btnKes_Click(object sender, EventArgs e)
{
if (SeriPort.IsOpen == true)
{
SeriPort.Close();
pbAktifPasif.ImageLocation = “pasif.png”;
}
}

private void SeriPort_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
try
{
Gelen = SeriPort.ReadExisting();
this.Invoke(new EventHandler(DisplayText2));

}
catch (Exception hata)
{
MessageBox.Show(“Hata:” + hata.Message);
}
}

private void SeriPort_DataReceived2(object sender, SerialDataReceivedEventArgs e)
{
byte[] buffer;

buffer = new byte[1];

SeriPort.Read(buffer, 0, 0);

}
private void DisplayText2(object sender, EventArgs e)
{

richTextBox1.Text += Gelen;
richTextBox1.SelectionStart = richTextBox1.Text.Length;
richTextBox1.ScrollToCaret();
Gelen = String.Empty;
}

/* private void DisplayText3(object sender, EventArgs e)
{

richTextBox2.Text += Gelen;
richTextBox2.SelectionStart = richTextBox2.Text.Length;
richTextBox2.ScrollToCaret();
Gelen = String.Empty;
}

*/

private void DisplayText(object s, EventArgs e)
{

rtbEkran.Text += Gelen;
rtbEkran.SelectionStart = rtbEkran.Text.Length;
rtbEkran.ScrollToCaret();
Gelen = String.Empty;

}

 

 

private void button1_Click(object sender, EventArgs e)
{
try
{
richTextBox1.BackColor = Color.Red;
if (SeriPort.IsOpen == true)
{
if (chbCR.Checked == true && chbLF.Checked == false)
{
SeriPort.Write(“S” + “\r”);
}
else if (chbCR.Checked == false && chbLF.Checked == true)
{
SeriPort.Write(“S” + “\n”);
}
else if (chbCR.Checked == true && chbLF.Checked == true)
{
SeriPort.Write(“S” + “\r\n”);
}
else
{
SeriPort.Write(“S”);
}
}
else
{
MessageBox.Show(“Bağlantı Yok”);
}

richTextBox1.Text = rtbEkran.Text.ToString() + “°”;

}
catch (Exception)
{

MessageBox.Show(“Bağlantı sorunu”);
}

}

private void button2_Click(object sender, EventArgs e)
{

try
{
richTextBox1.BackColor = Color.Blue;

if (SeriPort.IsOpen == true)
{
if (chbCR.Checked == true && chbLF.Checked == false)
{
SeriPort.Write(“N” + “\r”);
}
else if (chbCR.Checked == false && chbLF.Checked == true)
{
SeriPort.Write(“N” + “\n”);
}
else if (chbCR.Checked == true && chbLF.Checked == true)
{
SeriPort.Write(“N” + “\r\n”);
}
else
{
SeriPort.Write(“N”);
}
}
else
{
MessageBox.Show(“Bağlantı Yok”);
}
richTextBox1.Text = rtbEkran.Text + “%”;
}
catch (Exception)
{

MessageBox.Show(“Bağlantı Sorunu”);
}

}
public void gecikme(int saniye)
{
saniye = (saniye + Convert.ToInt32(DateTime.Now.Second) % 60);
for (; ; )
{
if (saniye == DateTime.Now.Second)
break;
}
}

private void richTextBox1_TextChanged(object sender, EventArgs e)
{

}

private void richTextBox2_TextChanged(object sender, EventArgs e)
{

}

private void chbLF_CheckedChanged(object sender, EventArgs e)
{

}

}

}

sht11 CCS C Compilers codes

Image

 

// #include <16F877.h>
#include <18F452.h>
#device adc=8

#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT //No Power Up Timer
#FUSES PROTECT //Code protected from reads
#FUSES NOBROWNOUT //No brownout reset
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NODEBUG //No Debug mode for ICD
#use delay(clock=4000000)
#use rs232(baud=2400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8) // baud=x rs232 iletişim hızını belirtir.(baud=9600 gibi), 
//xmit=pin rs232 nin veri gönderme ucunu(XT) belirten sabittir. (xmit=pin_A2 gibi)
//rcv=pin rs232 nin veri alma ucunu(RX) belirten sabittir.(rcv=pin_A3 gibi)
//parity=x rs232 iletişimi eşlik biti durumunu bildirir. X yerine N (eşlik biti yok), E(eşlik biti çift),O (eşlik biti tek), yazılabilir.(parity=N gibi)
//invert rs232 iletişim pinlerinin polaritesini değiştirir. yani xmit ile rcv pinleri yer değiştirir.
//ENABLE=pin belirtilen pin veri gönderme boyunca lojik-1 olur. rs485 iletişimde veri göndermeyi başlatma ucu olarak kullanılabilir. (enable=pin_B2)
//FORCE_SW yazılımsal rs232 nin kullanılacağını belirtir. parametre seçildiğinde .iletişim uçları olarak donanımsal uçlar seçilse dahi iletişim yazılımsal olarak yapılır.
//UART1 xmit ve rcv pinleri olarak denetleyici içinde bulunan birinci UART modülü pinlerinin kullanılacağını belirtir.
//UART2 xmit ve rcv pinleri olarak denetleyici içinde bulunan ikinci UART modülü pinlerinin kullanılacağını belirtir.
//STREAM=isim #use rs232() fonksiyonu ile yapılan ayarların belli bir isim altında kaydedilmesini sağlar. bu sayede program başında birden fazla #use rs232() fonksiyonu tanıtılarak değişik iletişim ayarlarında istenilen sayıda rs232 iletişim protokolü belirlenir. program içinde rs232 iletişimi komutlarını kullanırken gönderilecek veya alınacak verinin hangi rs232iletişim ayarında alınıp veya verileceği seçilir.
//RESTART_WDT getc() fonksiyonu veri okumayı beklerken WDT’ı sıfırlayarak WDT’ı denetleyici resetlemesini önler. 
#use fast_io(c)//led
//#include <ds18b20_iklim.c>
#include <math.h>
#include <lcd.c> // projemde lcd yok eklenebilir..
#define sht_data_pin PIN_a3//(Data pin veya input) a3 data
#define sht_clk_pin PIN_a0// a0 clock
//#define sht_data_pin secim
//PIN_a3
//#byte secim=pin_b2
//led NOT: LED PROJEDE YOK
set_tris_c(0x00);
output_c(0x00);
output_high(pin_c0);//led
//led
char al;
float restemp;
FLOAT truehumid;
//FLOAT temp;
unsigned int16 nem,sck;

//SENSÖRÜMÜZÜN KÜTÜPHANESİNİ İLGİLİ SİTEDEN ALDIK..

//SHT75 İLE SHT11 İN KÜTÜPHANESİ AYNIDIR…

//***** SHT75 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
}

//***** SHT75 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);
}

//***** 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; //*******40.0 idi

//calculate Real RH reading
rh = (float) humid;

rhlin = (rh * 0.0405) – (rh * rh * 0.0000028) – 6.0; //**********7 idi

//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
}

#int_rda // RX ucuna veri gelince meydane gelen kesme
void geldi ()
{
disable_interrupts(int_rda); // int_rda kesmesini pasif yap
al=getc(); // RX pini üzerinden alınan karakter “al” değişkenine aktarılır.************ not: getc(),getch(),getchar(),fgetch() fonksiyonları rs232 ara yüzünün alma bitlerinden (RX) bir karakterin gelmesini beklerler, karakter geldiğinde o karakterin değeri ile geri döner. geri dönüş değeri 8 bitlik bir değerdir.

switch (al)
{
case ‘M’ : // Takıldımı diye 2 dak. bir kontrol bilgisi gönderiyor
printf(“Z”); // Takılmadım diye cevap verdi inş.
break;
case ‘S’ : 
//temp=ds1820_read();
//delay_ms(30);
sht_init();
sht_rd (restemp, truehumid);
delay_ms(2);
//printf(“%4lu”, sck);
printf(“%4.2f”, restemp); //İlk N geldiğinde sıcaklığı okumuştu onu aldık.
//printf(“%4F”, temp);
break;
case ‘N’ :
sht_init();
sht_rd (restemp, truehumid);
delay_ms(2);
//nem=truehumid*100;
//printf(“%4lu”, nem);
printf(“%4.2f”, truehumid);
break;
case ‘1’ : 
output_low(pin_b0);
break;
case ‘2’ :
output_low(pin_b1);
break;
case ‘3’ :
output_low(pin_b2);
break;
case ‘4’ :
output_low(pin_b3);
break;
case ‘5’ :
output_low(pin_b4);
break;
case ‘6’ :
output_low(pin_b5);
break;
case ‘7’ :
output_low(pin_b6);
break;
case ‘8’ : 
output_b(0x00);
reset_cpu();
break;
case ‘A’ : 
output_high(pin_b0);
break;
case ‘B’ :
output_high(pin_b1);
break;
case ‘C’ : 
output_high(pin_b2);
break;
case ‘D’ : 
output_high(pin_b3);
break;
case ‘E’ : 
output_high(pin_b4);
break;
case ‘F’ : 
output_high(pin_b5);
break;
case ‘G’ : 
output_high(pin_b6);
break;
default:
output_b(0x00);
reset_cpu();
break;
}
}

void main()
{
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_adc_ports(NO_ANALOGS); // ANALOG giriş yok
setup_adc(ADC_OFF); // ADC birimi devre dışı
setup_CCP1(CCP_OFF); // CCP1 birimi devre dışı
setup_CCP2(CCP_OFF); // CCP2 birimi devre dışı
set_tris_b(0x00);
set_tris_A(0b00000001);
output_b(0x00);
enable_interrupts(GLOBAL); // Aktif edilen tüm kesmelere izin ver
sht_init();
while(1)
{
enable_interrupts(int_rda); // int_rda kesmesi aktif
}