sht11 problème de code - montre toujours la même valeur

A

amitumi1003

Guest
le problème est-il tousjours montrent la même valeur, même-je changer la température ou le code Humi pas.
le résultat est tousjours 37,22 4,25 64,13 0,1.

pls aider moi .........

Voici le code

Code:

# Include <18F8720.h>
# Include <math.h>
# Include <stdlib.h>Union typedef
(
unsigned int i;
float f;
) Valeur;# PORT_G octet = 0x00FD
# PORT_f octet = 0x0000
# PORT_c octet = 0x00BF
# PORT_D octet = 0x0000
# PORT_E octet = 0x0002
# Fusibles HS, NOLVP, NOWDT, NOPROTECT
retarder la consommation de # (horloge = 20000000)
# Utiliser rs232 (baud = 9600, AN = 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

/ / R commande ADR / w
# Define 0x06 sht_STATUS_REG_W / / 000 0011 0
# Define sht_STATUS_REG_R 0x07 / / 000 0011 1
# Define sht_MEASURE_TEMP 0x03 / / 000 0001 1
# Define sht_MEASURE_HUMI 0x05 / / 000 0010 1
# Define sht_RESET 0x1E / / 000 1111 0
/************************************************* *******************************/
/************************************************* *******************************/

/ / Envoie les données calculées à l'ordinateur

/************************************************* *******************************/
/************************************************* *******************************/

void sendDataToPC (char * data, int len)
(
int i;
output_high (PIN_G0);
delay_ms (10); / / wait

for (i = 0; i <len; i )
(
fprintf (COMM_B, "% c", les données *); / / écriture dans le fichier
des données ;
)
delay_ms (10); / / wait
output_low (PIN_G0);
delay_ms (10);
)checkLength int (int valeur)
(
int len = 0;
while (valeur! = 0)
(
= valeur value/10;
Len ;
)
Len retour;
)floatToInt vide (valeur double)
(
int a, REM, len = 0, prêté;
[Arr char 5];
char * data, temp;
double d = 100,0;
a = abs (valeur);
= CheckLength len (a);
= Len prêté;
while (a! = 0)
(
rem = 10%;
Arr len [-1] = 48 rem;
a = A/10;
len -;
)
data = arr;
sendDataToPC (données, prêté);

='.'; Temp
sendDataToPC (& temp, 1);

a = abs (valeur);
value = valeur-a;
* valeur = valeur d;
a = abs (valeur) 1;
= CheckLength len (a);
= Len prêté;
while (a! = 0)
(
rem = 10%;
Arr len [-1] = 48 rem;
a = A/10;
len -;
)
data = arr;
sendDataToPC (données, prêté);
temp = "";
sendDataToPC (& temp, 2);
)
/************************************************* ******************************/
/************************************************* ******************************/

/ / Ecrit un octet sur le sensibus et vérifie les reconnaître

/************************************************* ******************************/
/************************************************* ******************************/
sht11_write_byte char (unsigned char valeur)
(
unsigned char i, erreur = 0;
for (i = 0x80; i> 0; i / = 2) / bit / décalage pour le masquage
(
if (i & valeur)
output_high (sht11_data); / / masquage valeur avec i, écrivez à SENSI-BUS
d'autre
output_low (sht11_data);

output_high (sht11_sck); / / CLK pour SENSI-BUS
delay_us (5); / / env pulswith.nous 5
output_low (sht11_sck);
)
output_high (sht11_data); / / Communiqué de lignes de données
output_high (sht11_sck); / / CLK # 9 pour ack
= Erreur d'entrée (sht11_data); / ACK chèque / (données seront entraînées par SHT11)
output_low (sht11_sck);
erreur de retour; / / erreur = 1 En cas de non accuser
)/************************************************* *******************************/
/************************************************* *******************************/

/ / Lit une forme d'octets les sensibus et donne un accusé en cas de "ACK = 1"

/************************************************* *******************************/
/************************************************* *******************************/
sht11_read_byte char (unsigned char ACK)
(
unsigned char i, val = 0;
output_high (sht11_data); / / Communiqué de lignes de données
for (i = 0x80; i> 0; i / = 2) / bit / décalage pour le masquage
(
output_high (sht11_sck); / / CLK pour SENSI-BUS
if (entrée (sht11_data) == 1)
val = (val | i); / / lecture de bits
output_low (sht11_sck);
)
output_bit (sht11_data,! ack); / / en cas de "ack == 1" tirer vers le bas les lignes de données
output_high (sht11_sck); / / CLK # 9 pour ack
delay_us (5); / / env pulswith.nous 5
output_low (sht11_sck);
output_high (sht11_data); / / Communiqué de lignes de données
Val de retour;
)/************************************************* *******************************/
/************************************************* *******************************/

/ / Génère un début de transmission
/ / _____ ________
/ / DATA: |_______|
/ / ___ ___
/ / SCK: ___ | |___| |______

/************************************************* *******************************/
/************************************************* *******************************/
sht11_transstart (void)
(
output_high (sht11_data);
output_low (sht11_sck); / / Etat initial
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);
)
/************************************************* *******************************/
/************************************************* *******************************/

/ Reset / communication: les lignes de données = 1 et au moins 9 cycles SCK
/ / Suivi de transstart
/ / _____________________________________________________ ________
/ / DATA: |_______|
/ / _ _ _ _ _ _ _ _ _ ___ ___
/ / SCK: __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | | __ | |___| |______| |______

/************************************************* *******************************/
/************************************************* *******************************/

void sht11_connectionreset (void)
(
unsigned char i;
output_high (sht11_data);
output_low (sht11_sck); / / Etat initial
for (i = 0; i <9; i ) / / 9 SCK cycles
(
output_high (sht11_sck);
output_low (sht11_sck);
)
sht11_transstart (); / début de transmission /
)
/************************************************* *******************************/
/************************************************* *******************************/

/ / Réinitialise le capteur par un SoftReset

/************************************************* *******************************/
/************************************************* *******************************/
sht11_softreset char (void)
(
unsigned char d'erreur = 0;
sht11_connectionreset (); / / réinitialisation de la communication
D'erreur = sht11_write_byte (sht_RESET); / / envoyer RESET-commande à capteur
erreur de retour; / / erreur = 1 dans le cas d'aucune forme de réponse du capteur
)

/************************************************* *******************************/
/************************************************* *******************************/

/ / Lit le registre de l'état de contrôle (8-bit)

/************************************************* *******************************/
/************************************************* *******************************/
sht11_read_statusreg char ()
(
unsigned char d'erreur = 0;
unsigned char valeur prédictive, p_checksum;
sht11_transstart (); / début de transmission /
Erreur = sht11_write_byte (sht_STATUS_REG_R); / / envoie les commandes à capteur de
= valeur prédictive sht11_read_byte (sht_ACK); / / lecture de registre d'état (8-bit)
p_checksum = sht11_read_byte (sht_noACK); / / lecture de contrôle (8-bit)
erreur de retour; / / erreur = 1 dans le cas d'aucune forme de réponse du capteur
)
/************************************************* *******************************/
/************************************************* *******************************/

/ / Écrit le registre de l'état de contrôle (8-bit)

/************************************************* *******************************/
/************************************************* *******************************/

sht11_write_statusreg char (unsigned char * valeur prédictive)
(
unsigned char d'erreur = 0;
sht11_transstart (); / début de transmission /
D'erreur = sht11_write_byte (sht_STATUS_REG_W); / / envoie les commandes à capteur de
D'erreur = valeur prédictive sht11_write_byte * (); / / envoyer la valeur de registre d'état
erreur de retour; /> / erreur = 1 dans le cas d'aucune forme de réponse du capteur
)

/************************************************* *******************************/
/************************************************* *******************************/

/ / Effectue une mesure (humidité / température) avec contrôle

/************************************************* *******************************/
/************************************************* *******************************/
sht11_measure char (unsigned char * valeur prédictive, unsigned char * p_checksum, non signé en mode caractère)
(
Erreur non signé = 0;
unsigned int i;
sht11_transstart (); / début de transmission /
switch (mode)
(/ / Envoie les commandes à capteur de
cas TEMP: erreur = sht11_write_byte (sht_MEASURE_TEMP); break;
cas HUMI: erreur = sht11_write_byte (sht_MEASURE_HUMI); break;
default: break;
)

for (i = 0; i <65535; i )
if (entrée (sht11_data) == 0)
break; / / attendre capteur a terminé la mesure
if (entrée (sht11_data) == 1)
D'erreur = 1; / / ou de délai d'attente (~ 2 sec.) Est atteint

* (Valeur prédictive 1) = sht11_read_byte (sht_ACK); / / lire le premier octet (MSB)
* (Valeur prédictive) = sht11_read_byte (sht_ACK); / / lire le deuxième octet (LSB)
* = P_checksum sht11_read_byte (sht_noACK); / / lecture de contrôle
erreur de retour;
)
sht11_measure_temp char (unsigned char * valeur prédictive, non signé p_checksum char *)
(
sht11_measure retour (valeur prédictive, p_checksum, TEMP);
)

sht11_measure_humi char (unsigned char * valeur prédictive, non signé p_checksum char *)
(
sht11_measure retour (valeur prédictive, p_checksum, HUMI);
)/************************************************* *******************************/
/************************************************* *******************************/

/ / Calcule la température [° C] et [% d'humidité HR]
/ / Entrée: Humi [tiques] (12 bits)
/ / Temp [tiques] (14 bits)
/ / Sortie: [% Humi RH]
/ / Temp [° C]

/************************************************* *******************************/
/************************************************* *******************************/
void sth11_calc (float p_humidity *, float * p_temperature)
(
const float C1 =- 4,0; / / pour 12 bits
const char C2 = 0,0405; / / pour 12 bits
const float C3 =- 0,0000028; / / pour 12 bits
const float T1 = 0,01; / / pour le 14 bits @ 5V
const float T2 = 0,00008 / / pour le 14 bits @ 5V

float rh, t, rh_lin, rh_true, T_C;
/ / Rh_lin: Humidité linéaire
/ / Rh_true: température compensée d'humidité
/ / T_C: Température [° C]
=* P_humidity rh / / HR: humidité [tiques] 12 bits
=* P_temperature t / / t: température [tiques] 14 bits

T * = T_C 0,01 à 40; / / calc.température de tiques à [° C]
C3 * rh * rh rh * C2 = rh_lin C1; / / calc.l'humidité de tiques à [% HR]
rh_true = (T_C-25) * (T1 T2 * rh) rh_lin; / / calc.compensation de température [% d'humidité HR]

if (rh_true> 100)
rh_true = 100; / / couper si la valeur est en dehors de
if (rh_true <0,1)
rh_true = 0,1; / / la possible portée physique

* = P_temperature T_C; / / retour [° C]
* = P_humidity rh_true; / / Retourne% [d'humidité HR]
)/************************************************* *******************************/
/************************************************* *******************************/

/ / Calcul de l'humidite en ENTIER (sans flotteur Calcul)

/************************************************* *******************************/
/************************************************* *******************************/
sht11_calc_humid_int int (int16 w_humidity)
(
int32 h1, h2;

h1 = ((int32) w_humidity) * ((int32) w_humidity);
h1 = h1 / (int32) 1000;
h1 = h1 * (int32) 28;
h2 = ((int32) w_humidity) * (int32) 405;
h2 = h2 - h1;
h2 = h2 / (int32) 1000;
h2 = h2 - (int32) 40;
h2 = h2 / (int32) 10;
retour (H2);
)/************************************************* *******************************/
/************************************************* *******************************/

/ / Calcule le point de rosée
/ / Entrée:% d'humidité , [° C]
/ / Sortie: point de rosée [° C]

/************************************************* *******************************/
/************************************************* *******************************/
sht11_calc_dewpoint flottant (float h, float t)
(
float Logex, dew_point;
= 0,66077 Logex 7,5 * t / (237,3 T) (log10 (h) -2);
dew_point = (Logex - 0,66077) * 237,3 / (0,66077 7,5-Logex);
dew_point retour;
)

/************************************************* ********************************/
/************************************************* ********************************/
//------------------------------------------------ ----------------------------------
/ Programme / échantillon qui montre comment utiliser les fonctions SHT11
/ / 1.réinitialisation de la connexion
/ / 2.mesure [l'humidité tiques] (12 bits) et la température [tiques] (14 bits)
/ / 3.calculer% d'humidité et [la température. C]
/ / 4.calculer [point de rosée. C]
/ / 5., Température et humidité, point de rosée d'impression
/************************************************* *********************************/
/************************************************* *********************************/

void main ()
(
humi_val valeur, temp_val;
dew_point float;
unsigned char d'erreur, de contrôle, temp;
sht11_connectionreset ();
while (1)
(
erreur = 0;
D'erreur = sht11_measure ((unsigned char *) & humi_val.i, et de contrôle, HUMI); / mesurent l'humidité /
D'erreur = sht11_measure ((unsigned char *) & temp_val.i, et de contrôle, TEMP); / température / mesure
if (erreur! = 0)
sht11_connectionreset (); / / d'une erreur: connexion réinitialiser cas
d'autre
(
humi_val.f = (float) humi_val.i; / / convertit entier à flotter
temp_val.f = (float) temp_val.i; / / convertit entier à flotter
sth11_calc (& humi_val.f, & temp_val.f); / / calcul de l'humidité, la température
dew_point = sht11_calc_dewpoint (humi_val.f, temp_val.f); / / calcul du point de rosée
/ / Envoie les données définitives de l'interface série (UART)
/ / Printf (temp: 5.1fC% Humi:% 5.1f%% Point de rosée: 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 (erreur);

)
attendre environ //----------.0,8 s pour éviter de chauffer SHTxx ------------------------------
delay_ms (1000);
temp = '\ r';
sendDataToPC (& temp, 1);
/ / Temp = '\ n';
/ / SendDataToPC (& temp, 1);
)
)

 
comment je obtenir sht11 code C pour AVR???
pliss m'aider ..

 
- look on www.avrfreaks.net there are plenty of examples with SHTxx

tjiptotjupu
- Rechercher sur www.avrfreaks.net il ya beaucoup d'exemples avec SHTxx
Regz

 

Welcome to EDABoard.com

Sponsor

Back
Top