» 공기품질 센서 아두이노 제어

공기품질 센서 아두이노 제어

by DUBUKIMCH

제어에 필요한 정보

연결 방법

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 프로토콜
    I2C 프로토콜 I2C 프로토콜 2 I2C 프로토콜 3
  • 내부 도면
    결과 사진 1
  • #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);
    }

You may also like

Leave a Comment

error: Content is protected !!