Merhaba arkadaşlar elimde dht11 ile ilgili bir kod var mikroc de yazılmış gayet düzgün çalışıyor kod ama lcd de gördüğüm değerler hep tam sayı küsüratlarını göstermiyor. Küsüratlı değerleri lcd den görmek istiyorum ve küsüratlı değerlere göre mikroişlemciye işlemler yaptırmak istiyorum. Kod üzerinde nasıl bir değişiklik yapmam lazım yardımcı olursanız çok sevinirim.
/*
Project: Temperature and humidity measurements using DHT11
MCU: PIC16F628A
Clock: 4.0MHz external resonator
MCLR is enabled
Date: Jan 10, 2012
Written by: Rajendra Bhatt (www.embedded-lab.com)
*/
// LCD module connections
sbit LCD_RS at RB5_bit;
sbit LCD_EN at RB4_bit;
sbit LCD_D4 at RB3_bit;
sbit LCD_D5 at RB2_bit;
sbit LCD_D6 at RB1_bit;
sbit LCD_D7 at RB0_bit;
sbit LCD_RS_Direction at TRISB5_bit;
sbit LCD_EN_Direction at TRISB4_bit;
sbit LCD_D4_Direction at TRISB3_bit;
sbit LCD_D5_Direction at TRISB2_bit;
sbit LCD_D6_Direction at TRISB1_bit;
sbit LCD_D7_Direction at TRISB0_bit;
sbit Data at RA0_bit;
sbit DataDir at TRISA0_bit;
char message1[] = "Temp = 00.0 C";
char message2[] = "RH = 00.0 %";
unsigned short TOUT = 0, CheckSum, i;
unsigned short T_Byte1, T_Byte2, RH_Byte1, RH_Byte2;
void StartSignal(){
DataDir = 0; // Data port is output
Data = 0;
Delay_ms(25);
Data = 1;
Delay_us(30);
DataDir = 1; // Data port is input
}
unsigned short CheckResponse(){
TOUT = 0;
TMR2 = 0;
T2CON.TMR2ON = 1; // start timer
while(!Data && !TOUT);
if (TOUT) return 0;
else {
TMR2 = 0;
while(Data && !TOUT);
if (TOUT) return 0;
else {
T2CON.TMR2ON = 0;
return 1;
}
}
}
unsigned short ReadByte(){
unsigned short num = 0, t;
DataDir = 1;
for (i=0; i<8; i++){
while(!Data);
TMR2 = 0;
T2CON.TMR2ON = 1;
while(Data);
T2CON.TMR2ON = 0;
if(TMR2 > 40) num |= 1<<(7-i); // If time > 40us, Data is 1
}
return num;
}
void interrupt(){
if(PIR1.TMR2IF){
TOUT = 1;
T2CON.TMR2ON = 0; // stop timer
PIR1.TMR2IF = 0; // Clear TMR0 interrupt flag
}
}
void main() {
unsigned short check;
TRISB = 0b00000000;
PORTB = 0;
TRISA = 0b00100001;
CMCON = 7;
INTCON.GIE = 1; //Enable global interrupt
INTCON.PEIE = 1; //Enable peripheral interrupt
// Configure Timer2 module
PIE1.TMR2IE = 1; // Enable Timer2 interrupt
T2CON = 0; // Prescaler 1:1, and Timer2 is off initially
PIR1.TMR2IF =0; // Clear TMR INT Flag bit
TMR2 = 0;
Lcd_Init();
Lcd_Cmd(_Lcd_Clear);
Lcd_Cmd(_LCD_CURSOR_OFF);
trisa.ra1=0; //////////////////////////////////
do {
Delay_ms(1000);
StartSignal();
check = CheckResponse();
if (!check) {
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "No response");
Lcd_Out(2, 1, "from the sensor");
}
else{
RH_Byte1 = ReadByte();
RH_Byte2 = ReadByte();
T_Byte1 = ReadByte();
T_Byte2 = ReadByte();
CheckSum = ReadByte();
// Check for error in Data reception
if (CheckSum == ((RH_Byte1 + RH_Byte2 + T_Byte1 + T_Byte2) & 0xFF))
{
message1[7] = T_Byte1/10 + 48;
message1[8] = T_Byte1%10 + 48;
message1[10] = T_Byte2/10 + 48;
message2[7] = RH_Byte1/10 + 48;
message2[8] = RH_Byte1%10 + 48;
message2[10] = RH_Byte2/10 + 48;
message1[11] = 223; // Degree symbol
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, message1);
Lcd_Out(2, 1, message2);
}
else{
Lcd_Cmd(_Lcd_Clear);
Lcd_Out(1, 1, "Checksum Error!");
Lcd_Out(2, 1, "Trying Again ...");
}
}
if(T_Byte1 < 22.6)
{
porta.ra1=1;
}
else
{
porta.ra1=0;
}
}while(1);
}
[ code]Bu şekilde olmalı...[ /code]
Bu şekilde olmalı...
Kullandığın sensörün datasheet'ini kontrol ettin mi hiç ?
Resolution (çözünürlük) %1 olabilir. Yani tam sayı olarak çıkış veriyordur.
DHT11 in nem için %5 doğruluk oranı var virgülden sonrasını okusan ne olacak ki. Nemde +-%5 hata yapabilir.
çözünürlüğe 16 bit yazıyor.bana sıcaklık lazım kulucka makinası yapacam.
Temperature
Resolution: 16Bit
Repeatability: ±0.2℃
Range: At 25℃ ±2℃
Response time: 1 / e (63%) 10S
Ben baktığımda iki farklı dht11 buldum. Birisi 8bit diğeri dediğin gibi 16 bit sendeki sensör hangisi acaba ?
8 bitlik olan http://robocraft.ru/files/datasheet/DHT11.pdf (http://robocraft.ru/files/datasheet/DHT11.pdf)
16 bitlik olan https://akizukidenshi.com/download/ds/aosong/DHT11.pdf (https://akizukidenshi.com/download/ds/aosong/DHT11.pdf)
sensörün üzerinde adsong yazıyor
Dht11 kusurat vermez. Dht22 verir
Alıntı yapılan: muhittin_kaplan - 01 Haziran 2017, 11:38:14
Dht11 kusurat vermez. Dht22 verir
aynen++
sen yanlış bakmış olabilirsin. Dht11 nem 0.1 şeklinde çalışmıyor.
teşekkürler..Peki sizce hangi sensörü kullanmalıyım kuluçka makinesi yapmak için.
dht22, yeterli.