exitpomai
|
|
« on: August 27, 2010, 04:36:57 PM » |
|
พอดีเอาเอาโปรแกรมจากเว็บไปแก้ แล้วต่อเซนต์เซอร์ SHT11 เข้าไป ค่าที่มันแสดงออกมาคือ T = -40 C H = -4.65% Dew Point: -74.368032C ตามรูปอะครับ แล้วไม่เปลี่ยนค่าเลย แบบนี้มันมีปัญหาอะไรครับ ช่วยบอกทีครับ
|
|
|
Logged
|
|
|
|
exitpomai
|
|
« Reply #1 on: August 28, 2010, 03:13:27 PM » |
|
ไม่มีใครตอบเลย สงสัยโปรเจ็คจะไม่ได้ส่งแล้วหละ
|
|
|
Logged
|
|
|
|
|
exitpomai
|
|
« Reply #3 on: August 31, 2010, 03:58:33 PM » |
|
ตอนนี้มันแสดงค่าไม่เหมือนเดิมแล้วอะครับ แต่ยังคงเป็นค่าที่นิ่งไม่วิ่งไปไหนเลย ไม่ว่าจะร้อนหรือเย็นก็แสดงค่าเดิมตะลอด ลองทำแบบที่คุณ smitdh บอกแล้วครับ แต่ผลที่ได้ก็เหมือนเดิมครับ และแสดงค่าครั้งเดียว แล้วก็จะขึ้นว่าไม่ได้ต่อเซนเซอร์ตลอด ต้องกดปุ่มรีเซ็ตถึงจะแสดงค่าใหม่ซึ่งเป็นค่าเดิมครับ
|
|
|
Logged
|
|
|
|
exitpomai
|
|
« Reply #4 on: August 31, 2010, 04:06:29 PM » |
|
ตัวโปรแกรมครับ ช่วยดูให้หน่อยนะครับ ต้องส่งกระดาษก่อนว่าที่2นี้แล้วครับ //SHT1x Sensor temperature & Humidity //Read sensor and diaplay to RS232 //Compiler CCS Version 3.249 #include <18F2550.h> // Standard Header file for the PIC16F877 device #include <string.h> #include <stdio.h> #include <stdlib.h> #include <math.h> #define TxD PIN_C6 // Define Transmitted Data #define RxD PIN_C7 // Define Received Data #define CLOCK_SP 20000000 // Clock Speed(Hz)
//#USE I2C(MASTER, SDA=EEPROM_SDA, SCL=EEPROM_SCL, FAST=100000) // Device Specification #fuses HS // Oscillator mode HS #fuses NOLVP, NOWDT // No Low Voltage Program, No Watchdog timer #fuses NOPROTECT // Code no protection #use delay (clock=CLOCK_SP) // Use built-in function: delay_ms() & delay_us() #use rs232(baud=9600, xmit=TxD,rcv=RxD, stream=PC_COM , BRGH1OK, ERRORS) // Use serial I/O port (RS232) #fuses CPUDIV1 //CPUDIV1=OSC CPUDIV2=OSC/2 CPUDIV3=OSC/3 CPUDIV4=OSC/4 #use fast_io(a) #use fast_io(b)
#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.00 #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 0x00 #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() {
float fRh_lin; float fRh_true; float fTemp_true; float fDew_point;
long lValue_rh; long lValue_temp; int R; set_tris_a(0x00); output_high(PIN_A0); output_low(PIN_A1); /* while(1){ putc('a'); delay_ms(1000);
} */ 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("Please connect to the sensor.\r\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("Temp=%3.2f C\r\n",fTemp_true); printf("H=%3.2f%%\r\n",fRh_true); printf("Dew Point: %3.6fC \r\n\r\n",fDew_point); delay_ms(1000); } }
|
|
|
Logged
|
|
|
|
exitpomai
|
|
« Reply #5 on: August 31, 2010, 05:21:24 PM » |
|
ตอนนี้อ่านค่าอุณหภูมิได้แล้วครับ แต่ค่าความชื้อมันออกมาติดลบเยอะมากเลยครับ มันเป็นเพราะอะไรหรอครับ
|
|
|
Logged
|
|
|
|
exitpomai
|
|
« Reply #6 on: August 31, 2010, 07:21:16 PM » |
|
เพิ่มเติมอีกนิดนึงครับ ผทลองดึงค่าต่างๆออกมาแล้วเห็นค่ามันเป็นแบบนี้อะครับ lValue_temp=1bff lValue_rh=ffff Temp=31.66 C H=-2623.13% Dew Point: -6.014130C
lValue_rh ที่ออกมาเป็น FFFF แบบนี้ปกติหรือปล่าวครับ
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #7 on: August 31, 2010, 08:30:53 PM » |
|
ตอนนี้ผมไม่มี SHT15 ในมือ เดี๋ยวจะวานคุณ gundam ดูให้นะครับ
|
|
|
Logged
|
|
|
|
gundam
|
|
« Reply #8 on: August 31, 2010, 09:39:00 PM » |
|
เดี๋ยวผมจะช่วยดูให้นะครับ แต่ผมสงสัยว่าทำไหมไม่ใช้เบอร์ PIC16F648A ตรงๆไปเลยจะได้ไม่ต้องแก้ไขอะไร และยังถูกกว่าด้วย เดี๋ยวผมจะลองค้นหาเบอร์ PIC18F2550 ดูก่อน แล้วจะดูโค๊ดให้นะครับ ส่วน hardware อย่าลืม R pullup 4.7K นะครับ แล้ว C 20p ที่ต่อกับ Xtal ลงกราวน์ ทั้ง 2 ตัว นะครับไม่งั้นรวนแย่ hardware ต่ออย่างไรครับ ทำ PCB, ทดลองบนโปรโตบอร์ด, หรือต่อลงบอร์ดเอนกประสงค์ (บอร์ดไข่ปลา) จะได้ช่วยวิเคราะห์ได้ถูก
|
|
« Last Edit: August 31, 2010, 11:00:21 PM by gundam »
|
Logged
|
|
|
|
exitpomai
|
|
« Reply #9 on: September 01, 2010, 02:24:29 PM » |
|
พอดีอาจารย์ที่ปรึกษาบอกให้ใช้เบอร์นี้อะครับ ผมต่อลงบอร์ดไข่ปลาอะครับ แล้วใช้74LS125 เป็นตัวเลือกว่าจะส่งเข้าคอมผ่านRF232 หรือส่งออกRF moduleครับ
|
|
|
Logged
|
|
|
|
gundam
|
|
« Reply #10 on: September 01, 2010, 03:04:07 PM » |
|
ปกติแล้ว pic18F2550 มักจะใช้ก็ต่อเมื่อต้องการใช้ USB ครับ ไม่เช่นนั้นใช้พวก PIC16F886 (70บาทเอง) 28 pin เหมือนกัน แต่ต้องใช้ CCS Version 4 ขึ้นไป เพราะเป็นเบอร์ใหม่
ตอนนี้ผมลองใช้เบอร์ pic18F2550 (ถอดมาจาก PICKit2 ของอีกตัว) โค๊ดจากในเวป ของ อ.smitdh แค่เปลี่ยน include เป็น #include <18F2550.h> #fuses XT,PUT,BROWNOUT,MCLR,NOWDT,NOPROTECT,NOLVP #use rs232(baud=9600,parity=N,xmit=PIN_B2,rcv=PIN_B1)
fuse เหมือนเดิม ก็ใช้ได้เลยนี่ครับ แต่ใช้ Xtal 4MHz นะ เดี๋ยวลองหา Xtal 20 MHz ก่อนจะลองอีกที
|
|
« Last Edit: September 01, 2010, 03:39:46 PM by gundam »
|
Logged
|
|
|
|
exitpomai
|
|
« Reply #11 on: September 01, 2010, 03:45:38 PM » |
|
ตอนนี้ลอง ปิดรับค่าอุณภูมิแล้วกำหนดขึ้นมาเอง มันก็แสดงความชื้นเป็นปกติอะครับ
หากเลือกแสดงอุณหภูมิ ความชื้นมันก็ไม่ส่งค่ามา แต่พอกำหนดอุณหภูมิขึ้นมาเอง ความชื้นก็ปกติครับ แต่ก็ไม่สามารถแสดงค่าอุณหภูมที่แท้จริงได้
|
|
|
Logged
|
|
|
|
gundam
|
|
« Reply #12 on: September 01, 2010, 04:37:53 PM » |
|
พอใช้ค่า Xtal 20 MHz ก็รวนเลยครับ เดี๋ยวผมลองจัดค่า delay ให้ใหม่
|
|
|
Logged
|
|
|
|
gundam
|
|
« Reply #13 on: September 01, 2010, 05:00:24 PM » |
|
โปรแกรมนี้ใช้ PIC18F2550 XTal 20MHz #case #include <18F2550.h> #use delay(clock=20000000) #fuses HS,PUT,BROWNOUT,MCLR,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
#define nDelay 2
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(nDelay); output_low(SHT1xSCK); delay_us(nDelay); } 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(nDelay); //Snend Clock each bit output_high(SHT1xSCK); delay_us(nDelay); output_low(SHT1xSCK); }
output_float(SHT1xDATA); //Change DATA Line to Input delay_us(nDelay);
output_high(SHT1xSCK); //Clock for Acknowledge delay_us(nDelay);
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(nDelay);//@ output_low(SHT1xSCK); //Send Clock Low delay_us(nDelay);//@
if(lTmp) lVal1|=1; //store in lVal1 }
//Acknowledge routine for Next byte output_low(SHT1xDATA); delay_us(nDelay);//@2 output_high(SHT1xSCK); delay_us(nDelay);//@2
output_float(SHT1xDATA); //Change to Input delay_us(nDelay);//@2 output_low(SHT1xSCK); delay_us(nDelay);//@
//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(nDelay);//@ output_low(SHT1xSCK); //Send Clock Low delay_us(nDelay);//@
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 main() { float fRh_lin; float fRh_true; float fTemp_true; float fDew_point;
long lValue_rh; long lValue_temp; int R;
InitialChip(); delay_ms(200); printf("\r\nTest SHT15 PIC18F2550 20MHz\r\n");
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("T=%3.2f C\r\n",fTemp_true); printf("H=%3.2f%%\r\n",fRh_true); printf("Dew Point: %3.6fC \r\n\r\n",fDew_point); delay_ms(1000); } }
ผมเพิ่ม delay time ที่มี comment //@ และ //@2 ต่อท้ายครับ ส่วน UART คุณไปแก้เป็นขาตามที่คุณใช้ครับ #use rs232(baud=9600,parity=N,xmit= PIN_B2,rcv= PIN_B1)
|
|
|
Logged
|
|
|
|
smitdh
Administrator
Hero Member
Offline
Gender:
Posts: 381
อาจารย์ที่ปรึกษา
|
|
« Reply #14 on: September 01, 2010, 06:55:38 PM » |
|
พอดีอาจารย์ที่ปรึกษาบอกให้ใช้เบอร์นี้อะครับ ผมต่อลงบอร์ดไข่ปลาอะครับ แล้วใช้74LS125 เป็นตัวเลือกว่าจะส่งเข้าคอมผ่านRF232 หรือส่งออกRF moduleครับ
ยังมีขาเหลืออีกนี่ครับ เราสามารถใช้ UART ได้หลายพอร์ต โดยใช้ software UART ครับ จะได้ไม่ต้องคอยสวิทช์ เพราะขณะสวิทช์ จากขานึ่งไปยังอีกขานึงจะเกิด noise (ขยะ) จะต้องหน่วงเวลาหลังการสวิทช์ด้วย ลองดู http://www.thaimicrotron.com/webboard2/index.php?topic=11.msg18#msg18
|
|
|
Logged
|
|
|
|
|