PIC Vietnam

Go Back   PIC Vietnam > Robotics > Cảm biến

Tài trợ cho PIC Vietnam
Trang chủ Đăng Kí Hỏi/Ðáp Thành Viên Lịch Bài Trong Ngày Vi điều khiển

Cảm biến Camera, siêu âm, hồng ngoại, gyro, la bàn...

Trả lời
 
Ðiều Chỉnh Xếp Bài
Old 16-04-2012, 11:40 PM   #1
tungds
Nhập môn đệ tử
 
Tham gia ngày: Mar 2011
Bài gửi: 3
:
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
File Kèm Theo
File Type: rar Project_sht11.rar (190.9 KB, 198 lần tải)
tungds vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 17-04-2012, 11:50 AM   #2
tdm
Đệ tử 7 túi
 
Tham gia ngày: May 2005
Bài gửi: 258
:
Trích:
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 đề.
tdm vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Old 20-04-2012, 12:14 PM   #3
tungds
Nhập môn đệ tử
 
Tham gia ngày: Mar 2011
Bài gửi: 3
:
hay quá, thanks bác nhiều nhe :X
tungds vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn
Trả lời


Quyền Sử Dụng Ở Diễn Ðàn
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Mở
Smilies đang Mở
[IMG] đang Mở
HTML đang Tắt

Chuyển đến


Múi giờ GMT. Hiện tại là 03:21 PM.


Được sáng lập bởi Đoàn Hiệp
Powered by vBulletin®
Page copy protected against web site content infringement by Copyscape
Copyright © PIC Vietnam