Picproje Elektronik Sitesi

DERLEYİCİLER => MikroC - PIC => Konuyu başlatan: koray692 - 31 Mayıs 2017, 21:03:17

Başlık: kod - dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: koray692 - 31 Mayıs 2017, 21:03:17
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);
}
Başlık: Ynt: [code] kod [/code]- dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: mehmet - 31 Mayıs 2017, 23:29:58
[ code]Bu şekilde olmalı...[ /code]

Bu şekilde olmalı...
Başlık: Ynt: [code] kod [/code]- dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: cemilkendir - 31 Mayıs 2017, 23:50:51
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.
Başlık: Ynt: [code] kod [/code]- dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: koray692 - 01 Haziran 2017, 09:43:59
çö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
Başlık: Ynt: [code] kod [/code]- dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: cemilkendir - 01 Haziran 2017, 10:05:03
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)
Başlık: Ynt: [code] kod [/code]- dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: koray692 - 01 Haziran 2017, 10:57:41
sensörün üzerinde adsong yazıyor
Başlık: Ynt: kod - dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: muhittin_kaplan - 01 Haziran 2017, 11:38:14
Dht11 kusurat vermez. Dht22 verir
Başlık: Ynt: kod - dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: Murat Mert - 01 Haziran 2017, 12:01:19
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.
Başlık: Ynt: kod - dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: koray692 - 01 Haziran 2017, 14:00:53
teşekkürler..Peki sizce hangi sensörü kullanmalıyım kuluçka makinesi yapmak için.
Başlık: Ynt: kod - dht11 ısı nem okuma küsuratlı olmuyor
Gönderen: muhittin_kaplan - 01 Haziran 2017, 20:06:54
dht22, yeterli.