π 곡λΆνλ μ§μ§μνμΉ΄λ μ²μμ΄μ§?
[BSS μμ νκ³ κΉ¨λν μ§νμ² νμΉ λ° μ΄ν μ΅μ’ ] Subway (Co2 λλ μΈ‘μ νμ¬ LCD λ‘ μκ°ννκΈ°) λ³Έλ¬Έ
π©π» IoT (Embedded)/Arduino
[BSS μμ νκ³ κΉ¨λν μ§νμ² νμΉ λ° μ΄ν μ΅μ’ ] Subway (Co2 λλ μΈ‘μ νμ¬ LCD λ‘ μκ°ννκΈ°)
μ§μ§μνμΉ΄ 2023. 12. 22. 10:32728x90
λ°μν
β 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
λ°μν
'π©βπ» IoT (Embedded) > Arduino' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
Comments