Title: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: zeus on February 11, 2009, 07:39:05 PM ช่วยแนะนำทีครับ ผม มือใหม่
ที่มา จากอันนี้อะคัฟ.... http://www.thaimicrotron.com/PIC/CCS/SHT15/SHT15.htm (http://photos4.hi5.com/0077/232/391/sE8O4c232391-01.jpg) ช่วยแนะนำทีครับ แก้ไขตรงใหน ขอบคุงคัฟ Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: zeus on February 11, 2009, 08:23:00 PM ช่วยแนะนำทีครับ ผม มือใหม่ ที่มา จากอันนี้อะคัฟ.... http://www.thaimicrotron.com/PIC/CCS/SHT15/SHT15.htm (http://photos4.hi5.com/0077/232/391/sE8O4c232391-01.jpg) ช่วยแนะนำทีครับ แก้ไขตรงใหน ขอบคุงคัฟ เอารูปใหม่มาให้คัฟ... (http://www.pramool.com:5050/.21/s05270-0.jpg) Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: zeus 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); } } Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: smitdh on February 11, 2009, 11:35:57 PM รูปมันเล็กมากเลยครับ
มีปัญญาอะไรหรือครับ ยังไม่เข้าใจในคำถาม Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: HD_EE09 on February 12, 2009, 09:50:13 PM ผมใช้ MPLAB C18 ครับ ใช้การได้ครับทดสอบแล้ว
ถ้าอยากได้ก็บอกนะครับโค๊ดไม่ยากครับ แก้ใขนิดหน่อยก็จะได้เลยครับ เมลมาก็ได้นะครับ yongyoot_mung@hotmail.com ได้แนวคิดโปรแกรมจากเว็บนี้แหละครับ (ขอบคุณมากครับ) Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: smitdh on February 12, 2009, 11:11:57 PM ขอบคุณ คุณ yongyoot มากครับที่มาช่วยเหลืออีกทางหนึ่ง
Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: zeus on February 16, 2009, 05:33:04 PM อ่า....
ได้ละคับ.... แล้วถ้าต้องการใช้ lcd 2*16 แสดงผล ต้องแก้ตงใหนบ้าง.... ช่วยแนะนำทีครับ... อีกอย่าง... วันนี้จ่าย supply ผิดให้เจ้า sht15 (จ่าย 25v) เข้าไป... ผมต้องซื้อใหม่แล้วใช่ปะคัฟ... ขอบคุณทุกท่านมากครับ.. Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: zeus 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 ใช่ปะคัฟ Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: smitdh 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 ทุกครั้ง โดยกำหนดค่าตอนเริ่มต้น Title: Re: ช่วยดูให้หน่อยคัฟการใช้ SHT15 Post by: zeus 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 ออกไปควบคุมการทำงานของอุปกรณ์ เมื่อ อุณหถูมิ / ความชื้น ถึงระดับที่กำหนด จะต้องเพิ่มเติมยังไงคัฟ... รบกวนด้วย ผม มือใหม่ ซิงๆ เลย |