จำหน่ายและให้คำปรึกษาเกี่ยวกับการใช้งานบอร์ดไมโครคอนโทรลเลอร์ Arduino, Shield for arduino, Module และ Sensor รุ่นต่างๆ

ปรึกษาเรื่อง SHT15 ครับ

กลุ่มวงจรที่ใช้ Microcontroller Arduino , PIC , AVR ,ETC.

Moderator: gang

ภาพประจำตัวสมาชิก
Calman
Seinor
Seinor
โพสต์: 99
ลงทะเบียนเมื่อ: 01/01/1970 7:00 am
ที่อยู่: อยู่ในซอกลึกลับ....ที่ถูกลืม...หลังบริษัท
ติดต่อ:

โพสต์โดย Calman » 24/02/2007 12:23 pm

คุณ calman ผมก็เป็นคนหนึ่งที่สนใจ เกี่ยวกับ ตัว SHT 15 เช่นกันครับ กำลังคิดทำ project ส่งอาจารย์ อยากจะขอความกรุณารบกวน ขอข้อมูลการใช้ที่เกี่ยวกับไอเจ้า senser ตัวนี้ด้วยครับ
ปล.ผมไม่มีความรุ้เรื่อง ไมโครคอนดโทลเลอร์เลยครับ แต่สนใจด้านนี้มากๆครับ อยากให้ช่วยอนุเคราะห์ความรู้อันมีค่ายิ่งชิ้นนี้ด้วยครับ
ขอบพระคุณเป็นอย่างสูงครับ


ก่อนอื่นเลยต้องเลือก MCU ที่จะใช้ก่อน ส่วนตัวผมเลือก MCS-51 เพราะใช้เป็นอยู่ตัวเดียว
สอง เลือกภาษาที่จะใช้ เช่น C , ASM ,BASIC ส่วนตัวผมเลือก BASIC เพราะ
1.ง่าย
2.เป็นภาษาที่ใช้กันได้กับ VB6(เรียน 1 ภาษา ได้ 2 รูปแบบการใช้งาน)
3. เหมาะสำหรับคนที่งูๆปลาๆอย่างผมเป็นที่สุด
ต้องบอกไว้ก่อนนะครับว่าผมไม่ได้จบวิศวะมานะครับที่จริงไม่เคยเรียนช่างมาด้วยซ้ำ
เพราะฉะนั้น ต้องขอ อภัยหากบางครั้งผมตอบข้อสงสัยไม่ได้
ถ้าอ่านแล้วยังสนใจที่จะทำอยู่เริ่มแรกให้ศึกษา 2 เล่มนี้ก่อนนะครับ

รูปภาพ รูปภาพ

แล้วนี่ก็คือ Code SHT-15 ภาษา Basic ครับ
ผมใช้อันนี้เลยใช้งานได้จริง ไม่มีวาง บัค (ไม่มีส่วนได้เสียอะไรแถมจะโดนด่าฟรีๆอีก)
หากไปต่แล้วใช้งานไม่ได้ต้องลองดู ฮาร์ดแวร์ หรือ เบอร์ MCU ที่ใช้ตรงกับ Reg file หรือเปล่า


โค้ด: เลือกทั้งหมด

'
'             Test sensirion SHT11
'
'       r.0     21/11/03
'
'
$regfile = "Reg51.dat"
'$map
'$sim
$crystal = 11059200
$large
$noramclear
'
'       uso Port
'
'P1.0
'P1.1
'P1.2   Rs  display
'P1.3   En     "
'P1.4   Db4    "
'P1.5   Db5    "
'P1.6   Db6    "
'P1.7   Db7    "
'
'
'P3.0   Rx
'P3.1   Tx
'P3.2   SHT_clock
'P3.3   SHT_data
'P3.4   Led
'P3.5
'P3.6
'P3.7
'
'              constant
'
Const   P1dis           = &B11111111    'disattiva port P1
Const   P3dis           = &B11111111    'disattiva port P3
'
'                                       addr  command  r/w
Const   STATUS_REG_W    = &B00000110   '000    xxxx     x
Const   STATUS_REG_R    = &B00000111   '000    xxxx     x
Const   MEASUR_TEMP     = &B00000011   '000    xxxx     x
Const   MEASUR_HUMI     = &B00000101   '000    xxxx     x
Const   SOFT_RESET      = &B00011110   '000    xxxx     x
Const   Maxtim          = 150          'timeout SHT answer 300ms
'
Const   C1              = -4           'humidity x 12bit
Const   C2              = 0.0405
Const   C3              = -0.0000028
Const   T1              = 0.01
Const   T2              = 0.00008
'
Const   D1              = -40          'temperature x 14bit @ 5v
Const   D2              = 0.01
'
'
Dim Fl_Err     As Bit
Dim Ack_ret    As Bit
'
Dim Tmp1       As Byte
Dim Txx        As Byte
'Dim Crc        As Byte
'
Dim TmpW       As Word
'
Dim TmpSing    As Single
Dim Tmp2Sin    As Single
Dim Result     As Single
'
Dim Strin      As String * 5     'usato per display lcd
'
'RoLed         Alias P3.4
SHT_data      Alias P3.3
SHT_clk       Alias P3.2
'
'
  Config Lcd = 16 * 2
  Config LCDPIN = PIN,DB4=P1.4,DB5=P1.5,DB6=P1.6,DB7=P1.7,E=P1.2,RS=P1.3
'
      P3 = P3dis                  'predispone stato iniziale
      P1 = P1dis
'
      waitms 100
      cls
      waitms 2
      cursor off
      waitms 2
      lcd "Test SHT11"
      wait 2
Stay:
      call SHT_reset
      call SHT_Txstart
      Acc = SOFT_RESET
      call SHT_write
      if Ack_ret = 1 then goto Wrong
      waitms 50                     'tempo per soft reset
'
    do
      cls
      waitms 2
      Txx = MEASUR_TEMP             'send temperature read command
      call Read_SHT
      if Fl_Err = 1 then exit do 'no ack
      TmpSing = TmpW * D2
      TmpSing = TmpSing + D1
      Result = TmpSing              'save x Humidity
      Strin = fusing(TmpSing,###.#)
      lcd "T. "; Strin
      locate 1,11
      waitms 2
      lcdhex TmpW
'
      waitms 100
      locate 2,1
      waitms 2
      Txx = MEASUR_HUMI      'send Humidity read command
      call Read_SHT
      if Fl_Err = 1 then exit do
      TmpSing = TmpW * C3
      TmpSing = TmpSing + C2
      TmpSing = TmpSing * TmpW
      TmpSing = TmpSing + C1      ' RHlinear
      Result = Result - 25
      Tmp2Sin = TmpW * T2
      Tmp2Sin = Tmp2Sin + T1
      Tmp2Sin = Tmp2Sin * Result
      TmpSing = TmpSing + Tmp2Sin
      Strin = fusing(TmpSing,##.#)
      lcd "H. "; Strin
      locate 2,11
      lcdhex TmpW
      wait 3
    loop
'
Wrong:
      cls
      waitms 2
      lcd "Err";
      if Ack_ret = 1 then
         lcd " NACK"
      endif
      If Txx > Maxtim then
         lcd " Timeout"
      endif
      wait 4
      goto Stay
'
'********************************
'          PROCEDURE
'********************************
'
Sub Read_SHT
         Fl_Err = 1              'default error ON
         TmpW = &HFFFE
         call SHT_reset
         call SHT_Txstart
         Acc = Txx               'passa comando
         call SHT_write
         if Ack_ret = 1 then exit sub     'uscita per NACK
         call SHT_answer
         if Txx > Maxtim then exit sub      'uscita per timeout
         call SHT_read           'riceve high byte
         high(TmpW) = Acc
         call SHT_ack            'invia ack di risposta
         call SHT_read           'riceve low byte
         low(TmpW) = Acc
         call SHT_ack
'     P3.4 = 1
         call SHT_read           'riceve crc
'         Crc = Acc
         call SHT_nack           'chiude comunicazione
'     P3.4 = 0
         Fl_Err = 0              'no errors
End sub
'
'
Sub SHT_answer
         Txx = 0
         do
            if SHT_data = 0 then  exit sub
            incr Txx
            waitms 2
         loop until Txx > Maxtim    '300ms per rispondere
End sub
'
' ------------------------------------
'
$asm
'
SHT_reset:
        push  b
        clr   {SHT_clk}         'clock pin low
        setb  {SHT_data}        'data pin high
        mov   b,#9
res1:
        setb   {SHT_clk}        'clock = 1
        nop
        nop
        clr   {SHT_clk}         'clock = 0
        nop
        djnz  b,res1
        pop   b
        ret
'
'
SHT_TXstart:
        setb  {SHT_data}        'data = 1
        clr   {SHT_clk}         'clock = 0
        nop
        setb  {SHT_clk}         'clock = 1
        nop
        clr   {SHT_data}        'data = 0
        nop
        clr   {SHT_clk}         'clock = 0
        push  acc
        pop   acc
        setb  {SHT_clk}         'clock = 1
        nop
        setb  {SHT_data}        'data = 1
        nop
        clr   {SHT_clk}         'clock = 0
        ret
'
'
'scrittura dato in A su sht
SHT_write:
        push   b
        mov    b,#8
Wr1:
        rlc    a               'db7 > Cy
        mov    {SHT_data},c
        setb   {SHT_clk}       'clock = 1
        nop
        nop
        clr    {SHT_clk}       'clock = 0
        djnz   b,Wr1
        setb   {SHT_data}      'data = 1
        setb   {SHT_clk}       'clock = 1
'
        mov    c,{SHT_data}    'read ack
        mov    {Ack_ret},c     'return ack value
        clr    {SHT_clk}       'clock = 0
        pop    b
        ret
'
'lettura dato da SHT
SHT_read:
        push   b
        setb   {SHT_data}      'data = 1
        mov    b,#8
        clr    a
Rd1:
        setb   {SHT_clk}       'clock = 1
        mov    c,{SHT_data}
        rlc    a               'cy > db7
        clr    {SHT_clk}       'clock = 0
        nop
        djnz   b,Rd1
'ritorna dato in acc
        pop    b
        ret
'
SHT_nack:
        setb  {SHT_data}      'data = 0
        sjmp  SHT_na
SHT_ack:
        clr   {SHT_data}      'data = 1
        nop
SHT_na:
        setb  {SHT_clk}       'clock  = 1
        nop
        clr   {SHT_clk}       'clock = 0
        nop
        setb  {SHT_data}      'data = 1
        ret
'
'
'
$end asm
'
.......................คิดค้น.....เพื่อค้นพบ......................
---------------------------------------------------------------------------
.....................Calibration Laboratory....................

อาร์ม

Re: re: ปรึกษาเรื่อง SHT15 ครับ

โพสต์โดย อาร์ม » 25/06/2007 1:57 pm

ใครทำแบบใช้ ภาษา C กะ MCS-51 บ้างครับ
พอมี code มั้ยครับผม

บุคคลทั่วไป

Re: re: ปรึกษาเรื่อง SHT15 ครับ

โพสต์โดย บุคคลทั่วไป » 04/10/2007 4:03 pm

อยากได้ code java ของ sht15 ครับ พอจะมีไหมครับ

ภาพประจำตัวสมาชิก
Rewat6
Rookie
Rookie
โพสต์: 18
ลงทะเบียนเมื่อ: 01/01/1970 7:00 am
ติดต่อ:

Thank you Calman

โพสต์โดย Rewat6 » 13/11/2007 11:52 am

ขอขอบคุณ คุณCalman มากนะครับตอนนี้ผมทำสำเร็จแล้วครับ สุดยอด จริงๆ

BLaCKLiGHt064

โพสต์โดย BLaCKLiGHt064 » 10/01/2008 11:16 pm

ถ้าผมจะใช้คอนโทรเลอร์เป็น ARM7 บอร์ด LPC2148 ละคับ ช่วยหน่อยนะคับ แต่ก็ใช้เซนเซอร์ตัวนี้นะคับ blacklight064@hotmail.com

ภาพประจำตัวสมาชิก
thanatchai_1111
Beginer
Beginer
โพสต์: 26
ลงทะเบียนเมื่อ: 01/01/1970 7:00 am

MCS-51 - SHT-15 - ด้วยภาษาซี

โพสต์โดย thanatchai_1111 » 26/01/2008 12:04 am

ผมเคยตั้งกระทู้ไว้นานแล้ว มาครั้งนี้มีปัญหาเกี่ยวกับโค้ด ไม่ทราบว่าพี่ calman จะช่วยแนะนำให้หน่อยครับ โค้ดนี้มาจากหนังสือของ inex เป็น sht-11 ข้อมูลโดยรวมก็คล้ายกันครับ แต่โค้ดมาแปลงเอาครับ ก็จะมี จากเดิมในหนังสือใช้ P89V51RD2BN ส่วนผมใช้ AT89S8252 คอมไพล์ที่แรกไม่ผ่านครับ error ที่เริ่มประกาศ sbit SCK = P1^0; ผมเลยใส่คอมเมนท์ลองดูก็ผ่านครับ ลองต่อวงจรให้มันทำงาน มันก็แสดงผลแค่ -40 C และ -4 % ไม่ขยับไปใหนเลย เอาหัวแร้งทดลองก็แล้วก็ยังนิ่งครับ จึงอยากจะปรึกษาพี่ครับ


#include <reg8252.h> // Header file register for P89V51RD2BN
#include <intrins.h> // Library for _nop_ function
#include <lcds8252.h> // Library for LCD display

#define MEASURE_TEMP 0x03 // Macro of reading Temperature command
#define MEASURE_HUMI 0x05 // Macro of reading Humidity command

#define TEMP 0 // Macro to select Temperature reading
#define HUMI 1 // Macro to select Humidity reading

#define C1 -4.0 // Constant C1 for Humidity calculation (12-bit resolution)
#define C2 0.0405 // Constant C2 for Humidity calculation (12-bit resolution)
#define C3 -0.0000028 // Constant C3 for Humidity calculation (12-bit resolution)

#define T1 0.01 // Constant T1 for Temperature calculation (14-bit resolution)
#define T2 0.00008 / Constant T2 for Temperature calculation (14-bit resolution)

sbit DATA = P1^1; // Configuration DATA pin
//sbit SCK = P1^0; // Configuration SCK pin

/*********************** Function for delay a few time ***********************/
void wait()
{
char x; // Variable for counter
for(x=0;x<8;x++) // Loop for delay a few time
_nop_(); // Delay 1 machine cycle
}

/*********************** SHT11 writing command function *****************/
void sht11_write(unsigned char value)
{
unsigned char i; // Variable for counter
for(i=0x80;i>0;i/=2) // Loop to shift bit for compare data to sending
{
if(i & value) // Data bit AND operation logic "1"?
DATA = 1; // Send logic "1" to DATA pin
else
DATA = 0; // Send logic "0" to DATA pin
SCK = 1; // Generate clock to SCK pin
wait(); // Wait a few time
SCK = 0;
}
DATA = 1; // Release DATA pin
SCK = 1; // Generate clock to SCK pin
wait(); // Wait a few time
SCK = 0;
}

/*********************** SHT11 reading command function *******************/
char sht11_read()
{
unsigned char i,value;
DATA = 1; // Release DATA pin
for(i=0x80;i>0;i/=2) // Loop to shift bit for compare data to sending
{
SCK = 1; // Generate clock to SCK pin
if(DATA)
value = value | i; // Store data bit
SCK = 0;
}
SCK = 1; // Generate clock to SCK pin
wait(); // Wait a few time
SCK = 0;
DATA = 1; // Release DATA pin
return(value); // Return data reading from SHT11
}

/*********************** SHT11 initial transmittion start function ***********/
void transmission_start(void)
{
DATA = 1; // Set DATA pin
SCK = 0; // Clear SCK pin
wait(); // Wait a few time
SCK = 1; // Set SCK pin
wait(); // Wait a few time
DATA = 0; // Clear DATA pin
wait(); // Wait a few time
SCK = 0; // Clear SCK pin
wait(); // Wait a few time
SCK = 1; // Set SCK pin
wait(); // Wait a few time
DATA = 1; // Set DATA pin
wait(); // Wait a few time
SCK = 0; // Clear SCK pin
}

/*********************** SHT11 connection reset sequence function **************/
void connection_reset()
{
unsigned char i; // Variable for counter
DATA = 1; // First time for DATA pin
SCK = 0; // First time for SCK pin
for(i=0;i<9;i++) // Loop for toggle SCK 9 times
{
SCK = 1; // Generate clock to SCK pin
wait(); // Wait a few time
SCK = 0;
}
transmission_start(); // Transmission start
}

/************* SHT11 readout data function (2 byte) **************/
int sht11_read_measure(unsigned char measure_sel)
{
int value // Variable for storing readout data
transmission_start(); // Start connection
if(measure_sel==TEMP) // Read Temperature?
{
sht11_write(MEASURE_TEMP); // Send Read Temperature command to SHT11
delay(270); // Delay for Temperature reading (14-bit resolution)
}
else if(measure_sel==HUMI) // Read Humidity?
{ // Send command to SHT11
sht11_write(MEASURE_HUMI);
delay(80); // Delay for Humidity reading (12-bit resolution)
}
value = sht11_read(); // Read MSB byte
value<<=8; // Shift bit 8 times before store next byte
value = value + sht11_read(); // Read LSB byte
return(value); // Return readout value from SHT11
}

/************* Function for convert data from sht11 to float value ***********/
float read_HT_float(unsigned char measure_sel)
{
float so_rh, // Variable for storing Humidity readout value
so_t, // Variable for storing Temperature readout value
rh_linear, // Variable for RH linear(Calculate by equation of SHT11 datasheet)
rh_true, // Variable for Humidity(Calculate by equation of SHT11 datasheet)
temp; // Variable for Temperature(Calculate by equation of SHT11 datasheet) so_rh = sht11_read_measure(HUMI); // Store Humidity readout value to so_rh
so_t = sht11_read_measure(TEMP); // Store Temperature readout value to so_t
temp = (so_t*0.01)+(- 40); // Calculate temperature
rh_linear = C1 + (C2*so_rh) + C3*(so_rh*so_rh) ; // Calculate RH linear
rh_true = (temp-25)*(T1+T2*so_rh)+rh_linear; // Calculate humidity
if(measure_sel==TEMP) // Read temperature?
return(temp); // Return temperature (float type)
else if(measure_sel==HUMI) // Read humidity?
return(rh_true); // Return humidity (float type)
}

/********************************* Main Program ******************************/
void main()
{
int h, // Variable for storing Humidity (integer tyep)
t, // Variable for storing Temperature (integer tyep)
old_h, // Variable for storing previous Humidity
old_t; // Variable for storing previous Temperature
lcd_init(); // Initial module LCD
lcd_puts(0x82,"Temp: C"); // Show temperature value
lcd_puts(0xC2,"Humi: %"); // Show humidity value
while(1) // Infinite loop
{
connection_reset(); // Start connection
t = (int)read_HT_float(TEMP); // Read temperature (integer format)
h = (int)read_HT_float(HUMI); // Read humidity (integer format)
if(old_t != t) // Compare previous and new Temperature data equal?
{
lcd_puts(0x88," "); // Clear previous temperature display
inttolcd(0x88,t); // Display new temperature value
}
if(old_h != h) // Compare previous and new humidity data equal?
{
lcd_puts(0xC8," "); // Clear previous humidity display
inttolcd(0xC8,h); // Display new humidity value
}
old_t = t; // Keep temperature value for next comparison
old_h = h; // Keep humidity value for next comparison
}
}
แนบไฟล์
Photo-0012.jpg
Photo-0012.jpg (109.92 KiB) เปิดดู 8809 ครั้ง

ภาพประจำตัวสมาชิก
thanatchai_1111
Beginer
Beginer
โพสต์: 26
ลงทะเบียนเมื่อ: 01/01/1970 7:00 am

โพสต์โดย thanatchai_1111 » 30/01/2008 9:17 pm

ได้คำตอบมาแล้วครับ เพราะว่า ไลบานารีของตัวอย่าง(p89v51rd2) ไม่ได้ประกาศ SCK ไว้ แต่ของที่ผมใช้ (at89s8252) มีการประกาศ SCK ไว้ที่ขาของ P1 มันจึงไปซ้ำกันก็เลย error พอเปลี่ยนชื่อใหม่เท่านั้นก็ผ่าน แต่ก็ยังติดที่ส่วนอื่นอีกไม่รู้ตรงใหนแต่ก็จะพยายามครับ...

ภาพประจำตัวสมาชิก
thanatchai_1111
Beginer
Beginer
โพสต์: 26
ลงทะเบียนเมื่อ: 01/01/1970 7:00 am

โพสต์โดย thanatchai_1111 » 15/02/2008 11:33 pm

ทำสำเร็จแล้วครับ แต่สงสัยว่าพอเอาวงจรของ sht15 ไปรวมกับ microcontroller แล้วมันไม่ทำงานครับ ทั้งที่ต่อเหมือนกัน
แนบไฟล์
Photo-0018.jpg
Photo-0018.jpg (101.08 KiB) เปิดดู 8662 ครั้ง

tookkatameaw

โพสต์โดย tookkatameaw » 12/03/2008 12:09 am

อยากได้ source code เขียนด้วนย mikro c น่ะค่ะ ของ sht-11 พอดีอาจารย์ให้ทำส่ง แต่หนูไม่มีความรู้ด้านนี้เลย....เขียน ADC ได้ก็ดีใจเหมือนได้แก้วแล้ว....ช่วยหน่อยนะคะ...ใกล้ถึงเส้นตายแล้ว nuci_ko@hotmail.com

บุคคลทั่วไป

Re: Thank you Calman

โพสต์โดย บุคคลทั่วไป » 23/04/2008 1:52 pm

Rewat6 เขียน:ขอขอบคุณ คุณCalman มากนะครับตอนนี้ผมทำสำเร็จแล้วครับ สุดยอด จริงๆ

บุคคลทั่วไป

โพสต์โดย บุคคลทั่วไป » 12/07/2008 9:04 pm

อยากได้ code ที่ใช้ keil เขียนอ่ะครับ ใช้กัน AT89S8252 ครับ ลองเขียนดูแล้วสงสัยจะไปไม่รอดอ่ะครับ ลองขอcode ไปศึกษาดูหน่อยครับ

บุคคลทั่วไป

โพสต์โดย บุคคลทั่วไป » 13/07/2008 4:23 pm

ช่วยผมหน่อยนะครับคือผมทำโครงการเกี่ยวกับการวัดความชื้นและอุณหภูมิครับใช้ไมโครเบอร์at89lp4052 แล้วไอซีวัดความชื้นกับอุณหภูมิเบอร์ sht15 ใช้แสดงผลออกทางlcd16*2 ครับแต่ตอนนี้ยังไปไม่ถึงไหนเลยใครพอมีเวลาหรือมีความรู้หรือว่าเคยใช้งานแบบนี้บ้างไหมครับช่วยแนะนำผมหน่อยนะครับหรือว่าพอมีแนวทางสำหรับการเขียนโปรแกรมกรุณาข่วยผมหน่อยนะครับตอนนี้ใกล้ท้อเต็มทีแล้วครับเพราะว่าเหลืออีกเทอมกว่าก็จะครบตามหลักสูตรแล้วถ้าไม่ผ่านโดนไทร์แน่ๆครับ keng_skx@hotmail.com นี่เมลล์ผมนะครับถ้าใครพอมีโค๊ดหรือคำแนะนำช่วยส่งมาให้ผมด้วยนะครับ ขอบคุณครับ
เก่ง

บุคคลทั่วไป

โพสต์โดย บุคคลทั่วไป » 13/07/2008 9:05 pm

ขอด้วยคนครับ nemo_ee14@hotmail.com

แมน

โพสต์โดย แมน » 03/10/2008 5:05 pm

ลองต่อดูแล้วครับใน proteus แต่ค่าที่ได้ไม่ตรงครับ ช่วยแนะนำหน่อยครับ
ขอบคุณครับ

ภาพประจำตัวสมาชิก
Rewat6
Rookie
Rookie
โพสต์: 18
ลงทะเบียนเมื่อ: 01/01/1970 7:00 am
ติดต่อ:

โพสต์โดย Rewat6 » 05/10/2008 12:42 am

ตามมาดูครับ


:lol: :lol: :lol:
<a href="http://www.slfishing.com" target="_blank"><img src="http://www.slfishing.com/includes/FCKeditor/upload/Image/Banner/We_LoveSL_banner_rewat6.jpg" alt="" width="427" height="100"></a><br />เอส.แอล. ฟิชชิ่ง ชุมชนคนตกปลา SL FISHING .COM <br />


ย้อนกลับไปยัง

ผู้ใช้งานขณะนี้

กำลังดูบอร์ดนี้: 4 และ บุคคลทั่วไป 0 ท่าน

cron