티스토리 뷰

아두이노

sht3x 온습도센서 (esp8266)

몽팡 2022. 4. 10. 21:59

 

 

개인적으로 아두이노 계열에서 사용 할수 있는 그나마 가성비가 가장 좋은 온습도 센서가

 

센시리온 sht 계열의 센서들이라 생각해요....

 

i2c 통신이라 하드웨어 인터페이스도 간단해서 좋구요...@_@

 

 

 

 

데이터 시트를 보면...

읽어들인 데이터에서 맨 처음 나오는 상위 8비트 + 하위 8비트가 온도 데이터이고

그뒤로 8비트의 체크섬이 따라 들어오고요....

 

다시 그뒤로 상위 8비트 + 8비트 조합으로 습도 데이터가 따라오고

바로 8비트의 체크섬이 따라 들어 오는 형식 이예요

 

 

 

센서가 i2c 통신을 하기 때문에 로직 아날라이저를 연결해서

 

현재의 온도와 습도를 프로토콜 데이터로 확인해 보기로 했어요...

 

원본 - 사진 클릭

 

처음 센서의 주소(0x44)가 나오고 ..

 

0x61 (MSB), 0xE3 (LSB), 0xB2 (체크섬) - 온도 데이터 (3바이트)

 

0x85 (MSB), 0x1F (LSB), 0xB8 (체크섬) - 습도 데이터 (3바이트)

 

차례 대로 데이터가 출력 되는걸 알수가 있어요

 

모두 합쳐 데이터의 길이는 총 6바이트가 되요...

 

 

 

데이터 시트를 보면 Polynomial, Initialization, Final XOR 이 세가지 항목을 통해

 

어떤 형식의 CRC 체크섬을 계산을 해야 하는지 알수가 있어요

 

 

 

 

Sunshine's Homepage - Online CRC Calculator Javascript (sunshine2k.de)

 

Sunshine's Homepage - Online CRC Calculator Javascript

Sunshine's Homepage - Online CRC Calculator Javascript CRC Calculator (Javascript) CRC width Bit length: CRC-8 CRC-16 CRC-32 CRC-64 CRC parametrization Predefined Custom CRC detailed parameters Input reflected: Result reflected: Polynomial: Initial Val

www.sunshine2k.de

 

위 사이트에 들어가서

 

로직 아날라이저에 나타난 데이터가 맞게 수신된 데이터인지 체크섬 계산을 해봄으로써 알수가 있어요

 

 

온도 데이터 체크섬 결과

 

 

습도 데이터 체크섬 결과

 

 

온도, 습도 둘 다 맞게 수신 되었다는걸 알수가 있어요....

 

이것들을 바탕으로 한 최종 코드는 아래와 같아요...@_@

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include <Wire.h>
 
unsigned int data[6];
uint16_t rawTMP, rawRH;
 
void setup(){
    Wire.begin();
    Serial.begin(115200);
}
 
void loop(){
    Wire.beginTransmission(0x44);
    Wire.write(0x2C);
    Wire.write(0x06);
    Wire.endTransmission();
    
 
    delay(20);
 
    Wire.requestFrom(0x446);
 
    if (Wire.available()!=6){
    
       Serial.println("i2c 수신 안됨");
    
    } else{
        
            
            for (int i=0;i<6;i++){
              data[i]=Wire.read();
            }
 
            delay(50);
 
            if ((CRC8(data[0],data[1],data[2])) && (CRC8(data[3],data[4],data[5]))){
 
                
                 
                 rawTMP = data[0];
                 rawTMP <<= 8;
                 rawTMP |= data[1];
                
                 rawRH = data[3];
                 rawRH <<= 8;
                 rawRH |= data[4];
                
                 float humidity = 100.0 * (rawRH / 65535.0);
 
                 Serial.print("Humidity: ");
                 Serial.println(humidity);
                  
 
                if(rawTMP & 0x8000){
                    
                    rawTMP &= 0x7fff;
                    
                    float cTemp = -45.0 + (175.0 * rawTMP / 65535.0);
                    
                    Serial.print("Sub zero: -");
                    Serial.println(cTemp);
                    Serial.println("_________________________");
                    // Serial.print("화씨: ");
                    // Serial.println(fTemp);
                    
                } else{
                  
                    float cTemp = -45.0 + (175.0 * rawTMP / 65535.0);
                    
                    Serial.print("Above zero: ");
                    Serial.println(cTemp);
                    Serial.println("_________________________");
                    // Serial.print("화씨: ");
                    // Serial.println(fTemp);
                   
                }
                 
            } else{
          
                 Serial.println("CRC 에러");
          
           }
 
    }
 
 
    delay(1000);
 
}
 
 
bool CRC8(uint8_t MSB, uint8_t LSB, uint8_t CRC)
{
    /*
     *    Poly  : 0x31    
     *    Init  : 0xFF
     *    XorOut: 0x00
     */
 
    uint8_t crc = 0xFF;
    uint8_t i;
    crc ^=MSB;
 
        for (i = 0; i < 8; i++)
            crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
 
    crc ^= LSB;
        for (i = 0; i < 8; i++)
            crc = crc & 0x80 ? (crc << 1) ^ 0x31 : crc << 1;
 
    if (crc==CRC)
    {
        return true;
    }
    else
    {
        return false;
    }
}
cs

 

 

끝으로...

 

 

온도...습도 공식은 데이터 시트를 참고 했어요..@_@

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/09   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함