😎 κ³΅λΆ€ν•˜λŠ” μ§•μ§•μ•ŒνŒŒμΉ΄λŠ” μ²˜μŒμ΄μ§€?

[BSS μ•ˆμ „ν•˜κ³  κΉ¨λ—ν•œ μ§€ν•˜μ²  νƒ‘μŠΉ 및 μš΄ν–‰ μ΅œμ’…] Subway (Co2 농도 μΈ‘μ •ν•˜μ—¬ LCD 둜 μ‹œκ°ν™”ν•˜κΈ°) λ³Έλ¬Έ

πŸ‘©‍πŸ’» IoT (Embedded)/Arduino

[BSS μ•ˆμ „ν•˜κ³  κΉ¨λ—ν•œ μ§€ν•˜μ²  νƒ‘μŠΉ 및 μš΄ν–‰ μ΅œμ’…] Subway (Co2 농도 μΈ‘μ •ν•˜μ—¬ LCD 둜 μ‹œκ°ν™”ν•˜κΈ°)

μ§•μ§•μ•ŒνŒŒμΉ΄ 2023. 12. 22. 10:32
728x90
λ°˜μ‘ν˜•

⭐ Subway

🚩 pub

MQ135 (Co2 κ°€μŠ€ μΈ‘μ • μ„Όμ„œ) 3 개의 값듀을 freeRTOS 둜 λ°›μ•„μ„œ PUB 둜 보내기

MQ135 (Co2 κ°€μŠ€ μΈ‘μ • μ„Όμ„œ) 3 개의 값듀을 LCD 둜 μ‹œκ°ν™”ν•˜κΈ°

 

βœ… MQ135_PUB

#include <MQUnifiedsensor.h>
#include "WiFiS3.h"
#include <Ethernet.h>
#include <PubSubClient.h>
#include <Arduino_FreeRTOS.h>

#define INCLUDE_vTaskDelayUntil = 1

#include <LiquidCrystal_I2C.h>
#include <Wire.h>

// WiFi and MQTT settings
#define WLAN_SSID "class924"
#define WLAN_PASS "kosta90009"
#define MQTT_SERVER "192.168.0.154"
#define MQTT_PORT 1883

#define MQ135_PIN_1 A0
#define MQ135_PIN_2 A1
#define MQ135_PIN_3 A2

#define LCD_ADDRESS 0x27
#define LCD_COLUMNS 16
#define LCD_ROWS 2

LiquidCrystal_I2C lcd(0x27, 16, 2);

WiFiClient ethClient;
PubSubClient mqtt(ethClient);

// MQ135 μ„Όμ„œ μ„ μ–Έ (placa, Voltage_Resolution, ADC_Bit_Resolution, pin, type)
MQUnifiedsensor MQ135_1("Arduino UNO", 5, 10, A0, "MQ-135_1");
MQUnifiedsensor MQ135_2("Arduino UNO", 5, 10, A1, "MQ-135_2");
MQUnifiedsensor MQ135_3("Arduino UNO", 5, 10, A2, "MQ-135_3");

unsigned long previousMillis = 0;
const long interval = 500;

TaskHandle_t Handle_aTask;
TaskHandle_t Handle_bTask;
TaskHandle_t Handle_cTask;

static void taskMQ135_1(void* pvParameters) {
         vTaskDelay(pdMS_TO_TICKS(1));

    // _PPM = a*ratio^b (PPM 농도와 μƒμˆ˜ 값을 κ³„μ‚°ν•˜κΈ° μœ„ν•œ μˆ˜ν•™ λͺ¨λΈ μ„€μ •)
    MQ135_1.setRegressionMethod(1);
    MQ135_1.init();
    MQ135_1.setRL(1);     // RL 값이 1K
    MQ135_1.setR0(3.12);  // μΊ˜λ¦¬λΈŒλ ˆμ΄μ…˜ν•˜μ—¬ 이 값을 ꡬ함 : MQ135.setR0(calcR0/10);

    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 1;
    xLastWakeTime = xTaskGetTickCount();
    while (1) {
        vTaskDelayUntil( &xLastWakeTime, xFrequency );
        // 데이터λ₯Ό μ—…λ°μ΄νŠΈν•˜λ©΄ arduinoκ°€ μ•„λ‚ λ‘œκ·Έ ν•€μ˜ 전압을 읽음
        MQ135_1.update();
        // CO2 농도λ₯Ό μ–»κΈ° μœ„ν•΄ ecuation κ°’ ꡬ성
        MQ135_1.setA(110.47);
        MQ135_1.setB(-2.862);
        // μ„€μ •λœ λͺ¨λΈκ³Ό a 및 b 값을 μ‚¬μš©ν•˜μ—¬ PPM 농도λ₯Ό 읽음
        float CO2_1 = MQ135_1.readSensor();

        // lcd 좜λ ₯
        lcd.setCursor(0, 0);
        lcd.print("Station: 1");

        lcd.setCursor(0, 1);
        lcd.print("Co2: ");
        lcd.print(CO2_1);
        mqtt.publish("sensor/mq135/_1", String(CO2_1).c_str());
				
				//λ”œλ ˆμ΄
        vTaskDelay(pdMS_TO_TICKS(2500));
				//pdMS_TO_TICKS()λ₯Ό μ •ν™•νžˆ λ°€λ¦¬μ΄ˆ 만큼 λ”œλ ˆμ΄λ₯Ό μ£ΌκΈ° μœ„ν•œ ν•¨μˆ˜.(μƒλŒ€μ‹œκ°„)
        lcd.clear();
    }
}

static void taskMQ135_2(void* pvParameters) {
     vTaskDelay(pdMS_TO_TICKS(200));
		 // _PPM = a*ratio^b (PPM 농도와 μƒμˆ˜ 값을 κ³„μ‚°ν•˜κΈ° μœ„ν•œ μˆ˜ν•™ λͺ¨λΈ μ„€μ •)
    MQ135_2.setRegressionMethod(1);
    MQ135_2.init();
    MQ135_2.setRL(1); // RL 값이 1K
    MQ135_2.setR0(3.12); // μΊ˜λ¦¬λΈŒλ ˆμ΄μ…˜ν•˜μ—¬ 이 값을 ꡬ함 : MQ135.setR0(calcR0/10);
    
    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 4;
    xLastWakeTime = xTaskGetTickCount();

    while (1) {
        vTaskDelayUntil( &xLastWakeTime, xFrequency );
        // 데이터λ₯Ό μ—…λ°μ΄νŠΈν•˜λ©΄ arduinoκ°€ μ•„λ‚ λ‘œκ·Έ ν•€μ˜ 전압을 읽음
        MQ135_2.update();
		    // CO2 농도λ₯Ό μ–»κΈ° μœ„ν•΄ ecuation κ°’ ꡬ성
        MQ135_2.setA(110.47);
        MQ135_2.setB(-2.862);
        // μ„€μ •λœ λͺ¨λΈκ³Ό a 및 b 값을 μ‚¬μš©ν•˜μ—¬ PPM 농도λ₯Ό 읽음
        float CO2_2 = MQ135_2.readSensor();
				
        // lcd 좜λ ₯
        lcd.setCursor(0, 0);
        lcd.print("Station: 2");

        lcd.setCursor(0, 1);
        lcd.print("Co2: ");
        lcd.print(CO2_2);
        mqtt.publish("sensor/mq135/_2", String(CO2_2).c_str());

				//λ”œλ ˆμ΄
        vTaskDelay(pdMS_TO_TICKS(6500));
        //pdMS_TO_TICKS()λ₯Ό μ •ν™•νžˆ λ°€λ¦¬μ΄ˆ 만큼 λ”œλ ˆμ΄λ₯Ό μ£ΌκΈ° μœ„ν•œ ν•¨μˆ˜.(μƒλŒ€μ‹œκ°„)

				lcd.clear();
    }
}
static void taskMQ135_3(void* pvParameters) {
     vTaskDelay(pdMS_TO_TICKS(500));
		 // _PPM = a*ratio^b (PPM 농도와 μƒμˆ˜ 값을 κ³„μ‚°ν•˜κΈ° μœ„ν•œ μˆ˜ν•™ λͺ¨λΈ μ„€μ •)
    MQ135_3.setRegressionMethod(1);
    MQ135_3.init();
    MQ135_3.setRL(1); // RL 값이 1K
    MQ135_3.setR0(3.12);  // μΊ˜λ¦¬λΈŒλ ˆμ΄μ…˜ν•˜μ—¬ 이 값을 ꡬ함 : MQ135.setR0(calcR0/10);

    TickType_t xLastWakeTime;
    const TickType_t xFrequency = 7;
    xLastWakeTime = xTaskGetTickCount();

    while (1) {
        vTaskDelayUntil( &xLastWakeTime, xFrequency );
				// 데이터λ₯Ό μ—…λ°μ΄νŠΈν•˜λ©΄ arduinoκ°€ μ•„λ‚ λ‘œκ·Έ ν•€μ˜ 전압을 읽음

        MQ135_3.update();
		    // CO2 농도λ₯Ό μ–»κΈ° μœ„ν•΄ ecuation κ°’ ꡬ성
        MQ135_3.setA(110.47);
        MQ135_3.setB(-2.862);
        // μ„€μ •λœ λͺ¨λΈκ³Ό a 및 b 값을 μ‚¬μš©ν•˜μ—¬ PPM 농도λ₯Ό 읽음
        float CO2_3 = MQ135_3.readSensor();

        // lcd 좜λ ₯
        lcd.setCursor(0, 0);
        lcd.print("Station: 3");

        lcd.setCursor(0, 1);
        lcd.print("Co2: ");
        lcd.print(CO2_3);       
        mqtt.publish("sensor/mq135/_3", String(CO2_3).c_str());
				
				//λ”œλ ˆμ΄
        vTaskDelay(pdMS_TO_TICKS(8500));
        //pdMS_TO_TICKS()λ₯Ό μ •ν™•νžˆ λ°€λ¦¬μ΄ˆ 만큼 λ”œλ ˆμ΄λ₯Ό μ£ΌκΈ° μœ„ν•œ ν•¨μˆ˜.(μƒλŒ€μ‹œκ°„)

        lcd.clear();
    }
    vTaskDelete(NULL);
}
void setup() {

  Serial.begin(9600);
  
  // LCD
  lcd.init();
  lcd.clear();
  lcd.backlight();

  delay(1000);
  // WiFi
  connectWiFi();
  delay(5000);

  // MQTT broker
  mqtt.setServer(MQTT_SERVER, MQTT_PORT);
  connectMQTT();

  // taskMQ135_1,2,3 λ³„λ‘œ νƒœμŠ€ν¬λ₯Ό λ§Œλ“€κ³  νƒœμŠ€ν¬ λ¦¬μŠ€νŠΈμ— μΆ”κ°€  tskIDLE_PRIORITY  μš°μ„ μˆœμœ„ μ„ μ •
  xTaskCreate(taskMQ135_1,"taskMQ135_1",256, NULL, tskIDLE_PRIORITY + 3, &Handle_aTask);
  xTaskCreate(taskMQ135_2,"taskMQ135_2",256, NULL, tskIDLE_PRIORITY + 2, &Handle_bTask);
  xTaskCreate(taskMQ135_3, "taskMQ135_3", 256, NULL, tskIDLE_PRIORITY + 1, &Handle_cTask);
	
	// νƒœμŠ€ν¬μ˜ μ œμ–΄κΆŒμ„ λΆ€μ—¬ν•΄μ€Œ
  vTaskStartScheduler();
}

void loop() 
{

}


void connectWiFi() 
{
  Serial.println("Connecting to WiFi");
  WiFi.begin(WLAN_SSID, WLAN_PASS);

  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Connecting to WiFi...");
  }

  Serial.println("Connected to WiFi");
}

void connectMQTT() 
{
  Serial.println("Connecting to MQTT");
  while (!mqtt.connected()) {
    if (mqtt.connect("MQ135Client")) {
      Serial.println("Connected to MQTT");
    } else {
      Serial.print("Failed to connect to MQTT, rc=");
      Serial.print(mqtt.state());
      Serial.println(" Retrying in 5 seconds...");
      delay(5000);
    }
  }
}

728x90
λ°˜μ‘ν˜•
Comments