티스토리 뷰
개인적으로 아두이노 계열에서 사용 할수 있는 그나마 가성비가 가장 좋은 온습도 센서가
센시리온 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(0x44, 6);
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
- sht3x
- 멀티미터
- 온도센서
- CRC
- eevblog
- PLC
- I2C
- 온도 센서
- attiny85
- ds1631
- 토뱅카드
- esp8266
- 습도 센서
- TL866
- 토스뱅크
- 전류
- 전압측정
- 아두이노
- 전류측정
- ucurrent gold
- 롬라이터
- 토뱅
- 토스뱅크 카드
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |