RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Giúp đỡ về SHT11 và 16f877a +LCD

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • tungds
    Nhập môn đệ tử
    • Mar 2011
    • 3

    #1

    Giúp đỡ về SHT11 và 16f877a +LCD

    E có tham khảo được code ở trên mạng, và đã đọc cái datasheet để viết hàm main hiển thị lên lcd nhưng k hiểu sao giá trị nhiệt độ thì đúng mà độ ẩm lại sai.Mong các bác xem hộ file đính kèm ở dưới.e cũng đã tham khảo 1 số code của sht11 trên mạng thì thấy cái sht11 e down về có thiếu 1 hàm nhưng lúc paste và edit thì có lỗi mà mãi e k sửa được.Bác nào xem hộ e ở file đính kèm phía dưới với ạ. File pdf ở trong chính là cái code e tham khảo để so sánh với code của e.Hình ảnh mô phỏng ạ, cái độ ẩm nó bị âm
    Attached Files
  • tdm
    Đệ tử 7 túi
    • May 2005
    • 258

    #2
    Nguyên văn bởi tungds View Post
    E có tham khảo được code ở trên mạng, và đã đọc cái datasheet để viết hàm main hiển thị lên lcd nhưng k hiểu sao giá trị nhiệt độ thì đúng mà độ ẩm lại sai.Mong các bác xem hộ file đính kèm ở dưới.e cũng đã tham khảo 1 số code của sht11 trên mạng thì thấy cái sht11 e down về có thiếu 1 hàm nhưng lúc paste và edit thì có lỗi mà mãi e k sửa được.Bác nào xem hộ e ở file đính kèm phía dưới với ạ. File pdf ở trong chính là cái code e tham khảo để so sánh với code của e.Hình ảnh mô phỏng ạ, cái độ ẩm nó bị âm
    SHT11.h
    Code:
    ///////////////////////////////////////////////////////////////////////////////
    #define ACK               0
    // Command byte values        adr cmd  r/w
    #define Reset       0x1e   // 000 1111  0     
    #define MeasureTemp 0x03   // 000 0001  1     
    #define MeasureHumi 0x05   // 000 0010  1
    #define WrStatusReg 0x06   // 000 0011  0
    #define RdStatusReg 0x07   // 000 0011  1
    // Define Data & Clock Pins
    #define Data PIN_B4
    #define Sck  PIN_B5
    
    short error, chkCRC, Acknowledge;
    int TimeOut,err;
    
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    long CalcTempValues(long Lx){
     long value;
     float Fx;
    
      Fx=0.01*(float)Lx;
      Fx=Fx-40;
      Value=Fx;
      return(value);
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    long CalcHumiValues(long Lx){
     long Value;
     float Fx, Fy;
    
      Fx=(float)Lx*(float)Lx;
      Fx=Fx*(-0.0000028);
      Fy=(float)Lx*0.0405;
      Fx=Fx+Fy;
      Fx=Fx-4;
      Value=Fx;
      return(value);
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    void TransmitStart(){
    
      output_high(Data);
      output_low(Sck);  delay_us(2);
      output_high(SCK); delay_us(2);
      output_low(Data); delay_us(2);
      output_low(SCK);  delay_us(6);
      output_high(SCK); delay_us(2);
      output_high(Data);delay_us(2);
      output_low(SCK);  delay_us(2);
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    void RST_Connection(){
     int i;
    
      output_high(Data);
      for(i=1;i<=10;++i) {
          output_high(SCK); delay_us(2);
          output_low(SCK);  delay_us(2);
      }
      TransmitStart();
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    void RST_Software(){
    
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    int WriteStatReg(int command){
    
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    int ReadStatReg(int command){
    
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    long ReadValue(){
     byte i, ByteHigh=0, ByteLow=0;
     long Lx;
    
      for(i=1;i<=8;++i){                     // read high byte VALUE from SHT11
         output_high(SCK);
         delay_us(2);
         shift_left(&ByteHigh,1,input(Data));
         output_low(SCK);
         delay_us(2);
      }
      output_low(Data);
           delay_us(2);
      output_high(SCK);
      delay_us(2);
      output_low(SCK);
      output_float(Data);
      delay_us(2);
    
      for(i=1;i<=8;++i){                     // read low byte VALUE from SHT11
         output_high(SCK);
         delay_us(2);
         shift_left(&ByteLow,1,input(Data));
         output_low(SCK);
         delay_us(2);
      }
      output_high(Data);
           delay_us(2);
      output_high(SCK);
      delay_us(2);
      output_low(SCK);
      output_float(Data);
      delay_us(2);
      Lx=make16(ByteHigh,ByteLow);
      return(Lx);
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    void SendCommand(int Command){
     byte i;
    
      for(i=128;i>0;i/=2){
         if(i & Command) output_high(Data);
         else            output_low(Data);
         delay_us(2);
         output_high(SCK);
         delay_us(2);
         output_low(SCK);
      }
      output_float(Data);
      delay_us(2);
      output_high(SCK);
      delay_us(2);
      output_low(SCK);
    }
    
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    long ReadTemperature(){
     short Acknowledge;
     long Lx,Value;
    
      TransmitStart();
      SendCommand(MeasureTemp);
      while(input(Data));
      delay_us(2);
      Lx=ReadValue();                        // Read temperature value
      Value=CalcTempValues(Lx);
      return(Value);
    }
    /////////////////////////////////////////////////////////
    //
    /////////////////////////////////////////////////////////
    long ReadHumidity(){
     long Lx,Value;
    
      TransmitStart();
      SendCommand(MeasureHumi);
      while(input(Data));
      delay_us(2);
      Lx=ReadValue();                        // Read humidity value
      Value=CalcHumiValues(Lx);
      return(Value);
    
    }
    //-----------------------------------------------
    float calc_dewpoint(float h,float t) 
    //-----------------------------------------------
    // calculates dew point 
    // input:   humidity [%RH], temperature [°C] 
    // output:  dew point [°C] 
    { float k,dew_point ; 
       
      k = (log10(h)-2)/0.4343 + (17.62*t)/(243.12+t);
      dew_point = 243.12*k/(17.62-k); 
      return dew_point; 
    }
    main.c
    Code:
    #include <16F877A.H>
    #fuses XT, NOWDT, NOPROTECT, BROWNOUT, PUT, NOLVP 
    #use delay(clock =20000000) 
    #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7)
    #include <LCD.h>    
    #include <math.h>
    #include <sht11.h>
    
    int8 temp=34;  
    lcd_init(); 
    int R;
    float fRh_lin; 
    float fRh_true; 
    float fTemp_true; 
    float fDew_point; 
    long lValue_rh; 
    long lValue_temp; 
    void main() 
    { 
       port_b_pullups(true); 
       lcd_init();  
       RST_Connection();
       delay_ms(2);
     
       lcd_send_byte(0,0x80); 
       printf(lcd_putc "SHT15 Humidity &");
       lcd_send_byte(0,0xC0);  
       printf(lcd_putc " Temperrature   ");
       
       while (TRUE) 
       { 
          fTemp_true=ReadTemperature();
          fRh_true=ReadHumidity();
          fDew_point=calc_dewpoint(fRh_true,fTemp_true);
          printf("T=%3.2f C\r\n",fTemp_true); 
          printf("H=%3.2f%%\r\n",fRh_true); 
          printf("Dew Point: %3.6fC\r\n",fDew_point);
          delay_ms(1000);
          
          lcd_send_byte(0,0x80);  
          printf(lcd_putc "T:%3.2f  ",fTemp_true);
          printf(lcd_putc "H:%3.3f  ",fRh_true);
          lcd_send_byte(0,0xC0);  
          printf(lcd_putc "D/P:%3.6fC",fDew_point);
          delay_ms(1000); 
          
         } 
     
    }
    viết chương trình cho vdk chạy ổn định là cả một vấn đề.

    Comment

    • tungds
      Nhập môn đệ tử
      • Mar 2011
      • 3

      #3
      hay quá, thanks bác nhiều nhe :X

      Comment

      Working...