74
제어에 필요한 정보
연결 방법
I2C 통신 연결
- START: 통신을 시작하기 위해 마스터(Arduino)에 의해 시작됩니다.
- WRITE/READ: 센서로 데이터를 보낼지 아니면 센서에서 데이터를 읽을지를 지정합니다.
- ACK/NACK: 수신기(센서) 또는 마스터(Arduino)에서 보낸 승인 또는 비승인 신호입니다.
- STOP: 통신을 종료합니다.
배선 연결
- GND(핀 1): Arduino GND에 연결합니다.
- RX/SDA(핀 2): Arduino SDA(Uno R4 WiFi의 A4)에 연결합니다.
- TX/SCL(핀 3): Arduino SCL(Uno R4 WiFi의 A5)에 연결합니다.
- +5V(핀 4): Arduino 5V에 연결합니다.
참고 자료
- 내부 도면
- I2C 프로토콜
- 내부 도면
#include <Wire.h>
// Define sensor address
const byte SENSOR_ADDRESS = 0x50; // Replace with the correct I2C address if different
void setup() {
// Start serial communication for debugging
Serial.begin(9600);
// Initialize I2C communication
Wire.begin();
// Send a command to the sensor
sendCommand();
}
void loop() {
// Read data from the sensor
readSensorData();
// Wait for a while before the next read
delay(1000); // 1 second delay
}
void sendCommand() {
Wire.beginTransmission(SENSOR_ADDRESS);
Wire.write(0x16); // Frame header
Wire.write(0x07); // Frame length (7 bytes)
Wire.write(0x02); // Open measurement mode (for example)
Wire.write(0x00); // High byte of DF1
Wire.write(0x00); // Low byte of DF1
Wire.write(0x00); // Reserved
Wire.write((0x16 ^ 0x07 ^ 0x02 ^ 0x00 ^ 0x00 ^ 0x00)); // Data check code
Wire.endTransmission();
}
void readSensorData() {
Wire.requestFrom(SENSOR_ADDRESS, 25); // Request 25 bytes of data
if (Wire.available()) {
byte data[25];
for (int i = 0; i < 25; i++) {
data[i] = Wire.read();
}
// Process and display the data
processSensorData(data);
} else {
Serial.println("No data available");
}
}
void processSensorData(byte data[]) {
// Extract and print each piece of data from the response
int co2 = (data[3] << 8) | data[4];
int voc = (data[5] << 8) | data[6];
float humidity = ((data[7] << 8) | data[8]) / 10.0;
float temperature = ((data[9] << 8) | data[10] - 500) / 10.0;
int pm1_0 = (data[11] << 8) | data[12];
int pm2_5 = (data[13] << 8) | data[14];
int pm10 = (data[15] << 8) | data[16];
int vocNowRef = (data[17] << 8) | data[18];
int vocRefR = (data[19] << 8) | data[20];
int vocNowR = (data[21] << 8) | data[22];
byte sensorState = data[23];
// Print the values
Serial.print("CO2: "); Serial.println(co2);
Serial.print("VOC: "); Serial.println(voc);
Serial.print("Humidity: "); Serial.println(humidity);
Serial.print("Temperature: "); Serial.println(temperature);
Serial.print("PM1.0: "); Serial.println(pm1_0);
Serial.print("PM2.5: "); Serial.println(pm2_5);
Serial.print("PM10: "); Serial.println(pm10);
Serial.print("VOC Now/Ref. %: "); Serial.println(vocNowRef);
Serial.print("VOC Ref. R Value: "); Serial.println(vocRefR);
Serial.print("VOC Now R Value: "); Serial.println(vocNowR);
Serial.print("Sensor State: "); Serial.println(sensorState, HEX);
}