/* Smart e-Minner ATmega328P */
//---LCD I2C
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---RTC Module
#include "RTClib.h"
RTC_DS1307 rtc;
char Day[7][12] = {"Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"};
String hari;
int tanggal, bulan, tahun, jam, menit, detik;
//---Button Menu
#define BUP 25
#define BOK 27
#define BDN 29
#define PUSH LOW //Ditekan
#define BOUN 10 //Bouncing
//---Sensor DHT
#include "DHT.h"
#define DHTPIN 23
#define DHTTYPE DHT21
DHT dht(DHTPIN, DHTTYPE);
float Temp, Hum;
//---Switch (Digital Input)
#define switch1 2 //Netral / WO Netral
#define switch2 3 //Power / Eco
#define switch3 4 //Brake
#define switch4 5 //Loading
#define switch5 6 //Loaded
#define switch6 7 //Dumping
#define switch7 8 //Empty
//---Sensor (Analog Input)
#define analog1 A0 //Sensor1
#define analog2 A1 //Sensor2
#define analog3 A2 //Sensor3
#define analog4 A3 //Sensor4
#define analog5 A4 //Sensor5
#define analog6 A5 //Sensor6
int an1, an2, an3, an4, an5;
//---Millis1 (Delay in Millisecond)
unsigned long previousMillis1 = 0;
const long Delay = 500;
//Kondisi
#define ON LOW //KOndisi ON
void setup() {
lcd.init();
lcd.backlight();
dht.begin();
rtc.begin();
pinMode(BUP, INPUT_PULLUP);
pinMode(BOK, INPUT_PULLUP);
pinMode(BDN, INPUT_PULLUP);
lcd.setCursor(0, 0); lcd.print(" SMART e-MINNING");
lcd.setCursor(0, 2); lcd.print(" PT. KARYA MULTI");
lcd.setCursor(0, 3); lcd.print(" SOLUTION INDONESIA");
delay(1000);
lcd.clear();
RealTime();
delay(2000);
lcd.clear();
}
void loop() {
logic();
unsigned long currentMillis = millis();
if(currentMillis - previousMillis1 >= Delay){
previousMillis1 = currentMillis;
Analog_Input();
Digital_Input();
lcd.setCursor(0,0); lcd.print("Status:");
lcd.setCursor(0,1); lcd.print("Spd:"); lcd.print(an1); lcd.print("km "); //Machine Speed
lcd.setCursor(11,1); lcd.print("Load: "); lcd.print(an2,1); lcd.print("t "); //Live Weight
lcd.setCursor(0,2); lcd.print("Sus:"); lcd.print(an3); lcd.print(" "); //Suspension Front
lcd.setCursor(7,2); lcd.print("/"); lcd.print(an4); lcd.print(" "); //Suspension Rear
lcd.setCursor(12,2); lcd.print("Inc:"); lcd.print(an5); lcd.print("% "); //Inclination
lcd.setCursor(0,3); lcd.print("Shift(Ntr/WO) : ");
}
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
setMenu();
}
}
void RealTime(){
DateTime now = rtc.now();
hari = Day[now.dayOfTheWeek()];
tanggal = now.day(), DEC;
bulan = now.month(), DEC;
tahun = now.year(), DEC;
jam = now.hour(), DEC;
menit = now.minute(),DEC;
detik = now.second(),DEC;
lcd.setCursor(2,0);
lcd.print(String() +hari+ ", " +tanggal+ "-" +bulan+ "-" +tahun);
lcd.setCursor(6,1);
lcd.print(String() +jam+ ":" +menit+ ":" +detik);
lcd.setCursor(0,2);
lcd.print("--------------------");
lcd.setCursor(0,3);
lcd.print(" SEMANGAT PAGI !!!");
}
void Analog_Input(){
//---Machine Speed
int sensor1 = analogRead(analog1);
an1 = map(sensor1, 0, 1023, 0, 70);
//---Live Weight
int sensor2 = analogRead(analog2);
an2 = map(sensor2, 0, 1023, 0, 90);
//---Suspension Front
int sensor3 = analogRead(analog3);
an3 = map(sensor3, 0, 1023, 0, 300);
//---Suspension Rear
int sensor4 = analogRead(analog4);
an4 = map(sensor4, 0, 1023, 0, 300);
//---Inclination
int sensor5 = analogRead(analog5);
an5 = map(sensor5, 0, 1023, -10, 10);
}
void Digital_Input(){
//---Switch Netral / WO
if(digitalRead(switch1) == ON){
lcd.setCursor(17,3); lcd.print("NTR");
} else {
lcd.setCursor(17,3); lcd.print("WO ");
}
//---Power / Eco
if(digitalRead(switch2) == ON){
//lcd.clear();
//lcd.setCursor(17,3); lcd.print("Power Mode");
} else {
//lcd.clear();
//lcd.setCursor(17,3); lcd.print("Eco Mode ");
}
//---Brake
if(digitalRead(switch3) == ON){
lcd.clear();
lcd.setCursor(0,2); lcd.print("Brake Activated !!");
delay(2000);
lcd.clear();
}
//---Loading Mode Selector
if(digitalRead(switch4) == ON){
lcd.setCursor(8,0); lcd.print("LOADING ");
}
//---Loaded Mode Selector
if(digitalRead(switch5) == ON){
lcd.setCursor(8,0); lcd.print("LOADED ");
}
//---Dumping Mode Selector
if(digitalRead(switch6) == ON){
lcd.setCursor(8,0); lcd.print("DUMPING ");
}
//---Empty Mode Selector
if(digitalRead(switch7) == ON){
lcd.setCursor(8,0); lcd.print("EMPTY ");
}
}
void Temperature(){
unsigned long currentMillis = millis();
if(currentMillis - previousMillis1 >= Delay){
previousMillis1 = currentMillis;
Temp = random(0,50);//dht.readTemperature();
Hum = random(60,90);//dht.readHumidity();
lcd.setCursor(0, 0); lcd.print("Temperature Cabin :");
lcd.setCursor(0, 2); lcd.print("Temperature : "); lcd.print(Temp,1); lcd.print((char)223);lcd.print("C ");
lcd.setCursor(0, 3); lcd.print("Humidity : "); lcd.print(Hum,1); lcd.print("% ");
}
}
void setMenu(){
//---Set Menu 1
setMenu1:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setSUBMENU1;
}
else if(digitalRead(BUP) == PUSH){
delay(BOUN);
while(digitalRead(BUP) == PUSH){}
lcd.clear();
goto setExit;
}
else if(digitalRead(BDN) == PUSH){
delay(BOUN);
while(digitalRead(BDN) == PUSH){}
lcd.clear();
goto setMenu2;
}
logic();
lcd.setCursor(0, 0); lcd.print("01. Date/Time <-");
lcd.setCursor(0, 1); lcd.print("02. Cabin Temp. ");
lcd.setCursor(0, 2); lcd.print("03. Monitor 2 ");
lcd.setCursor(0, 3); lcd.print("04. Monitor 3 ");
goto setMenu1;
//---Set Menu 2
setMenu2:
if(digitalRead(BOK) == LOW){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setSUBMENU2;
}
else if(digitalRead(BUP) == PUSH){
delay(BOUN);
while(digitalRead(BUP) == PUSH){}
lcd.clear();
goto setMenu1;
}
else if(digitalRead(BDN) == PUSH){
delay(BOUN);
while(digitalRead(BDN) == PUSH){}
lcd.clear();
goto setMenu3;
}
logic();
lcd.setCursor(0, 0); lcd.print("01. Date/Time ");
lcd.setCursor(0, 1); lcd.print("02. Cabin Temp. <-");
lcd.setCursor(0, 2); lcd.print("03. Monitor 2 ");
lcd.setCursor(0, 3); lcd.print("04. Monitor 3 ");
goto setMenu2;
//---Set Menu 3
setMenu3:
if(digitalRead(BOK) == LOW){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setSUBMENU3;
}
else if(digitalRead(BUP) == PUSH){
delay(BOUN);
while(digitalRead(BUP) == PUSH){}
lcd.clear();
goto setMenu2;
}
else if(digitalRead(BDN) == PUSH){
delay(BOUN);
while(digitalRead(BDN) == PUSH){}
lcd.clear();
goto setMenu4;
}
logic();
lcd.setCursor(0, 0); lcd.print("01. Date/Time ");
lcd.setCursor(0, 1); lcd.print("02. Cabin Temp. ");
lcd.setCursor(0, 2); lcd.print("03. Monitor 2 <-");
lcd.setCursor(0, 3); lcd.print("04. Monitor 3 ");
goto setMenu3;
//---Set Menu 4
setMenu4:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setSUBMENU4;
}
else if(digitalRead(BUP) == PUSH){
delay(BOUN);
while(digitalRead(BUP) == PUSH){}
lcd.clear();
goto setMenu3;
}
else if(digitalRead(BDN) == PUSH){
delay(BOUN);
while(digitalRead(BDN) == PUSH){}
lcd.clear();
goto setMenu5;
}
logic();
lcd.setCursor(0, 0); lcd.print("01. Date/Time ");
lcd.setCursor(0, 1); lcd.print("02. Cabin Temp. ");
lcd.setCursor(0, 2); lcd.print("03. Monitor 2 ");
lcd.setCursor(0, 3); lcd.print("04. Monitor 3 <-");
goto setMenu4;
//---Set Menu 5
setMenu5:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setSUBMENU5;
}
else if(digitalRead(BUP) == PUSH){
delay(BOUN);
while(digitalRead(BUP) == PUSH){}
lcd.clear();
goto setMenu4;
}
else if(digitalRead(BDN) == PUSH){
delay(BOUN);
while(digitalRead(BDN) == PUSH){}
lcd.clear();
goto setMenu6;
}
logic();
lcd.setCursor(0, 0); lcd.print("05. Monitor 4 <-");
lcd.setCursor(0, 1); lcd.print("06. About ");
lcd.setCursor(0, 2); lcd.print("07. Exit ");
goto setMenu5;
//---Set Menu 6
setMenu6:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setSUBMENU6;
}
else if(digitalRead(BUP) == PUSH){
delay(BOUN);
while(digitalRead(BUP) == PUSH){}
lcd.clear();
goto setMenu5;
}
else if(digitalRead(BDN) == PUSH){
delay(BOUN);
while(digitalRead(BDN) == PUSH){}
lcd.clear();
goto setExit;
}
logic();
lcd.setCursor(0, 0); lcd.print("05. Monitor 4 ");
lcd.setCursor(0, 1); lcd.print("06. About <-");
lcd.setCursor(0, 2); lcd.print("07. Exit ");
goto setMenu6;
//---Exit Menu
setExit:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto endSET;
}
else if(digitalRead(BUP) == PUSH){
delay(BOUN);
while(digitalRead(BUP) == PUSH){}
lcd.clear();
goto setMenu6;
}
else if(digitalRead(BDN) == PUSH){
delay(BOUN);
while(digitalRead(BDN) == PUSH){}
lcd.clear();
goto setMenu1;
}
logic();
lcd.setCursor(0, 0); lcd.print("05. Monitor 4 ");
lcd.setCursor(0, 1); lcd.print("06. About ");
lcd.setCursor(0, 2); lcd.print("07. Exit <-");
goto setExit;
//------------------SET SUBMENU--------------------
//---Sub Menu 1
setSUBMENU1:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setMenu1;
}
logic();
RealTime();
goto setSUBMENU1;
//---Sub Menu 2
setSUBMENU2:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setMenu2;
}
logic();
Temperature();
goto setSUBMENU2;
//---Sub Menu 3
setSUBMENU3:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setMenu3;
}
logic();
lcd.setCursor(0, 1); lcd.print("-> Sub3");
goto setSUBMENU3;
//---Sub Menu 4
setSUBMENU4:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setMenu4;
}
logic();
lcd.setCursor(0, 1); lcd.print("-> Sub4");
goto setSUBMENU4;
//---Sub Menu 5
setSUBMENU5:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setMenu5;
}
logic();
lcd.setCursor(0, 1); lcd.print("-> Sub5");
goto setSUBMENU5;
//---Sub Menu 6
setSUBMENU6:
if(digitalRead(BOK) == PUSH){
delay(BOUN);
while(digitalRead(BOK) == PUSH){}
lcd.clear();
goto setMenu6;
}
logic();
lcd.setCursor(0,0); lcd.print("Model : "); lcd.print("Trucker.ID");
lcd.setCursor(0,1); lcd.print("Version : "); lcd.print("v0.0.1");
lcd.setCursor(1,3); lcd.print("Made in Indonesia");
goto setSUBMENU6;
//---Back To Dashboard
endSET:
lcd.clear();
delay(100);
}
void logic(){
//---Max Speed
if(an1 >= 65){
lcd.clear();
lcd.setCursor(5,1); lcd.print("OVER SPEED");
lcd.setCursor(2,2); lcd.print("KURANGI KECEPATAN");
delay(1000);
lcd.clear();
}
//---Max Weight
if(an2 >= 90){
lcd.clear();
lcd.setCursor(3,1); lcd.print("MUATAN OVERLOAD");
lcd.setCursor(3,2); lcd.print("KURANGI MUATAN");
delay(1000);
lcd.clear();
}
//---Power
//---Eco
//---Brake
//---Gyro
//---Temperature
if(Temp >= 50){
lcd.clear();
lcd.setCursor(3,0); lcd.print("WARNING !!!");
lcd.setCursor(3,1); lcd.print("OVERHEAT");
lcd.setCursor(0,2); lcd.print("-------------------");
lcd.setCursor(0,3); lcd.print("CABIN TERLALU PANAS");
delay(1000);
lcd.clear();
}
Analog_Input();
}Power/Eco
Netral/WO
Brake