#include "Adafruit_GFX.h"
#include "Adafruit_ILI9341.h"
#include "DHT.h"
#include "RTClib.h"
#include "SPI.h"
#include <Adafruit_NeoPixel.h>
// #include <GP2Y1010AU0F.h>
// #include <MiCS6814-I2C.h>
#include <SD.h>
#include <Wire.h>
#include <avr/power.h>
// #define TFT_DC 9
// #define TFT_CS 10
// #define TFT_RST 8
#define TFT_CS 53
#define TFT_DC 48
#define TFT_RST 51
Adafruit_ILI9341 tft = Adafruit_ILI9341(TFT_CS, TFT_DC, TFT_RST);
#define LED_PIN 6
#define LED_COUNT 6
#define LED_TYPE NEO_GRB + NEO_KHZ800
#define brightness 50
Adafruit_NeoPixel strip_neopixel =
Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_TYPE);
// MiCS6814 sensorMiCS6814;
float _co, _no2, _nh3;
#define CO_PIN A3
#define NO2_PIN A5
#define NH3_PIN A4
#define MQ135_PIN A0
#define MQ7_PIN A2
#define GP2Y1010AU0F_PIN A1
#define GP2Y1010AU0F_LED_PIN 3
int samplingTime = 280;
int deltaTime = 40;
int sleepTime = 9680;
float voMeasured = 0;
float calcVoltage = 0;
float dustDensity = 0;
// GP2Y1010AU0F sensorGP2Y1010AU0F(GP2Y1010AU0F_PIN, GP2Y1010AU0F_LED_PIN);
#define sd_select_pin 53
#define data_file "data.csv"
#define DHTPIN 2
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
RTC_DS1307 rtc;
char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday", "Saturday"};
float humidity, temperature;
float last_humidity, last_temperature;
float mq135_value;
float mq7_value;
// float dustDensity;
int _hour, _minute, _second, _day, _month, _year;
// an toàn
#define safe_color (0, 0, 255)
// trung bình
#define average_color (0, 176, 24)
// kém
#define poor_color (255, 255, 0)
// rất kém
#define very_poor_color (255, 93, 93)
// nguy hiểm
#define danger_color (255, 0, 0)
void setup() {
Serial.begin(57600);
// setup_rtc();
// setup_dht();
// setup_mics6814();
setup_tft();
// setup_neopixel();
// setup_sd();
// setup_gp2y1010au0f();
}
void loop() {
// get_time_rtc();
// read_dht();
// read_mq135();
// read_gp2y1010au0f();
// read_MiCS6814();
// print_console();
// read_mq7();
// set_led_color_follow_data();
// save_all_data_sd();
display_data_lcd();
delay(1000);
}
void set_led_color_follow_data() {
if (dustDensity > 0 && dustDensity <= 100) {
set_led_color(safe_color);
} else if (dustDensity > 100 && dustDensity <= 200) {
set_led_color(average_color);
} else if (dustDensity > 200 && dustDensity <= 300) {
set_led_color(poor_color);
} else if (dustDensity > 300 && dustDensity <= 400) {
set_led_color(very_poor_color);
} else if (dustDensity > 400) {
set_led_color(danger_color);
}
}
void setup_tft() {
tft.begin();
tft.setRotation(3);
tft.fillScreen(ILI9341_BLACK);
}
bool isChange = false;
unsigned long lastTimeDisplayTFT = 0;
unsigned long timeDisplayTFT = 0000;
void display_data_lcd() {
if (millis() - lastTimeDisplayTFT > timeDisplayTFT) {
lastTimeDisplayTFT = millis();
isChange = true;
}
String title_left[5] = {"NHIET DO", "DO AM", "KHI CO", "KHI NO2", "TIME"};
String title_right[5] = {"KHI MQ7", "KHI MQ135", "DO BUI", "KHI NH3", "DATE"};
String data_left[5] = {String(temperature, 1), String(humidity, 1),
String(_co, 1), String(_no2, 1),
String(_hour) + ":" + String(_minute) + ":" +
String(_second)};
String data_right[5] = {String(mq7_value, 1), String(mq135_value, 1),
String(dustDensity, 1), String(_nh3, 1),
String(_day) + "/" + String(_month) + "/" +
String(_year)};
String unit_left[5] = {"*C", "%", "ppm", "ppm", ""};
String unit_right[5] = {"ppm", "ppm", "ppm", "ppm", ""};
if (isChange) {
isChange = false;
tft.drawRect(0, 0, 320, 30, ILI9341_RED);
tft.setCursor(50, 10);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(2);
tft.println("Air Quality Monitor");
// from 30 to end of height, draw box for data
for (int i = 0; i < 5; i++) {
// clear box for data
tft.fillRect(70, 60 + i * 30, 70, 20, ILI9341_BLACK);
if (title_left[i] == "TIME") {
tft.fillRect(45, 60 + i * 30, 120, 20, ILI9341_BLACK);
} else {
tft.fillRect(70, 60 + i * 30, 70, 20, ILI9341_BLACK);
}
tft.fillRect(240, 60 + i * 30, 70, 20, ILI9341_BLACK);
if (title_right[i] == "DATE") {
tft.fillRect(200, 60 + i * 30, 120, 20, ILI9341_BLACK);
} else {
tft.fillRect(240, 60 + i * 30, 70, 20, ILI9341_BLACK);
}
// draw box for data
tft.drawRect(0, 60 + i * 30, 160, 30, ILI9341_GREEN);
tft.drawRect(160, 60 + i * 30, 160, 30, ILI9341_GREEN);
tft.setCursor(10, 70 + i * 30);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(0);
tft.println(title_left[i]);
if (title_left[i] == "TIME") {
tft.setCursor(45, 65 + i * 30);
tft.setTextColor(ILI9341_GREENYELLOW);
tft.setTextSize(2);
tft.println(data_left[i]);
} else {
tft.setCursor(70, 65 + i * 30);
tft.setTextColor(ILI9341_GREENYELLOW);
tft.setTextSize(2);
tft.println(data_left[i]);
}
tft.setCursor(140, 70 + i * 30);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(1);
tft.println(unit_left[i]);
tft.setCursor(170, 70 + i * 30);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(0);
tft.println(title_right[i]);
if (title_right[i] == "DATE") {
tft.setCursor(200, 65 + i * 30);
tft.setTextColor(ILI9341_GREENYELLOW);
tft.setTextSize(2);
tft.println(data_right[i]);
} else {
tft.setCursor(240, 65 + i * 30);
tft.setTextColor(ILI9341_GREENYELLOW);
tft.setTextSize(2);
tft.println(data_right[i]);
}
tft.setCursor(300, 70 + i * 30);
tft.setTextColor(ILI9341_WHITE);
tft.setTextSize(0);
tft.println(unit_right[i]);
}
}
}
void read_mq7() { mq7_value = analogRead(MQ7_PIN); }
void setup_neopixel() {
strip_neopixel.begin();
strip_neopixel.show();
strip_neopixel.setBrightness(brightness);
set_led_color(safe_color);
}
void set_led_color(uint32_t color) {
for (int i = 0; i < LED_COUNT; i++) {
strip_neopixel.setPixelColor(i, color);
}
strip_neopixel.show();
}
void read_mq135() { mq135_value = analogRead(MQ135_PIN); }
void print_console() {
Serial.print("Time: ");
// get_time_rtc();
Serial.print(_hour);
Serial.print(":");
Serial.print(_minute);
Serial.print(" \t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.print(" *C\t");
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("CO: ");
Serial.print(_co);
Serial.print(" ppm\t");
Serial.print("NO2: ");
Serial.print(_no2);
Serial.print(" ppm\t");
Serial.print("NH3: ");
Serial.print(_nh3);
Serial.print(" ppm\t");
Serial.print("MQ135: ");
Serial.print(mq135_value);
Serial.print(" ppm\t");
Serial.print("Dust: ");
Serial.print(dustDensity);
Serial.println(" ppm");
}
void setup_sd() {
if (!SD.begin(sd_select_pin)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
}
unsigned long old_time_save = 0;
unsigned long time_save = 10000;
void save_all_data_sd() {
if (millis() - old_time_save > time_save) {
old_time_save = millis();
File dataFile = SD.open(data_file, O_APPEND);
if (dataFile) {
dataFile.print("Time: ");
// get_time_rtc();
dataFile.print(_hour);
dataFile.print(":");
dataFile.print(_minute);
dataFile.print(" ");
dataFile.print(_day);
dataFile.print("/");
dataFile.print(_month);
dataFile.print("/");
dataFile.print(_year);
dataFile.print("\t");
dataFile.print("Temperature: ");
dataFile.print(temperature);
dataFile.print(" *C\t");
dataFile.print("Humidity: ");
dataFile.print(humidity);
dataFile.print(" %\t");
dataFile.print("CO: ");
dataFile.print(_co);
dataFile.print(" ppm\t");
dataFile.print("NO2: ");
dataFile.print(_no2);
dataFile.print(" ppm\t");
dataFile.print("NH3: ");
dataFile.print(_nh3);
dataFile.print(" ppm\t");
dataFile.print("MQ135: ");
dataFile.print(mq135_value);
dataFile.print(" ppm\t");
dataFile.print("Dust: ");
dataFile.print(dustDensity);
dataFile.println(" ppm");
dataFile.close();
} else {
Serial.println("error opening data file");
}
}
}
void setup_gp2y1010au0f() {
// sensorGP2Y1010AU0F.begin();
pinMode(GP2Y1010AU0F_LED_PIN, OUTPUT);
}
void read_gp2y1010au0f() {
// dustDensity = sensorGP2Y1010AU0F.read();
digitalWrite(GP2Y1010AU0F_LED_PIN, LOW);
delayMicroseconds(samplingTime);
voMeasured = analogRead(GP2Y1010AU0F_PIN);
delayMicroseconds(deltaTime);
digitalWrite(GP2Y1010AU0F_LED_PIN, HIGH);
delayMicroseconds(sleepTime);
calcVoltage = voMeasured * (5.0 / 1024);
dustDensity = 0.17 * calcVoltage - 0.1;
}
void setup_mics6814() {}
void read_MiCS6814() {
_co = analogRead(CO_PIN);
_no2 = analogRead(NO2_PIN);
_nh3 = analogRead(NH3_PIN);
}
void setup_dht() { dht.begin(); }
void read_dht() {
humidity = dht.readHumidity();
temperature = dht.readTemperature();
if (isnan(temperature) || isnan(humidity)) {
Serial.println("Failed to read from DHT sensor!");
humidity = last_humidity;
temperature = last_temperature;
} else {
last_humidity = humidity;
last_temperature = temperature;
}
Serial.print("Humidity: ");
Serial.print(humidity);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(temperature);
Serial.println(" *C");
}
void setup_rtc() {
if (!rtc.begin()) {
Serial.println("Couldn't find RTC");
Serial.flush();
while (1)
delay(10);
}
if (!rtc.isrunning()) {
Serial.println("RTC is NOT running, let's set the time!");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
}
void get_time_rtc() {
DateTime now = rtc.now();
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(" (");
Serial.print(daysOfTheWeek[now.dayOfTheWeek()]);
Serial.print(") ");
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
_hour = now.hour();
_minute = now.minute();
_second = now.second();
_day = now.day();
_month = now.month();
_year = now.year();
}