#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>
int subValuelist[]={55, 25, 0};
int valueMax[]={65, 30, 0};
int valueMin[]={40, 15, 0};
String menuNamelist[]={"DO AM: ", "NHIET DO: ", "-- Luu va thoat --"};
volatile int menucount;
volatile int contro;
volatile int menu;
volatile int clkValue;
volatile int dtValue;
volatile int counter;
volatile int dir;
volatile int MIN;
volatile int MAX;
volatile int menuflag;
LiquidCrystal_I2C mylcd(0x27,20,4);
DHT dht13(13, 22);
void attachInterrupt_fun_FALLING_2() {
checkEncoder();
updateValue();
}
void updateValue() {
noInterrupts();
if (menuflag == 1) {
if (menu == -1 && dir != 0) {
contro = constrain(contro + dir, 0, menucount-1);
}
if (menu == 0 && dir != 0) {
subValuelist[contro] = constrain(subValuelist[contro] + dir, valueMin[contro], valueMax[contro]);
}
}
dir = 0;
interrupts();
}
void checkEncoder() {
clkValue = digitalRead(2);
delayMicroseconds(1000);
dtValue = digitalRead(4);
if (clkValue != dtValue) {
dir = 1;
} else {
dir = -1;
}
}
void mainDisplay() {
mylcd.setCursor(1-1, 1-1);
mylcd.print(String(" ") + String("VIEN KTCGQS") + String(" "));
mylcd.setCursor(1-1, 2-1);
mylcd.print(String("NHIET DO: ") + String(dht13.readTemperature()) + String(" C "));
mylcd.setCursor(1-1, 3-1);
mylcd.print(String("DO AM: ") + String(dht13.readHumidity()) + String(" % "));
mylcd.setCursor(1-1, 4-1);
mylcd.print(String(" "));
}
void lcdDisplay() {
if (menu == -1) {
mylcd.setCursor(1-1, 1-1);
mylcd.print(" Cai thong so: ");
mylcd.setCursor(2-1, 2-1);
mylcd.print(String(menuNamelist[0]) + String(subValuelist[0]) + String(" "));
mylcd.setCursor(2-1, 3-1);
mylcd.print(String(menuNamelist[1]) + String(subValuelist[1]) + String(" "));
mylcd.setCursor(2-1, 4-1);
mylcd.print(String(menuNamelist[2]) );
for (int i = (0); i <= (menucount-1); i = i + (1)) {
if (contro == i) {
mylcd.setCursor(1-1, contro+2-1);
mylcd.print(">");
} else {
mylcd.setCursor(1-1, i+2-1);
mylcd.print(" ");
}
}
}
if (menu == 0 && contro < 2) {
mylcd.setCursor(1-1, 1-1);
mylcd.print(String(" ") + String(menuNamelist[contro]) + String(subValuelist[contro]) + String(" "));
mylcd.setCursor(1-1, 2-1);
mylcd.print(String(" "));
mylcd.setCursor(1-1, 3-1);
mylcd.print(String(" "));
mylcd.setCursor(1-1, 4-1);
mylcd.print(String(" "));
}
}
void attachInterrupt_fun_FALLING_3() {
delayMicroseconds(2000);
if (digitalRead(4) == HIGH) {
if (menuflag == 0) {
menuflag = 1;
menu = -1;
} else {
if (menu == -1) {
menu = 0;
} else {
menu = -1;
}
if (menu == 0 && contro == 2) {
menuflag = 0;
menu = -1;
}
}
}
}
void setup(){
menucount = 3;
contro = 0;
menu = -1;
clkValue = 0;
dtValue = 0;
counter = 0;
dir = 0;
MIN = 0;
MAX = 100;
menuflag = 0;
mylcd.init();
mylcd.backlight();
pinMode(2, INPUT);
attachInterrupt(digitalPinToInterrupt(2),attachInterrupt_fun_FALLING_2,FALLING);
pinMode(4, INPUT);
dht13.begin();
pinMode(3, INPUT_PULLUP);
}
void loop(){
attachInterrupt(digitalPinToInterrupt(3),attachInterrupt_fun_FALLING_3,FALLING);
if (menuflag == 0) {
mainDisplay();
contro = 0;
}
if (menuflag == 1) {
lcdDisplay();
}
}