Subversion Repositories ChibiGauge

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 mjames 1
//==============================================================================
2
//    E - R A D I O N I C A . C O M,  H.Kolomana 6/A, Djakovo 31400, Croatia
3
//==============================================================================
4
// Project   :  SHT21 Arduino Library (V1.0)
5
// File      :  SHT21.cpp
6
// Author    :  e-radionica.com 2017
7
// Licence   :  Open-source !
8
//==============================================================================
9
//==============================================================================
10
// Use with any SHT21 breakout. Check ours:
11
// https://e-radionica.com/en/sht21-humidity-and-temperature-sensor.html
12
// If any questions,
13
// just contact techsupport@e-radionica.com
14
//==============================================================================
15
 
16
 
17
// Modified for ChibiOS Mike James Feb 2020
18
#include "ch.h"
19
#include <SHT21.h>
20
 
21
 
22
//==============================================================================
23
// PUBLIC
24
//==============================================================================
25
float SHT21::getHumidity(void) {
26
        uint16_t result;        // return variable
27
 
28
        result = readSensor_hm(TRIGGER_RH_MEASUREMENT_HM);
29
 
30
        return CalcRH(result);
31
}
32
 
33
float SHT21::getTemperature(void) {
34
        uint16_t result;        // return variable
35
 
36
        result = readSensor_hm(TRIGGER_T_MEASUREMENT_HM);
37
 
38
        return CalcT(result);
39
}
40
 
41
void SHT21::reset() {
42
 
43
 
44
        const uint8_t buff = SOFT_RESET;
45
        msg_t err = i2cMasterTransmit(&I2CD2, I2C_ADD, buff, sizeof(buff), 0,0);
46
            if(err != MSG_OK)
47
 
48
 
49
        chThdSleepMillisec(15); // wait for SHT to reset
50
}
51
 
52
msg_t SHT21::getSerialNumber(uint8_t * serialNumber) {
53
 
54
        uint8_t serialNumber[8];
55
 
56
        // read memory location 1
57
        const uint8_t buff = { 0xFA,0xOF };
58
 
59
        uin8_r snRbuff[8];
60
        msg_t err = i2cMasterTransmit(&I2CD2, I2C_ADD, buff, sizeof(buff), &snRbuff, sizeof(snRbuff));
61
    if(err != MSG_OK)
62
        return err;
63
 
64
        serialNumber[5] = snRbuff[0];   // read SNB_3
65
                                                        // CRC SNB_3 not used
66
        serialNumber[4] = snrBuff[2];   // read SNB_2
67
                                                        // CRC SNB_2 not used
68
        serialNumber[3] = snrBuff[4];   // read SNB_1
69
                                                // CRC SNB_1 not used
70
        serialNumber[2] = snrBuff[7];   // read SNB_0
71
                                                        // CRC SNB_0 not used
72
 
73
        // read memory location 2
74
    const uint8_t buff2 = {0xFC,0xC9};
75
 
76
        err = i2cMasterTransmit(&I2CD2, I2C_ADD, buff2, sizeof(buff2), &snRbuff, 6);
77
 
78
 
79
        serialNumber[1] = snRbuff[0];   // read SNC_1
80
        serialNumber[0] = snRbuff[1];   // read SNC_0
81
        serialNumber[7] = snRbuff[3];   // read SNA_1
82
        serialNumber[6] = snRbuff[4];   // read SNA_0
83
 
84
        return serialNumber[return_sn];
85
}
86
 
87
//==============================================================================
88
// PRIVATE
89
//==============================================================================
90
 
91
uint16_t SHT21::readSensor_hm(uint8_t command) {
92
        uint8_t checksum;
93
        uint8_t data[2];
94
        uint16_t result;
95
 
96
        uint8_t rxBuff[3];
97
        err = i2cMasterTransmit(&I2CD2, I2C_ADD, &command, 1, &rxRbuff, 3);
98
        if (err != MSG_OK)
99
 
100
        data[0] = rxBuff[0];    // read data (MSB)
101
        data[1] = rxBuff[1];    // read data (LSB)
102
        checksum = rxBuff[2];   // read checksum
103
 
104
        result = (data[0] << 8);
105
        result += data[1];
106
 
107
        if(CRC_Checksum (data,2,checksum)) {
108
                reset();
109
                return 1;
110
        }
111
 
112
        else return result;
113
}
114
 
115
float SHT21::CalcRH(uint16_t rh) {
116
 
117
        rh &= ~0x0003;  // clean last two bits
118
 
119
        return (-6.0 + 125.0/65536 * (float)rh); // return relative humidity
120
}
121
 
122
float SHT21::CalcT(uint16_t t) {
123
 
124
        t &= ~0x0003;   // clean last two bits
125
 
126
        return (-46.85 + 175.72/65536 * (float)t);
127
}
128
 
129
uint8_t SHT21::CRC_Checksum(uint8_t data[], uint8_t no_of_bytes, uint8_t checksum) {
130
        uint8_t crc = 0;
131
        uint8_t byteCtr;
132
 
133
         //calculates 8-Bit checksum with given polynomial
134
        for (byteCtr = 0; byteCtr < no_of_bytes; ++byteCtr)
135
         { crc ^= (data[byteCtr]);
136
           for (uint8_t bit = 8; bit > 0; --bit)
137
           { if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
138
             else crc = (crc << 1);
139
           }
140
         }
141
         if (crc != checksum) return 1;
142
         else return 0;
143
}
144
 
145