A
amitumi1003
Guest
Prob là nó alwayes hiển thị cùng một giá trị ngay cả khi tôi thay đổi dữ liệu hoặc mã sck không.
kết quả là alwayes 37,22 4,25 64,13 0,1.
pls giúp tôi .........
ở đây là mã
Mã số:# Include <18F8720.h>
# Bao gồm <math.h>
# Bao gồm <stdlib.h>typedef công đoàn
(
unsigned int i;
float f;
) Giá trị;# PORT_G byte = 0x00FD
# PORT_f byte = 0x0000
# Byte PORT_c = 0x00BF
# PORT_D byte = 0x0000
# PORT_E byte = 0x0002
# Fuses HS, NOLVP, NOWDT, NOPROTECT
# Sử dụng chậm (đồng hồ = 20.000.000)
# Sử dụng RS232 (baud = 9.600, rcv = PIN_G2, xmit = PIN_G1, STREAM = COMM_B)enum (TEMP, HUMI);
# Define PIN_F2 sht11_data
# Define sht11_sck PIN_F3
# Define sht_noACK 0
# Define sht_ACK 1/ / ADR lệnh r / w
# Define 0x06 sht_STATUS_REG_W / / 000 0.011 0
# Define sht_STATUS_REG_R 0x07 / / 000 0.011 1
# Define sht_MEASURE_TEMP 0x03 / / 000 0.001 1
# Define sht_MEASURE_HUMI 0x05 / / 000 0.010 1
# Define sht_RESET 0x1e / / 000 1111 0
/************************************************* *******************************/
/************************************************* *******************************// / Gửi dữ liệu tính đến pc/************************************************* *******************************/
/************************************************* *******************************/void sendDataToPC (dữ liệu * char, int len)
(
int i;
output_high (PIN_G0);
delay_ms (10); / / chờ đợicho (i = 0; i <len; i )
(
fprintf (COMM_B, "% c", dữ liệu *); / / ghi trong tập tin
dữ liệu ;
)
delay_ms (10); / / chờ đợi
output_low (PIN_G0);
delay_ms (10);
)checkLength int (int giá trị)
(
int len = 0;
trong khi (có giá trị! = 0)
(
giá trị = value/10;
len ;
)
trở lại len;
)void floatToInt (gấp đôi giá trị)
(
, Int một rem, len = 0, cho vay;
char arr [5];
char * dữ liệu, nhiệt độ;
double d = 100,0;
a = abs (giá trị);
len = checkLength (a);
cho vay = len;
trong khi (a = 0)!
(
rem = 10%;
arr [len-1] = rem 48;
a = a/10;
len -;
)
dữ liệu = arr;
sendDataToPC (dữ liệu, cho vay);temp ='.';
sendDataToPC (& temp, 1);a = abs (giá trị);
giá trị = giá trị-a;
giá trị = giá trị * d;
a = abs (giá trị) 1;
len = checkLength (a);
cho vay = len;
trong khi (a = 0)!
(
rem = 10%;
arr [len-1] = rem 48;
a = a/10;
len -;
)
dữ liệu = arr;
sendDataToPC (dữ liệu, cho vay);
temp = '';
sendDataToPC (& temp, 2);
)
/************************************************* ******************************/
/************************************************* ******************************// / Ghi một byte trên Sensibus và kiểm tra xác nhận/************************************************* ******************************/
/************************************************* ******************************/
char sht11_write_byte (unsigned char giá trị)
(
unsigned char i, lỗi = 0;
cho (i = 0x80; i> 0; i / = 2) / bit ca / cho mặt nạ
(
if (i & giá trị)
output_high (sht11_data); / / mặt nạ giá trị với tôi, viết thư cho SENSI-BUS
khác
output_low (sht11_data);output_high (sht11_sck); / / CLK cho SENSI-BUS
delay_us (5); / / pulswith approx.
5 chúng tôi
output_low (sht11_sck);
)
output_high (sht11_data); / / phát hành dữ liệu trực tuyến
output_high (sht11_sck); / / CLK # 9 cho ack
lỗi = đầu vào (sht11_data); / / kiểm tra ack (DATA sẽ được kéo xuống bởi SHT11)
output_low (sht11_sck);
trả lại lỗi; / / lỗi = 1 trong trường hợp không có xác nhận
)
/************************************************* *******************************/
/************************************************* *******************************// / Đọc một hình thức byte Sensibus và đưa ra một nhận trong trường hợp "ack = 1"/************************************************* *******************************/
/************************************************* *******************************/
char sht11_read_byte (unsigned char ack)
(
unsigned char i, val = 0;
output_high (sht11_data); / / phát hành dữ liệu trực tuyến
cho (i = 0x80; i> 0; i / = 2) / bit ca / cho mặt nạ
(
output_high (sht11_sck); / / CLK cho SENSI-BUS
if (input (sht11_data) == 1)
val = (val | i); / / đọc bit
output_low (sht11_sck);
)
output_bit (sht11_data, ack); / / trong trường hợp "ack == 1" kéo xuống DATA-Line
output_high (sht11_sck); / / CLK # 9 cho ack
delay_us (5); / / pulswith approx.
5 chúng tôi
output_low (sht11_sck);
output_high (sht11_data); / / phát hành dữ liệu trực tuyến
trở lại val;
)
/************************************************* *******************************/
/************************************************* *******************************// / Tạo ra một sự khởi đầu truyền
/ / _____ ________
/ / DATA: |_______|
/ / ___ ___
/ / SCK: ___ | |___| |______/************************************************* *******************************/
/************************************************* *******************************/
sht11_transstart void (void)
(
output_high (sht11_data);
output_low (sht11_sck); / / ban đầu nhà nước
delay_us (1);
output_high (sht11_sck);
delay_us (1);
output_low (sht11_data);
delay_us (1);
output_low (sht11_sck);
delay_us (3);
output_high (sht11_sck);
delay_us (1);
output_high (sht11_data);
delay_us (1);
output_low (sht11_sck);
)
/************************************************* *******************************/
/************************************************* *******************************// / Thiết lập lại giao tiếp: DATA line-= 1 và ít nhất 9 chu kỳ SCK
/ / Theo sau transstart
/ / _____________________________________________________ ________
/ / DATA: |_______|
/ / _ _ _ _ _ _ _ _ _ ___ ___
/ / SCK: __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | |______| |___| |______/************************************************* *******************************/
/************************************************* *******************************/sht11_connectionreset void (void)
(
unsigned char i;
output_high (sht11_data);
output_low (sht11_sck); / / ban đầu nhà nước
cho (i = 0; i <9; i ) / / 9 SCK chu kỳ
(
output_high (sht11_sck);
output_low (sht11_sck);
)
sht11_transstart (); / / truyền tải bắt đầu
)
/************************************************* *******************************/
/************************************************* *******************************// / Reset các cảm biến của một softreset/************************************************* *******************************/
/************************************************* *******************************/
char sht11_softreset (void)
(
unsigned char lỗi = 0;
sht11_connectionreset (); / / thiết lập lại truyền thông
lỗi = sht11_write_byte (sht_RESET); / / gửi RESET-lệnh để cảm biến
trả lại lỗi; / / lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến
)/************************************************* *******************************/
/************************************************* *******************************// / Đọc đăng ký hộ với tổng kiểm tra (8-bit)/************************************************* *******************************/
/************************************************* *******************************/
sht11_read_statusreg char ()
(
unsigned char lỗi = 0;
unsigned char p_value, p_checksum;
sht11_transstart (); / / truyền tải bắt đầu
lỗi = sht11_write_byte (sht_STATUS_REG_R); / / gửi lệnh để cảm biến
p_value = sht11_read_byte (sht_ACK); / / đọc đăng ký hộ (8-bit)
p_checksum = sht11_read_byte (sht_noACK); / / đọc checksum (8-bit)
trả lại lỗi; / / lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến
)
/************************************************* *******************************/
/************************************************* *******************************// / Ghi trong sổ đăng ký tư cách với checksum (8-bit)/************************************************* *******************************/
/************************************************* *******************************/char sht11_write_statusreg (unsigned char * p_value)
(
unsigned char lỗi = 0;
sht11_transstart (); / / truyền tải bắt đầu
lỗi = sht11_write_byte (sht_STATUS_REG_W); / / gửi lệnh để cảm biến
lỗi = sht11_write_byte p_value * (); / / gửi giá trị của tình trạng đăng ký
trả lại lỗi; / /> lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến
)/************************************************* *******************************/
/************************************************* *******************************// / Tạo ra một đo lường (độ ẩm / nhiệt độ) với checksum/************************************************* *******************************/
/************************************************* *******************************/
char sht11_measure (p_value * unsigned char, unsigned char * p_checksum, unsigned char chế độ)
(
unsigned lỗi = 0;
unsigned int i;
sht11_transstart (); / / truyền tải bắt đầu
chuyển đổi (chế độ)
(/ / Gửi lệnh để cảm biến
TEMP trường hợp: lỗi = sht11_write_byte (sht_MEASURE_TEMP); break;
HUMI trường hợp: lỗi = sht11_write_byte (sht_MEASURE_HUMI); break;
mặc định: break;
)cho (i = 0; i <65.535; i )
if (input (sht11_data) == 0)
break; / / đợi cho đến khi cảm biến đã hoàn thành đo lường
if (input (sht11_data) == 1)
Lỗi = 1; / / hoặc thời gian chờ (~ 2 sec.) Là đạt* (P_value 1) = sht11_read_byte (sht_ACK); / / đọc các byte đầu tiên (MSB)
* (P_value) = sht11_read_byte (sht_ACK); / / đọc các byte thứ hai (LSB)
* P_checksum = sht11_read_byte (sht_noACK); / / đọc checksum
trả lại lỗi;
)
char sht11_measure_temp (p_value * unsigned char, unsigned char * p_checksum)
(
sht11_measure trở lại (p_value, p_checksum, TEMP);
)char sht11_measure_humi (unsigned char * p_value, unsigned char * p_checksum)
(
sht11_measure trở lại (p_value, p_checksum, HUMI);
)
/************************************************* *******************************/
/************************************************* *******************************// / Tính toán nhiệt độ [° C] và% [độ ẩm RH]
/ / Nhập vào: humi [Bọ ve] (12 bit)
/ / Temp [Bọ ve] (14 bit)
/ / Đầu ra: humi [% RH]
/ / Temp [° C]/************************************************* *******************************/
/************************************************* *******************************/
void sth11_calc (float p_humidity *, float * p_temperature)
(
const float C1 =- 4,0; / / cho 12 Bit
const float C2 = 0,0405; / / cho 12 Bit
const float C3 =- 0,0000028; / / cho 12 Bit
const float T1 = 0,01; / / cho 14 Bit @ 5V
const float T2 = 0,00008; / / cho 14 Bit @ 5Vfloat rh, t, rh_lin, rh_true, t_C;
/ / Rh_lin: Độ ẩm tuyến tính
/ / Rh_true: Nhiệt độ bồi thường độ ẩm
/ / T_C: Nhiệt độ [° C]
rh =* p_humidity; / / rh: Độ ẩm [Bọ ve] 12 Bit
t =* p_temperature; / / t: Nhiệt độ [Bọ ve] 14 Bitt_C = t * 0,01-40; / / calc.
nhiệt độ từ bọ ve để [° C]
rh_lin = C3 * * rh rh C2 * rh C1; / / calc.
độ ẩm từ bọ ve để [% RH]
rh_true = (t_C-25) * (T1 T2 * rh) rh_lin; / / calc.
độ ẩm nhiệt độ bồi thường [% RH]if (rh_true> 100)
rh_true = 100; / / cắt giảm nếu giá trị là bên ngoài
if (rh_true <0,1)
rh_true = 0,1; / / các vật chất có thể có nhiều* P_temperature = t_C; / / quay trở lại nhiệt độ [° C]
* P_humidity = rh_true; / / trả lại độ ẩm [% RH]
)
/************************************************* *******************************/
/************************************************* *******************************// / Calcul de l'humidite en Entier (sans calcul float)/************************************************* *******************************/
/************************************************* *******************************/
int sht11_calc_humid_int (int16 w_humidity)
(
int32 h1, h2;h1 = ((int32) w_humidity) * ((int32) w_humidity);
h1 = h1 / (int32) năm 1000;
h1 = h1 * (int32) 28;
h2 = ((int32) w_humidity) * (int32) 405;
h2 = h2 - h1;
h2 = h2 / (int32) năm 1000;
h2 = h2 - (int32) 40;
h2 = h2 / (int32) 10;
trở lại (h2);
)/************************************************* *******************************/
/************************************************* *******************************// / Tính toán điểm sương
/ / Nhập vào: độ ẩm [% RH], nhiệt độ [° C]
/ / Đầu ra: sương điểm [° C]/************************************************* *******************************/
/************************************************* *******************************/
sht11_calc_dewpoint nổi (float h, float t)
(
float logEx, dew_point;
logEx = 0,66077 7,5 * t / (237,3 t) (log10 (h) -2);
dew_point = (logEx - 0,66077) * 237,3 / (0,66077 7,5-logEx);
dew_point trở lại;
)/************************************************* ********************************/
/************************************************* ********************************/
//------------------------------------------------ ----------------------------------
/ / Chương trình mẫu cho thấy làm thế nào để sử dụng chức năng SHT11
/ / 1.
thiết lập lại kết nối
/ / 2.
biện pháp [ẩm bọ ve] (12 bit) và [nhiệt độ bọ ve] (14 bit)
/ / 3.
tính toán độ ẩm [% RH] và [nhiệt độ C].
/ / 4.
tính toán [điểm sương C].
/ / 5.
in nhiệt độ, độ ẩm, điểm sương
/************************************************* *********************************/
/************************************************* *********************************/void main ()
(
giá trị humi_val, temp_val;
float dew_point;
unsigned char lỗi, kiểm tra, tạm thời;
sht11_connectionreset ();
trong khi (1)
(
lỗi = 0;
Lỗi = sht11_measure ((unsigned char *) & humi_val.i, và tổng kiểm tra, HUMI); / / đo độ ẩm
Lỗi = sht11_measure ((unsigned char *) & temp_val.i, và tổng kiểm tra, TEMP); / / đo nhiệt độ
if (lỗi! = 0)
sht11_connectionreset (); / / trong trường hợp lỗi: kết nối thiết lập lại
khác
(
humi_val.f = (float) humi_val.i; / / chuyển đổi số nguyên nổi
temp_val.f = (float) temp_val.i; / / chuyển đổi số nguyên nổi
sth11_calc (& humi_val.f, & temp_val.f); / / tính toán độ ẩm, nhiệt độ
dew_point = (humi_val.f, temp_val.f); sht11_calc_dewpoint / / tính toán điểm sương
/ / Gửi dữ liệu cuối cùng để giao tiếp nối tiếp (UART)
/ / Printf (temp: 5.1fC% humi:% 5.1f%% sương điểm: 5.1fC% \ n, temp_val.f, humi_val.f, dew_point);
/ / SendDataToPC (temp_val.f, 0x04);
/ / SendDataToPC (humi_val.f, 0x04);
/ / SendDataToPC (dew_point, 0x04); * /
floatToInt (temp_val.f);
floatToInt (humi_val.f);
floatToInt (dew_point);
floatToInt (lỗi)
//---------- Chờ khoảng.
0.8s để tránh làm nóng SHTxx ------------------------------
delay_ms (1000);
temp = '\ r';
sendDataToPC (& temp, 1);
/ / Temp = '\ n';
/ / SendDataToPC (& temp, 1);
)
)
kết quả là alwayes 37,22 4,25 64,13 0,1.
pls giúp tôi .........
ở đây là mã
Mã số:# Include <18F8720.h>
# Bao gồm <math.h>
# Bao gồm <stdlib.h>typedef công đoàn
(
unsigned int i;
float f;
) Giá trị;# PORT_G byte = 0x00FD
# PORT_f byte = 0x0000
# Byte PORT_c = 0x00BF
# PORT_D byte = 0x0000
# PORT_E byte = 0x0002
# Fuses HS, NOLVP, NOWDT, NOPROTECT
# Sử dụng chậm (đồng hồ = 20.000.000)
# Sử dụng RS232 (baud = 9.600, rcv = PIN_G2, xmit = PIN_G1, STREAM = COMM_B)enum (TEMP, HUMI);
# Define PIN_F2 sht11_data
# Define sht11_sck PIN_F3
# Define sht_noACK 0
# Define sht_ACK 1/ / ADR lệnh r / w
# Define 0x06 sht_STATUS_REG_W / / 000 0.011 0
# Define sht_STATUS_REG_R 0x07 / / 000 0.011 1
# Define sht_MEASURE_TEMP 0x03 / / 000 0.001 1
# Define sht_MEASURE_HUMI 0x05 / / 000 0.010 1
# Define sht_RESET 0x1e / / 000 1111 0
/************************************************* *******************************/
/************************************************* *******************************// / Gửi dữ liệu tính đến pc/************************************************* *******************************/
/************************************************* *******************************/void sendDataToPC (dữ liệu * char, int len)
(
int i;
output_high (PIN_G0);
delay_ms (10); / / chờ đợicho (i = 0; i <len; i )
(
fprintf (COMM_B, "% c", dữ liệu *); / / ghi trong tập tin
dữ liệu ;
)
delay_ms (10); / / chờ đợi
output_low (PIN_G0);
delay_ms (10);
)checkLength int (int giá trị)
(
int len = 0;
trong khi (có giá trị! = 0)
(
giá trị = value/10;
len ;
)
trở lại len;
)void floatToInt (gấp đôi giá trị)
(
, Int một rem, len = 0, cho vay;
char arr [5];
char * dữ liệu, nhiệt độ;
double d = 100,0;
a = abs (giá trị);
len = checkLength (a);
cho vay = len;
trong khi (a = 0)!
(
rem = 10%;
arr [len-1] = rem 48;
a = a/10;
len -;
)
dữ liệu = arr;
sendDataToPC (dữ liệu, cho vay);temp ='.';
sendDataToPC (& temp, 1);a = abs (giá trị);
giá trị = giá trị-a;
giá trị = giá trị * d;
a = abs (giá trị) 1;
len = checkLength (a);
cho vay = len;
trong khi (a = 0)!
(
rem = 10%;
arr [len-1] = rem 48;
a = a/10;
len -;
)
dữ liệu = arr;
sendDataToPC (dữ liệu, cho vay);
temp = '';
sendDataToPC (& temp, 2);
)
/************************************************* ******************************/
/************************************************* ******************************// / Ghi một byte trên Sensibus và kiểm tra xác nhận/************************************************* ******************************/
/************************************************* ******************************/
char sht11_write_byte (unsigned char giá trị)
(
unsigned char i, lỗi = 0;
cho (i = 0x80; i> 0; i / = 2) / bit ca / cho mặt nạ
(
if (i & giá trị)
output_high (sht11_data); / / mặt nạ giá trị với tôi, viết thư cho SENSI-BUS
khác
output_low (sht11_data);output_high (sht11_sck); / / CLK cho SENSI-BUS
delay_us (5); / / pulswith approx.
5 chúng tôi
output_low (sht11_sck);
)
output_high (sht11_data); / / phát hành dữ liệu trực tuyến
output_high (sht11_sck); / / CLK # 9 cho ack
lỗi = đầu vào (sht11_data); / / kiểm tra ack (DATA sẽ được kéo xuống bởi SHT11)
output_low (sht11_sck);
trả lại lỗi; / / lỗi = 1 trong trường hợp không có xác nhận
)
/************************************************* *******************************/
/************************************************* *******************************// / Đọc một hình thức byte Sensibus và đưa ra một nhận trong trường hợp "ack = 1"/************************************************* *******************************/
/************************************************* *******************************/
char sht11_read_byte (unsigned char ack)
(
unsigned char i, val = 0;
output_high (sht11_data); / / phát hành dữ liệu trực tuyến
cho (i = 0x80; i> 0; i / = 2) / bit ca / cho mặt nạ
(
output_high (sht11_sck); / / CLK cho SENSI-BUS
if (input (sht11_data) == 1)
val = (val | i); / / đọc bit
output_low (sht11_sck);
)
output_bit (sht11_data, ack); / / trong trường hợp "ack == 1" kéo xuống DATA-Line
output_high (sht11_sck); / / CLK # 9 cho ack
delay_us (5); / / pulswith approx.
5 chúng tôi
output_low (sht11_sck);
output_high (sht11_data); / / phát hành dữ liệu trực tuyến
trở lại val;
)
/************************************************* *******************************/
/************************************************* *******************************// / Tạo ra một sự khởi đầu truyền
/ / _____ ________
/ / DATA: |_______|
/ / ___ ___
/ / SCK: ___ | |___| |______/************************************************* *******************************/
/************************************************* *******************************/
sht11_transstart void (void)
(
output_high (sht11_data);
output_low (sht11_sck); / / ban đầu nhà nước
delay_us (1);
output_high (sht11_sck);
delay_us (1);
output_low (sht11_data);
delay_us (1);
output_low (sht11_sck);
delay_us (3);
output_high (sht11_sck);
delay_us (1);
output_high (sht11_data);
delay_us (1);
output_low (sht11_sck);
)
/************************************************* *******************************/
/************************************************* *******************************// / Thiết lập lại giao tiếp: DATA line-= 1 và ít nhất 9 chu kỳ SCK
/ / Theo sau transstart
/ / _____________________________________________________ ________
/ / DATA: |_______|
/ / _ _ _ _ _ _ _ _ _ ___ ___
/ / SCK: __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | |______| |___| |______/************************************************* *******************************/
/************************************************* *******************************/sht11_connectionreset void (void)
(
unsigned char i;
output_high (sht11_data);
output_low (sht11_sck); / / ban đầu nhà nước
cho (i = 0; i <9; i ) / / 9 SCK chu kỳ
(
output_high (sht11_sck);
output_low (sht11_sck);
)
sht11_transstart (); / / truyền tải bắt đầu
)
/************************************************* *******************************/
/************************************************* *******************************// / Reset các cảm biến của một softreset/************************************************* *******************************/
/************************************************* *******************************/
char sht11_softreset (void)
(
unsigned char lỗi = 0;
sht11_connectionreset (); / / thiết lập lại truyền thông
lỗi = sht11_write_byte (sht_RESET); / / gửi RESET-lệnh để cảm biến
trả lại lỗi; / / lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến
)/************************************************* *******************************/
/************************************************* *******************************// / Đọc đăng ký hộ với tổng kiểm tra (8-bit)/************************************************* *******************************/
/************************************************* *******************************/
sht11_read_statusreg char ()
(
unsigned char lỗi = 0;
unsigned char p_value, p_checksum;
sht11_transstart (); / / truyền tải bắt đầu
lỗi = sht11_write_byte (sht_STATUS_REG_R); / / gửi lệnh để cảm biến
p_value = sht11_read_byte (sht_ACK); / / đọc đăng ký hộ (8-bit)
p_checksum = sht11_read_byte (sht_noACK); / / đọc checksum (8-bit)
trả lại lỗi; / / lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến
)
/************************************************* *******************************/
/************************************************* *******************************// / Ghi trong sổ đăng ký tư cách với checksum (8-bit)/************************************************* *******************************/
/************************************************* *******************************/char sht11_write_statusreg (unsigned char * p_value)
(
unsigned char lỗi = 0;
sht11_transstart (); / / truyền tải bắt đầu
lỗi = sht11_write_byte (sht_STATUS_REG_W); / / gửi lệnh để cảm biến
lỗi = sht11_write_byte p_value * (); / / gửi giá trị của tình trạng đăng ký
trả lại lỗi; / /> lỗi = 1 trong trường hợp không có hình thức phản ứng của cảm biến
)/************************************************* *******************************/
/************************************************* *******************************// / Tạo ra một đo lường (độ ẩm / nhiệt độ) với checksum/************************************************* *******************************/
/************************************************* *******************************/
char sht11_measure (p_value * unsigned char, unsigned char * p_checksum, unsigned char chế độ)
(
unsigned lỗi = 0;
unsigned int i;
sht11_transstart (); / / truyền tải bắt đầu
chuyển đổi (chế độ)
(/ / Gửi lệnh để cảm biến
TEMP trường hợp: lỗi = sht11_write_byte (sht_MEASURE_TEMP); break;
HUMI trường hợp: lỗi = sht11_write_byte (sht_MEASURE_HUMI); break;
mặc định: break;
)cho (i = 0; i <65.535; i )
if (input (sht11_data) == 0)
break; / / đợi cho đến khi cảm biến đã hoàn thành đo lường
if (input (sht11_data) == 1)
Lỗi = 1; / / hoặc thời gian chờ (~ 2 sec.) Là đạt* (P_value 1) = sht11_read_byte (sht_ACK); / / đọc các byte đầu tiên (MSB)
* (P_value) = sht11_read_byte (sht_ACK); / / đọc các byte thứ hai (LSB)
* P_checksum = sht11_read_byte (sht_noACK); / / đọc checksum
trả lại lỗi;
)
char sht11_measure_temp (p_value * unsigned char, unsigned char * p_checksum)
(
sht11_measure trở lại (p_value, p_checksum, TEMP);
)char sht11_measure_humi (unsigned char * p_value, unsigned char * p_checksum)
(
sht11_measure trở lại (p_value, p_checksum, HUMI);
)
/************************************************* *******************************/
/************************************************* *******************************// / Tính toán nhiệt độ [° C] và% [độ ẩm RH]
/ / Nhập vào: humi [Bọ ve] (12 bit)
/ / Temp [Bọ ve] (14 bit)
/ / Đầu ra: humi [% RH]
/ / Temp [° C]/************************************************* *******************************/
/************************************************* *******************************/
void sth11_calc (float p_humidity *, float * p_temperature)
(
const float C1 =- 4,0; / / cho 12 Bit
const float C2 = 0,0405; / / cho 12 Bit
const float C3 =- 0,0000028; / / cho 12 Bit
const float T1 = 0,01; / / cho 14 Bit @ 5V
const float T2 = 0,00008; / / cho 14 Bit @ 5Vfloat rh, t, rh_lin, rh_true, t_C;
/ / Rh_lin: Độ ẩm tuyến tính
/ / Rh_true: Nhiệt độ bồi thường độ ẩm
/ / T_C: Nhiệt độ [° C]
rh =* p_humidity; / / rh: Độ ẩm [Bọ ve] 12 Bit
t =* p_temperature; / / t: Nhiệt độ [Bọ ve] 14 Bitt_C = t * 0,01-40; / / calc.
nhiệt độ từ bọ ve để [° C]
rh_lin = C3 * * rh rh C2 * rh C1; / / calc.
độ ẩm từ bọ ve để [% RH]
rh_true = (t_C-25) * (T1 T2 * rh) rh_lin; / / calc.
độ ẩm nhiệt độ bồi thường [% RH]if (rh_true> 100)
rh_true = 100; / / cắt giảm nếu giá trị là bên ngoài
if (rh_true <0,1)
rh_true = 0,1; / / các vật chất có thể có nhiều* P_temperature = t_C; / / quay trở lại nhiệt độ [° C]
* P_humidity = rh_true; / / trả lại độ ẩm [% RH]
)
/************************************************* *******************************/
/************************************************* *******************************// / Calcul de l'humidite en Entier (sans calcul float)/************************************************* *******************************/
/************************************************* *******************************/
int sht11_calc_humid_int (int16 w_humidity)
(
int32 h1, h2;h1 = ((int32) w_humidity) * ((int32) w_humidity);
h1 = h1 / (int32) năm 1000;
h1 = h1 * (int32) 28;
h2 = ((int32) w_humidity) * (int32) 405;
h2 = h2 - h1;
h2 = h2 / (int32) năm 1000;
h2 = h2 - (int32) 40;
h2 = h2 / (int32) 10;
trở lại (h2);
)/************************************************* *******************************/
/************************************************* *******************************// / Tính toán điểm sương
/ / Nhập vào: độ ẩm [% RH], nhiệt độ [° C]
/ / Đầu ra: sương điểm [° C]/************************************************* *******************************/
/************************************************* *******************************/
sht11_calc_dewpoint nổi (float h, float t)
(
float logEx, dew_point;
logEx = 0,66077 7,5 * t / (237,3 t) (log10 (h) -2);
dew_point = (logEx - 0,66077) * 237,3 / (0,66077 7,5-logEx);
dew_point trở lại;
)/************************************************* ********************************/
/************************************************* ********************************/
//------------------------------------------------ ----------------------------------
/ / Chương trình mẫu cho thấy làm thế nào để sử dụng chức năng SHT11
/ / 1.
thiết lập lại kết nối
/ / 2.
biện pháp [ẩm bọ ve] (12 bit) và [nhiệt độ bọ ve] (14 bit)
/ / 3.
tính toán độ ẩm [% RH] và [nhiệt độ C].
/ / 4.
tính toán [điểm sương C].
/ / 5.
in nhiệt độ, độ ẩm, điểm sương
/************************************************* *********************************/
/************************************************* *********************************/void main ()
(
giá trị humi_val, temp_val;
float dew_point;
unsigned char lỗi, kiểm tra, tạm thời;
sht11_connectionreset ();
trong khi (1)
(
lỗi = 0;
Lỗi = sht11_measure ((unsigned char *) & humi_val.i, và tổng kiểm tra, HUMI); / / đo độ ẩm
Lỗi = sht11_measure ((unsigned char *) & temp_val.i, và tổng kiểm tra, TEMP); / / đo nhiệt độ
if (lỗi! = 0)
sht11_connectionreset (); / / trong trường hợp lỗi: kết nối thiết lập lại
khác
(
humi_val.f = (float) humi_val.i; / / chuyển đổi số nguyên nổi
temp_val.f = (float) temp_val.i; / / chuyển đổi số nguyên nổi
sth11_calc (& humi_val.f, & temp_val.f); / / tính toán độ ẩm, nhiệt độ
dew_point = (humi_val.f, temp_val.f); sht11_calc_dewpoint / / tính toán điểm sương
/ / Gửi dữ liệu cuối cùng để giao tiếp nối tiếp (UART)
/ / Printf (temp: 5.1fC% humi:% 5.1f%% sương điểm: 5.1fC% \ n, temp_val.f, humi_val.f, dew_point);
/ / SendDataToPC (temp_val.f, 0x04);
/ / SendDataToPC (humi_val.f, 0x04);
/ / SendDataToPC (dew_point, 0x04); * /
floatToInt (temp_val.f);
floatToInt (humi_val.f);
floatToInt (dew_point);
floatToInt (lỗi)
//---------- Chờ khoảng.
0.8s để tránh làm nóng SHTxx ------------------------------
delay_ms (1000);
temp = '\ r';
sendDataToPC (& temp, 1);
/ / Temp = '\ n';
/ / SendDataToPC (& temp, 1);
)
)