#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "DHT.h"
#include <SD.h>
#define DHTPIN 2
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
#define LCD1_ADDR 0x27 // Alamat LCD
#define LCD1_COL 16 // LCD 16x2
#define LCD1_LIN 2
#define CS_PIN 10 // Pin CS SDCard
#define BUZPIN 6 // Pin Buzzer
LiquidCrystal_I2C lcd(LCD1_ADDR,LCD1_COL,LCD1_LIN);
DHT dht(DHTPIN, DHTTYPE);
const int buttonPin = 3;
const int panicButtonPin = 4;
const int panicLedPin = 5;
int periodeLedPanic;
int periodeDHT;
int periodeBackLightLCD;
int buttonState = 0;
int panicButtonState = 0;
unsigned long prevMilis1 = 0;
unsigned long prevMilis2 = 0;
unsigned long prevMilis3 = 0;
const String boardAddr = "";
const String devLoc1 = "";
const String devLoc2 = "";
float temp;
float humid;
struct Data {
bool panicBtn;
float dhtTemp;
float dhtHumid;
};
Data data;
File sdFiles;
void setup() {
// put your setup code here, to run once:
periodeLedPanic = 500;
periodeDHT = 2000;
periodeBackLightLCD = 50;
lcd.init();
Serial.begin(9600);
// splash screen
lcd.setCursor(0,0);
lcd.print("Airtech Devteam");
lcd.setCursor(0,1);
lcd.print("----- SOC -----");
delay(2000);
// inisialisasi
pinMode(buttonPin, INPUT);
pinMode(panicLedPin, OUTPUT);
dht.begin();
loadConfig();
}
void loop() {
// put your main code here, to run repeatedly:
// simpan timer sekarang
unsigned long currentMilis = millis();
if ((unsigned long)(currentMilis - prevMilis1) >= periodeDHT) {
readDHT();
prevMilis1 = currentMilis;
}
// baca status tombol dan nyalakan backlight lcd jika tombol ditekan
if ((unsigned long)(currentMilis - prevMilis2) >= periodeBackLightLCD) {
lcdBacklight();
prevMilis2 = currentMilis;
}
// panic button
if ((unsigned long)(currentMilis - prevMilis3) >= periodeLedPanic) {
panicButton();
prevMilis3 = currentMilis;
}
}
void loadConfig() {
if (!SD.begin(CS_PIN)) {
Serial.println("Inisialisasi SD Card Gagal");
while (true);
}
Serial.println("SD Card OK");
/**
// baca config dari SD Card
sdFiles = SD.open("configs.txt");
if (sdFiles) {
Serial.println("Config OK");
// baca baris 1
sdFiles.seek(0 * 5);
boardAddr = sdFiles.readStringUntil('\n');
sdFiles.seek(1 * 8);
devLoc1 = sdFiles.readStringUntil('\n');
sdFiles.seek(2 * 13);
devLoc2 = sdFiles.readStringUntil('\n');
sdFiles.close();
} else {
Serial.println("Pembacaan file konfigurasi gagal");
}
Serial.print("Board Address :");
Serial.print(boardAddr);
Serial.println("");
Serial.print("Board Location 1 :");
Serial.print(devLoc1);
Serial.println("");
Serial.print("Board Location 2 :");
Serial.print(devLoc2);
**/
sdFiles = SD.open("configs.txt", FILE_READ);
if (!sdFiles) {
Serial.print("Text file tidak bisa dibuka");
while(1);
}
while (sdFiles.available()) {
String str = sdFiles.readStringUntil('\n');
int str_len = str.length();
String sub_str = str.substring(0,str_len);
Serial.println(sub_str);
/**
str.trim();
int str_len = str.length() + 1;
char char_arr[str_len];
str.toCharArray(char_arr, str_len);
**/
//Serial.println(str.c_str()); //Printing for debugging purpose
//do some action here
}
sdFiles.close();
}
void readDHT() {
// baca suhu dan kelembaban
temp = dht.readTemperature();
humid = dht.readHumidity();
if (isnan(temp) || isnan(humid)) {
lcd.clear();
lcd.setCursor(0,0);
lcd.print(F("ERR: DHT"));
lcd.setCursor(0,1);
lcd.print(F("No Input"));
return;
}
// tampilkan ke LCD
lcd.setCursor(0,0);
lcd.print(F("Temp : "));
lcd.print(data.dhtTemp,1);
data.dhtTemp = temp;
//lcd.print(dht.readTemperature());
lcd.print(F(" C"));
lcd.setCursor(0,1);
lcd.print(F("RH : "));
lcd.print(data.dhtHumid,1);
data.dhtHumid = humid;
//lcd.print(dht.readHumidity());
lcd.print(F(" %"));
//delay(2000);
// detek suhu berlebih dan start buzzer
if (temp >= 60) {
buzzerStart(1000, 1000, 1000);
} else if (temp <= 10) {
buzzerStart(500, 1000, 2000);
}
}
void lcdBacklight() {
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
lcd.backlight();
} else {
lcd.noBacklight();
}
}
void panicButton() {
panicButtonState = digitalRead(panicButtonPin);
if (panicButtonState == LOW) {
digitalWrite(panicLedPin, LOW);
data.panicBtn = LOW;
} else {
data.panicBtn = HIGH;
// panic detected, led peringatan berkedip
digitalWrite(panicLedPin, HIGH);
digitalWrite(panicLedPin, LOW);
}
}
void buzzerStart(int freq, int durasi, int tunda) {
tone(BUZPIN, freq, durasi);
delay(tunda);
}