Jane Deng
Published

CO2 Monitoring and Early Warning Using Wio Terminal

Wio Terminal with SCD30 sensor to measure the indoor air quality and remind you.

BeginnerFull instructions provided1 hour983
CO2 Monitoring and Early Warning Using Wio Terminal

Things used in this project

Story

Read more

Code

wioterminal_co2_traffic_light.ino

Arduino
  #include"TFT_eSPI.h"
   TFT_eSPI tft;
   #define LCD_BACKLIGHT (72Ul)
   bool tft_backlight = true;
   #include <Arduino.h>
   #include "Seeed_FS.h" 
   #include "RawImage.h"
   #include "Free_Fonts.h"       


   #include "SCD30.h"
   int grove_scd30_co2   = 0;
   int grove_scd30_temp  = 0;
   int grove_scd30_humi  = 0;
   int scd30_temp_offset = -4;
   int scd30_humi_offset = 13;
   
   
   void sensor_co2()
   {
     float result[3] = {0};
  
     if (scd30.isAvailable()) 
     {
      scd30.getCarbonDioxideConcentration(result);
      grove_scd30_co2  = result[0];
      grove_scd30_temp = result[1];
      grove_scd30_humi = result[2];
      // serial print of all sensor values
      Serial.print(F("[?] GROVE SCD30 CO2 --> "));
      Serial.print("SCD30-CO2:"); Serial.print(grove_scd30_co2); 
      Serial.print("  SCD30-T:"); Serial.print(grove_scd30_temp+scd30_temp_offset);  
      Serial.print("  SCD30-H:"); Serial.println(grove_scd30_humi+scd30_humi_offset);
      // display co2 pictures on TFT
      const char* list[] = {"co2-low-rgb565.bmp", "co2-mid1-rgb565.bmp", "co2-mid2-rgb565.bmp", "co2-high1-rgb565.bmp", "co2-high2-rgb565.bmp"};
      // rgb traffic light (planned)
      int r,g,b;
      uint8_t cnt = 0;
      if (grove_scd30_co2<700)   { r=0;   g=127; b=0; cnt=0; }
      if (grove_scd30_co2>=700)  { r=0;   g=127; b=0; cnt=1; }
      if (grove_scd30_co2>=1000) { r=127; g=127; b=0; cnt=2; }
      if (grove_scd30_co2>=1500) { r=127; g=0;   b=0; cnt=3; wio_buzzer();}
      if (grove_scd30_co2>=2000) { r=127; g=0;   b=0; cnt=4; wio_buzzer();} 
      drawImage<uint16_t>(list[cnt],0,0); 
      tft.setTextColor(TFT_BLACK,TFT_WHITE);
      tft.setFreeFont(FMB18);
      tft.drawNumber(grove_scd30_co2,80,190);                 
     }
   }
  
  void wio_buzzer(){
    analogWrite(WIO_BUZZER, 128);
    delay(1000);
    analogWrite(WIO_BUZZER, 0);
    delay(1000);
    
    }

   // this timer is used to update tft display
   unsigned long previousMillis = 0;
   // send every 10 minutes
   // unsigned long interval = 600000;  
   // send every 3 minutes
   // unsigned long interval = 180000;
   // send every 30 seconds
   unsigned long interval = 30000;   
   unsigned long counter  = 0; 


void tft_display_status_bar(String room_name, long int room_bg) 
{
  tft.fillRect(0,0,320,50,room_bg);
  tft.setFreeFont(FMB18);
  tft.setTextColor(TFT_WHITE);
  tft.setCursor((320 - tft.textWidth(room_name)) / 2, 32);
  tft.print(room_name); 
}


void tft_display_room_screen(String room_name, long int room_bg) 
{
  tft.fillScreen(TFT_WHITE);
  tft.fillRect(0,0,320,50,room_bg);
  tft.setFreeFont(FMB18);
  tft.setTextColor(TFT_WHITE);
  tft.setCursor((320 - tft.textWidth(room_name)) / 2, 32);
  tft.print(room_name);
  // drawing verticle line
  tft.drawFastVLine(150,50,190,TFT_DARKGREEN);
  // drawing horizontal line
  tft.drawFastHLine(0,140,320,TFT_DARKGREEN);  
}


void tft_display_sensor_temperature(int temperature) 
{
  // setting the temperature
  tft.setTextColor(TFT_BLACK);
  tft.setFreeFont(FMB9);
  tft.drawString("Temperature",15,65);
  tft.setTextColor(TFT_BLACK);
  tft.setFreeFont(FMB18);
  tft.drawNumber(temperature,50,95);
  //tft.drawNumber(21,50,95);
  tft.setFreeFont(FMB12);
  tft.drawString("C",100,95);  
}

void tft_display_sensor_humidity(int humidity) 
{
  // setting the humidity
  tft.setTextColor(TFT_BLACK);
  tft.setFreeFont(FMB9);
  tft.drawString("Humidity",30,160);
  tft.setTextColor(TFT_BLACK);
  tft.setFreeFont(FMB18);
  tft.drawNumber(humidity,50,190);
  tft.setFreeFont(FMB12);
  tft.drawString("%",100,190);
}


void tft_display_sensor_co2(int co2) 
{ 
  // setting the CO2
  tft.setTextColor(TFT_BLACK);
  tft.setFreeFont(FMB9);
  tft.drawString("CO2",220,160);
  tft.setTextColor(TFT_BLACK);
  tft.setFreeFont(FMB18);
  tft.drawNumber(co2,160,190);
  tft.setFreeFont(FMB12);
  tft.drawString("ppm",250,190);
}


void setup() 
{
  Serial.begin(9600);
  delay(3000);
  Serial.println(F(" "));
  Serial.println(F(" "));
  Serial.println(F("Starting..."));
  Serial.println(F("WioTerminal CO2 Traffic Light Version 1.00"));
  Serial.println(F("GROVE SCD30 connected via I2C"));
  Serial.println(F(" "));

  pinMode(WIO_KEY_A, INPUT_PULLUP);
  pinMode(WIO_KEY_B, INPUT_PULLUP);
  pinMode(WIO_KEY_C, INPUT_PULLUP);
  pinMode(WIO_BUZZER, OUTPUT);


  Serial.println(F("[?] SD card initialize.."));
  if (!SD.begin(SDCARD_SS_PIN, SDCARD_SPI)) 
  {
    while (1);
  }
  
  tft.begin();
  tft.setRotation(3);
  Serial.println(F("[?] GROVE SCD30 CO2 sensor initialize.."));
  Wire.begin();
  scd30.initialize();
  delay(500);
  sensor_co2();  
}

void loop() 
{
  if (digitalRead(WIO_KEY_A) == LOW) 
  {
    Serial.println("[x} A Key pressed");   
    delay(200);
    // display room screen
    tft_display_room_screen("Bed-Room", TFT_BLUE);
    // display temperature sensor
    tft_display_sensor_temperature(grove_scd30_temp+scd30_temp_offset);
    // display humidity sensor
    tft_display_sensor_humidity(grove_scd30_humi+scd30_humi_offset);  
    // display co2 sensor
    tft_display_sensor_co2(grove_scd30_co2);    
    
  }
  else if (digitalRead(WIO_KEY_B) == LOW) 
  {
    Serial.println("[x] B Key pressed");     
    delay(200);
    // read the co2 sensor */
    sensor_co2();
  }
  else if (digitalRead(WIO_KEY_C) == LOW) 
  {
    Serial.println("[x] C Key pressed");
    tft_backlight = !tft_backlight;
     // Turning off the LCD backlight
    if (tft_backlight == false) { digitalWrite(LCD_BACKLIGHT, LOW);  }
     // Turning on the LCD backlight
    if (tft_backlight == true)  { digitalWrite(LCD_BACKLIGHT, HIGH); }
    delay(200);
  }
  

  
  if (millis() - previousMillis > interval)
  {
    // correct timer
    previousMillis = millis();
    // read the co2 sensor */
    sensor_co2();
  }
  
}

Credits

Jane Deng
1 project • 10 followers
Social Media Operations Specialist at Seeed Studio
Contact

Comments

Please log in or sign up to comment.