Pages: [1]   Go Down
Print
Author Topic: ช่วยดูให้หน่อยคัฟการใช้ SHT15  (Read 15784 times)
0 Members and 4 Guests are viewing this topic.
zeus
Guest
« on: February 11, 2009, 07:39:05 PM »

ช่วยแนะนำทีครับ ผม มือใหม่

ที่มา จากอันนี้อะคัฟ....

http://www.thaimicrotron.com/PIC/CCS/SHT15/SHT15.htm



ช่วยแนะนำทีครับ แก้ไขตรงใหน

ขอบคุงคัฟ

Logged
zeus
Guest
« Reply #1 on: February 11, 2009, 08:23:00 PM »

ช่วยแนะนำทีครับ ผม มือใหม่

ที่มา จากอันนี้อะคัฟ....

http://www.thaimicrotron.com/PIC/CCS/SHT15/SHT15.htm



ช่วยแนะนำทีครับ แก้ไขตรงใหน

ขอบคุงคัฟ



เอารูปใหม่มาให้คัฟ...

Logged
zeus
Guest
« Reply #2 on: February 11, 2009, 08:41:25 PM »

อันนี้ code คัฟ


//SHT1x Sensor temperature & Humidity
//Read sensor and diaplay to RS232
//Compiler CCS Version 3.249

#case
#include <16F877A.h>
#use delay(clock=4000000)
#fuses XT,PUT,BROWNOUT,NOWDT,NOPROTECT,NOLVP
#use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1)
#include <math.h>


#define SHT1xDATA  PIN_B4
#define SHT1xSCK   PIN_B5
#define noACK 0
#define ACK   1

// SHT1x address=000 is currently supported
// SHT1x command code
                            //adr  command  r/w
#define STATUS_REG_W 0x06   //000   0011    0
#define STATUS_REG_R 0x07   //000   0011    1
#define MEASURE_TEMP 0x03   //000   0001    1
#define MEASURE_HUMI 0x05   //000   0010    1
#define RESET        0x1E   //000   1111    0

// constant use for SHT1x Humidity Measurement
#define C1  -4.0
#define C2  0.0405
#define C3  -0.0000028

// constant use for SHT1x Temperature Measurement
#define D1  -40.0
#define D2  0.01

// constant use for SHT1x True Humidity Measurement
#define T1  0.01
#define T2  0.00008

//PIC16F6X8
#define  CMCON   0x1F
#define  PORTA    0x05
#define  PORTB    0x06


void InitialChip(void);

//SHT1x Transmission Start condition
void SHTStart()
{
   output_high(SHT1xDATA);
   output_low(SHT1xSCK);
   output_high(SHT1xSCK);
   output_low(SHT1xDATA);
   output_low(SHT1xSCK);
   output_high(SHT1xSCK);
   output_high(SHT1xDATA);
   output_low(SHT1xSCK);

}

// SHT1x Connection Reset:
void SHTConReset()
{
int i;

   output_high(SHT1xDATA);

   for (i=0; i<9; i++)
   {
      output_high(SHT1xSCK);
      delay_us(2);
      output_low(SHT1xSCK);
      delay_us(2);
   }
   SHTStart();
}

// SHT1x Address & Command Mode with address=000
int SHTWrite(int Data)
{
int i;

   for (i=0x80;i>0;i/=2)        //shift bit for masking data
   {
    if(i&Data){
     output_high(SHT1xDATA);
    }
    else
    {
     output_low(SHT1xDATA);
    }
     delay_us(2);               //Snend Clock each bit
     output_high(SHT1xSCK);
     delay_us(2);
     output_low(SHT1xSCK);
   }

   output_float(SHT1xDATA);     //Change DATA Line to Input
   delay_us(2);

   output_high(SHT1xSCK);       //Clock for Acknowledge
   delay_us(2);

   i= input(SHT1xDATA);         //Get Acknowledge

   output_low(SHT1xSCK);
   delay_ms(250);
   return (i);
}

//Read data from SHT1x
long SHTRead(void)
{
int i;
long lTmp,lVal1,lVal2,lValue;

   lVal1=0;
   lVal2=0;

//get MSB from SHT1x
   for (i=0; i<8; i++)
   {
    lVal1<<=1;
    output_high(SHT1xSCK);          //Send Clock Hight
    lTmp = input(SHT1xDATA);        //Read Data Bit
    //delay_us(2);
    output_low(SHT1xSCK);           //Send Clock Low
    //delay_us(2);

    if(lTmp)
     lVal1|=1;                      //store in lVal1
   }

//Acknowledge routine for Next byte
   output_low(SHT1xDATA);
   output_high(SHT1xSCK);
   //delay_us(2);

   output_float(SHT1xDATA);         //Change to Input
   output_low(SHT1xSCK);
   //delay_us(2);

//get LSB from SHT1x
   for (i=0; i<8; i++)
   {
    lVal2<<=1;
    output_high(SHT1xSCK);          //Send Clock Hight
    lTmp = input(SHT1xDATA);        //Read Data Bit 
    //delay_us(2);
    output_low(SHT1xSCK);           //Send Clock Low
    //delay_us(2);

    if(lTmp)
      lVal2|=1;                     //store in lVal2
   }
   

   lValue = make16(lVal1,lVal2); //Makes a 16 bit number out of two 8 bit numbers.
   return(lValue);
}
// SHT1x Soft Reset
// resets the interface, clears the status register to default values
// wait minimum 11ms before next command
void SHTSoftReset()
{
  SHTConReset();
  SHTWrite(RESET);
}

// calculate dewpoint
float sht1x_calc_dewpoint(float fRh,float fTemp)
{
   float fDewpoint;
   float fLogEW;

   fLogEW = ((7.5*fTemp)/(237.3+fTemp))+log10(fRh)-1.33923;
   fDewpoint = ((0.66077-log10(fLogEW))*(237.3))/(log10(fLogEW)-8.16077);
   return(fDewpoint);
}
void InitialChip(void)
{
    setup_comparator(NC_NC_NC_NC);   //Input Digital
    set_tris_b(0B00000001);
}

// Main Program
void main(void)
{
float fRh_lin;
float fRh_true;
float fTemp_true;
float fDew_point;

long lValue_rh;
long lValue_temp;
int R;

   InitialChip();
   delay_ms(200);

   SHTConReset();

   while(TRUE) {
     
     // delay >11ms before next command
      delay_ms(12);

      SHTStart();                      //@1 start transmission
      R=SHTWrite(MEASURE_TEMP);           //@2 measure temperature
      if(R==1)
      {
       printf("..Sensor Error..\n");
       delay_ms(1000);
       continue;
      }

      lValue_temp = SHTRead();

      // temperature calculation
      fTemp_true = (D1+(D2*lValue_temp));

      // delay 11ms before next command
      delay_ms(12);

      // start transmission
      SHTStart();

      // measure relative humidity
      SHTWrite(MEASURE_HUMI);
      lValue_rh = SHTRead();

      // relative humidity calculation
      fRh_lin = (C1+(C2*lValue_rh)+(C3*lValue_rh*lValue_rh));
      fRh_true = (((fTemp_true-25)*(T1+(T2*lValue_rh)))+fRh_lin);

      // dewpoint calculation 
      fDew_point = sht1x_calc_dewpoint(fRh_true,fTemp_true);
      printf("Tem. = %3.2f C\r\n",fTemp_true);
      printf("Humi. = %3.2f%%\r\n",fRh_true);
      printf("Dew Point: %3.6fC \r\n\r\n",fDew_point);
      delay_ms(1000);   
   }
}
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #3 on: February 11, 2009, 11:35:57 PM »

รูปมันเล็กมากเลยครับ
มีปัญญาอะไรหรือครับ ยังไม่เข้าใจในคำถาม
Logged
HD_EE09
Jr. Member
**
Offline Offline

Posts: 19


Email
« Reply #4 on: February 12, 2009, 09:50:13 PM »

ผมใช้ MPLAB C18 ครับ ใช้การได้ครับทดสอบแล้ว

ถ้าอยากได้ก็บอกนะครับโค๊ดไม่ยากครับ แก้ใขนิดหน่อยก็จะได้เลยครับ

เมลมาก็ได้นะครับ yongyoot_mung@hotmail.com

ได้แนวคิดโปรแกรมจากเว็บนี้แหละครับ (ขอบคุณมากครับ)
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #5 on: February 12, 2009, 11:11:57 PM »

ขอบคุณ คุณ yongyoot มากครับที่มาช่วยเหลืออีกทางหนึ่ง
Logged
zeus
Guest
« Reply #6 on: February 16, 2009, 05:33:04 PM »

อ่า....

ได้ละคับ....

แล้วถ้าต้องการใช้ lcd 2*16 แสดงผล ต้องแก้ตงใหนบ้าง....

ช่วยแนะนำทีครับ...

อีกอย่าง...

วันนี้จ่าย supply ผิดให้เจ้า sht15 (จ่าย 25v) เข้าไป...

ผมต้องซื้อใหม่แล้วใช่ปะคัฟ...



ขอบคุณทุกท่านมากครับ..
Logged
zeus
Guest
« Reply #7 on: February 16, 2009, 06:13:05 PM »

ขอรบกวนอีกนิดคัฟ...

จาก  http://www.thaimicrotron.com/PIC/CCS/SHT15/SHT15.htm

บรรทัดที่ 178-182


void InitialChip(void)
{
    setup_comparator(NC_NC_NC_NC);   //Input Digital
    set_tris_b(0B00000000);
    set_tris_c(0B10000000);
}


ตงนี้คือ เซทให้ บิท c7 เปง output ใช่ปะคัฟ
Logged
smitdh
Administrator
Hero Member
*****
Offline Offline

Gender: Male
Posts: 381


อาจารย์ที่ปรึกษา


« Reply #8 on: February 16, 2009, 09:45:43 PM »

หากต่อไฟเลี้ยงผิดก็คงต้องซื้อใหม่ครับ ทำใจ...

การเขียนออก LCD ก็ต้องแปลงเป็น String ก่อนครับค่อยส่งออก LCD

char buff[12];
.
.
.
จาก printf("T=%3.2f C\r\n",fTemp_true);

ใช้   sprintf(buff,"T=%3.2f C\r\n",fTemp_true);    ทำข้อมูลให้เป็น string เก็บไว้ในตัวแปร buff

จากตัวอย่าง
http://www.thaimicrotron.com/Referrence/LCD/LCD-Module5.htm

ก็ให้ใช้ printf(WriteLCDData,buff);    นำค่าใน buff แสดงออกทาง LCD


ส่วนคำสั่ง
set_tris_c(0B10000000);
ฺ0B หมายถึง ไบนารีครับ 10000000 ทำให้ดูง่ายครับ
C7 เป็น input ครับ
หากเป็น HEX จะเขียนเป็น set_tris_c(0x80);

ต้องการให้บิทใดเป็น อินพุตก็ให้เซ็ทเป็น  1
ต้องการให้บิทใดเป็น เอาต์พุตก็ให้เซ็ทเป็น 0

ส่วนเพิ่มเติมก็คือ
set_tris_c(0B10000000);

ไม่ต้องเซ็ทก็ได้ เพราะเมื่อเราประกาศ
#use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7)

คอมไพล์เลอร์จะเซ็ท PIN_C6 เป็นเอาต์พุต PIN_C7 เป็น อินพุตให้โดยอัตโนมัติ

และทุกๆครั้งที่เราใช้คำสั่ง อินพุต-เอาต์พุต ก็เช่นกัน คอมไพล์เลอร์จะเซ็ท I/O ให้ก่อนเรียกใช้ฟังก์ชั่น
ทำให้ผู้ใช้เคยตัวพอสมควร
แต่สำหรับงานที่ต้องการ อินพุต-เอาต์พุต ความเร็วสูง เราจะต้องประกาศ
#use fast_io (port)

ตรงนี้คอมไพล์เลอร์จะไม่เซ็ท I/O ให้ก่อนเรียกใช้ฟังก์ชั่น อินพุต-เอาต์พุต
เราจะต้องเซ็ทเอง เราเองก็ควรพึงระวังในการใช้ I/O ทุกครั้ง โดยกำหนดค่าตอนเริ่มต้น





« Last Edit: February 17, 2009, 02:12:40 PM by smitdh » Logged
zeus
Guest
« Reply #9 on: February 17, 2009, 06:06:00 PM »

หากต่อไฟเลี้ยงผิดก็คงต้องซื้อใหม่ครับ ทำใจ...

การเขียนออก LCD ก็ต้องแปลงเป็น String ก่อนครับค่อยส่งออก LCD

char buff[12];
.
.
.
จาก printf("T=%3.2f C\r\n",fTemp_true);

ใช้   sprintf(buff,"T=%3.2f C\r\n",fTemp_true);    ทำข้อมูลให้เป็น string เก็บไว้ในตัวแปร buff

จากตัวอย่าง
http://www.thaimicrotron.com/Referrence/LCD/LCD-Module5.htm

ก็ให้ใช้ printf(WriteLCDData,buff);    นำค่าใน buff แสดงออกทาง LCD


ส่วนคำสั่ง
set_tris_c(0B10000000);
ฺ0B หมายถึง ไบนารีครับ 10000000 ทำให้ดูง่ายครับ
C7 เป็น input ครับ
หากเป็น HEX จะเขียนเป็น set_tris_c(0x80);

ต้องการให้บิทใดเป็น อินพุตก็ให้เซ็ทเป็น  1
ต้องการให้บิทใดเป็น เอาต์พุตก็ให้เซ็ทเป็น 0

ส่วนเพิ่มเติมก็คือ
set_tris_c(0B10000000);

ไม่ต้องเซ็ทก็ได้ เพราะเมื่อเราประกาศ
#use rs232(baud=9600,parity=N, xmit=PIN_C6,rcv=PIN_C7)

คอมไพล์เลอร์จะเซ็ท PIN_C6 เป็นเอาต์พุต PIN_C7 เป็น อินพุตให้โดยอัตโนมัติ

และทุกๆครั้งที่เราใช้คำสั่ง อินพุต-เอาต์พุต ก็เช่นกัน คอมไพล์เลอร์จะเซ็ท I/O ให้ก่อนเรียกใช้ฟังก์ชั่น
ทำให้ผู้ใช้เคยตัวพอสมควร
แต่สำหรับงานที่ต้องการ อินพุต-เอาต์พุต ความเร็วสูง เราจะต้องประกาศ
#use fast_io (port)

ตรงนี้คอมไพล์เลอร์จะไม่เซ็ท I/O ให้ก่อนเรียกใช้ฟังก์ชั่น อินพุต-เอาต์พุต
เราจะต้องเซ็ทเอง เราเองก็ควรพึงระวังในการใช้ I/O ทุกครั้ง โดยกำหนดค่าตอนเริ่มต้น







ขอบคุณคัป.......

อันนี้ ผมลองเอามา ผสมกัน...(ยังไม้ได้ลองใช้เลย เพราะ SHT15 เน่าไปแล้ว)

ช่วยดูให้หน่อยนะคัฟ ว่า จะใช้งานได้ป่าว...

แล้วก้อ ...ถ้าต้องการเพิ่ม ให้มี out put ออกไปควบคุมการทำงานของอุปกรณ์

เมื่อ อุณหถูมิ / ความชื้น ถึงระดับที่กำหนด จะต้องเพิ่มเติมยังไงคัฟ...

รบกวนด้วย ผม มือใหม่ ซิงๆ เลย
Logged
Pages: [1]   Go Up
Print
 
Jump to: