1 | #include <at89c5131.h> // Registeradressen
|
2 | #include <stdio.h> // für sprintf
|
3 | #include <lcd.h>
|
4 | #include <math.h>
|
5 | #include "emuI2C.h"
|
6 |
|
7 | #define HYT_ADRESS 0x28
|
8 | #define HYT_ADRESS1 0x28
|
9 |
|
10 |
|
11 | double taupunkt;
|
12 |
|
13 | float temperature;
|
14 | float humidity;
|
15 |
|
16 | extern void initlcd (void); // in \hilf_c\lcd.c
|
17 |
|
18 |
|
19 | extern void loeschenlcd (void); // in \hilf_c\lcd.c
|
20 | extern void textlcd (unsigned char *, unsigned char); // in \hilf_c\lcd.c
|
21 |
|
22 | void warte100us (unsigned int anzahl)
|
23 | {
|
24 | unsigned int z1,z2;
|
25 | for (z2 = anzahl; z2 != 0; --z2)
|
26 | {
|
27 | for (z1 = 255; z1!= 0; --z1);
|
28 | };
|
29 | }
|
30 |
|
31 | float calc_dewpoint(float h,float t)
|
32 | //--------------------------------------------------------------------
|
33 | // calculates dew point
|
34 | // input: humidity [%RH], temperature [°C]
|
35 | // output: dew point [°C]
|
36 | {
|
37 | float k,dew_point;
|
38 | k = (log10(h)-2)/0.4343 + (17.62*t)/(243.12+t);
|
39 | dew_point = 243.12*k/(17.62-k);
|
40 | return dew_point;
|
41 |
|
42 | }
|
43 |
|
44 |
|
45 | void main (void)
|
46 | {
|
47 | // sende Daten ueber I2C
|
48 | //unsigned char test[1] ={0x00};
|
49 |
|
50 | unsigned char buf [20] ; // für LCD-Anzeige float kommazahl;
|
51 | unsigned char raw_value_temp;
|
52 | unsigned char raw_value_humid;
|
53 |
|
54 |
|
55 | float ausw_taupunkt = taupunkt;
|
56 |
|
57 | P2 = 0;
|
58 | initlcd (); // Initialisierung LCD-Display an P0
|
59 | loeschenlcd (); // Anzeige löschen
|
60 |
|
61 |
|
62 |
|
63 | while (1)
|
64 | {
|
65 |
|
66 | unsigned char msg[4] ={0x00};
|
67 | unsigned char msg1[4] ={0x00};
|
68 | unsigned char test[4] ={0x00};
|
69 |
|
70 | msg[0] = HYT_ADRESS; // Slave Adresse
|
71 | EmuI2C_SendData (msg, 1); // Daten senden via I2C
|
72 |
|
73 | warte100us(100);
|
74 |
|
75 | msg1[0] = HYT_ADRESS1; // Slave Adresse
|
76 | EmuI2C_ReceiveData(msg, 4); // Daten empfangen via I2C
|
77 |
|
78 |
|
79 |
|
80 |
|
81 | raw_value_temp = ((msg[2] << 8) | msg[3]) >> 2;
|
82 | // Rohwert der Feuchte als 14bit -Wert im 1. und 2. Datenbyte, der Wert ist rechtsbuendig
|
83 | // ausgerichtet, im 1. Datenbyte mussen die beiden Statusbits geloescht werden
|
84 | raw_value_humid = ((msg[0] & 0x3F) << 8) | test[1];
|
85 | temperature = ((float)(raw_value_temp) * 165.0F / 16383.0F) - 40.0;
|
86 | humidity = (float)raw_value_humid * 100.0F / 16383.0F;
|
87 | taupunkt = calc_dewpoint(humidity,temperature);
|
88 |
|
89 | sprintf (buf,"T: %3.1f\xdf H:%3.1f%%",temperature,humidity);
|
90 |
|
91 | textlcd (buf,1);
|
92 |
|
93 |
|
94 |
|
95 | sprintf (buf,"Taupunkt: %3.1f\xdf ",taupunkt);
|
96 |
|
97 | textlcd (buf,2);
|
98 |
|
99 |
|
100 |
|
101 | }
|
102 |
|
103 |
|
104 | }
|