#include <UUID.h>
#include <EEPROM.h>
#include <ArduinoJson.h>
#include <Keypad.h>
#include <LiquidCrystal_I2C.h>
//library sensor
const uint8_t ROWS = 4;
const uint8_t COLS = 4;
char keys[ROWS][COLS] = {
{ '1', '2', '3', 'A' },
{ '4', '5', '6', 'B' },
{ '7', '8', '9', 'C' },
{ '*', '0', '#', 'D' }
};
uint8_t colPins[COLS] = { 8, 7, 6, 5 };
uint8_t rowPins[ROWS] = { 12, 11, 10, 9 };
LiquidCrystal_I2C lcd (0x27,20,4);
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char MenuUtama[][20] = {
"KTN-IoT-0.1.1 ",
"1 Status ",
"2 Setting ",
"3 Sensor Data ",
};
char MenuStatus[][20] = {
"Status IOT (DID) ",
"Wifi:OK|SVR:OK",
"SendData:OK",
"Tekan C utk kembali",
};
char MenuSetting[][20] = {
"Setting ",
"1 Mode Sensor ",
"2 Kode Proyek ",
"Tekan C utk kembali",
};
char MenuDataSensor[][20] = {
"Data Sensor ",
"Tekan C utk kembali",
};
char ModeSensor[][20] = {
"Mode Sensor: ",
"1 Isi Mode Sensor ",
"2 Cek Mode Sensor ",
"Tekan C utk kembali",
};
char KodeProyek[][20] = {
"Kode Proyek:",
"1 Isi Kode Proyek ",
"2 Cek Kode Proyek ",
"Tekan C utk kembali",
};
char EntryModeSensor[][20] = {
"Isi Mode Sensor: ",
" ",
"Tekan # utk selesai",
"Tekan C utk kembali",
};
char CheckModeSensor[][20] = {
"Mode Sensor: ",
" ",
" ",
"Tekan C utk kembali",
};
char EntryKodeProyek[][20] = {
"Isi Kode Proyek: ",
" ",
"Tekan # utk selesai",
"Tekan C utk kembali",
};
char CheckKodeProyek[][20] = {
"Kode Proyek:",
" ",
" ",
"Tekan C utk kembali",
};
int8_t indexMenu = -1;
byte menuLevel = -1;
byte menuLevelSebelumnya = -1;
byte indexHalaman = 0;
byte indexHalamanSebelumnya = -1;
byte lcdEntriPos;
bool entriNilai;
enum ModeMenu {
modeMenuStatus,
modeMenuSetting,
modeMenuDataSensor,
modeMenuModeSensor,
modeMenuKodeProyek,
modeMenuEntryModeSensor,
modeMenuEntryKodeProyek,
modeMenuCheckModeSensor,
modeMenuCheckKodeProyek,
};
ModeMenu modeMenu;
ModeMenu modeMenuSebelumnya;
#define standarWaktuTampil 1000L
#define LihatWaktuTampil 5000L
uint16_t waktuTampil;
unsigned long millisMulai;
String menuEntriNilai;
char kpd;
uint16_t sensor_mode;
String kode_proyek;
//variabel sensor
//EEPROM
String str_uuid_r = "";
String str_did_w="00000";
String str_did_r ="";
static int8_t
highlight = 0;
void setup()
{
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(0x3F);
if (Wire.endTransmission())
{
lcd = LiquidCrystal_I2C(0x27, 20, 4);
}
lcd.begin(20,4);
lcd.backlight();
delay(2000);
// tampilanDepan();
millisMulai = millis();
menuIdle();
}
void menuIdle()
{
lcd.clear();
lcd.setCursor(3, 1);
lcd.print("Tekan * untuk");
lcd.setCursor(3, 2);
lcd.print("Masuk ke menu");
Serial.println("{ \"uuid\" : \"9b469727-f49d-4a3e-8c3d-5028e25e1afc\", \"did\" : \"00001\" }");
}
void loop()
{
char key = keypad.getKey();
if (key) {
//Serial.println(key);
if(entriNilai)
{
if((key >= '0') && (key <= '9') ){
if (menuLevel == 3 && indexHalaman == 1){
menuEntriNilai = key;
kpd = key;
lcdEntriPos=0;
lcd.setCursor(lcdEntriPos++, 1);
lcd.print(kpd);
}
if (menuLevel == 3 && indexHalaman == 2){
menuEntriNilai += key;
kpd = key;
lcd.setCursor(lcdEntriPos++, 1);
lcd.print(kpd);
}
}
}
switch (key)
{
//Atas
case 'A':
if (menuLevel == 0){
lcd.setCursor( 0, highlight + 1);
lcd.print( F(" ") );
highlight--;
if( highlight < 0 )
highlight = 2;
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
else if (menuLevel >= 1){
lcd.setCursor( 0, highlight + 1);
lcd.print( F(" ") );
highlight--;
if( highlight < 0 )
highlight = 1;
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
break;
//bawah
case 'B':
if (menuLevel == 0){
lcd.setCursor( 0, highlight + 1);
lcd.print( F(" ") );
highlight++;
if( highlight == 3 )
highlight = 0;
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
else if (menuLevel >= 1){
lcd.setCursor( 0, highlight + 1);
lcd.print( F(" ") );
highlight++;
if( highlight == 2 )
highlight = 0;
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
break;
//back
case 'C':
resetPilihan();
lcd.clear();
entriNilai = false;
if (menuLevel == 3){
if (indexHalaman == 1){
menuLevel = 2;
indexMenu = 1;
indexHalaman = 1;
modeMenu = modeMenuModeSensor;
break;
}
if (indexHalaman == 2){
menuLevel = 2;
indexMenu = 2;
indexHalaman = 2;
modeMenu = modeMenuKodeProyek;
break;
}
}
else if(menuLevel == 2){
menuLevel = 1;
indexMenu = -1;
indexHalaman = 0;
modeMenu = modeMenuSetting;
break;
}
else if(menuLevel == 1){
menuLevel = 0;
indexMenu = -1;
indexHalaman = 0;
modeMenu = modeMenuSetting;
break;
}
updateMenu();
break;
//Delete
case 'D':
if (entriNilai){
lcdEntriPos--;
if (lcdEntriPos > 0){
kpd = NULL;
lcd.setCursor(lcdEntriPos, 1);
lcd.print(kpd);
} else if (lcdEntriPos == 0){
kpd = NULL;
lcd.setCursor(lcdEntriPos, 1);
lcd.print(kpd);
}
menuEntriNilai.remove(menuEntriNilai.length() - 1);
}
break;
//home screen
case '*':
resetPilihan();
entriNilai = false;
menuLevel = 0;
indexMenu = -1;
updateMenu();
break;
//enter
case '#':
lcd.clear();
if (entriNilai)
{
if (menuLevel == 3 && indexHalaman == 1){
sensor_mode = menuEntriNilai.toInt();
lcd.print("Sensor Mode");
lcd.setCursor(0,1);
lcd.print("Berhasil Di Simpan");
delay(2000);
menuLevel = 2;
indexMenu = 1;
indexHalaman = 1;
modeMenu = modeMenuModeSensor;
} else if (menuLevel == 3 && indexHalaman == 2){
kode_proyek = menuEntriNilai;
lcd.print("Kode Proyek");
lcd.setCursor(0,1);
lcd.print("Berhasil Di Simpan");
delay(2000);
menuLevel = 2;
indexMenu = 2;
indexHalaman = 2;
modeMenu = modeMenuKodeProyek;
}
lcd.clear();
entriNilai = false;
menuEntriNilai = "";
lcdEntriPos = 0;
updateMenu();
break;
}
//Status
else if (menuLevel == 0){
if (highlight == 0){
menuLevel = 1;
indexMenu = -1;
indexHalaman = 0;
modeMenu = modeMenuStatus;
break;
}
//Setting
else if (highlight == 1){
menuLevel = 1;
indexMenu = -1;
indexHalaman = 0;
modeMenu = modeMenuSetting;
break;
}
//Sensor
else if (highlight == 2){
menuLevel = 1;
indexMenu = -1;
indexHalaman = 0;
modeMenu = modeMenuDataSensor;
break;
}
}
if (menuLevel == 1){
//mode sensor
if (highlight == 0){
menuLevel = 2;
indexHalaman = 1;
indexMenu = -1;
modeMenu = modeMenuModeSensor;
break;
}
//Kode Proyek
else if (highlight == 1){
menuLevel = 2;
indexMenu = -1;
indexHalaman = 2;
modeMenu = modeMenuKodeProyek;
break;
}
}
//mode sensor
if (menuLevel == 2 && indexHalaman == 1){
//Entry
if (highlight == 0){
lcd.clear();
menuLevel = 3;
indexMenu = -1;
indexHalaman = 1;
modeMenu = modeMenuEntryModeSensor;
entriNilai = true;
break;
}
//Check
else if (highlight == 1){
menuLevel = 3;
indexMenu = -1;
modeMenu = modeMenuCheckModeSensor;
break;
}
}
//Project Code
if (menuLevel == 2 && indexHalaman == 2){
//Entry
if (highlight == 0){
lcd.clear();
menuLevel = 3;
indexMenu = -1;
indexHalaman == 2;
modeMenu = modeMenuEntryKodeProyek;
entriNilai = true;
break;
}
//Check
else if (highlight == 1){
menuLevel = 3;
indexMenu = -1;
modeMenu = modeMenuCheckKodeProyek;
break;
}
}
}
}
if (millis() - millisMulai > waktuTampil)
{
millisMulai = millis();
waktuTampil = standarWaktuTampil;
indexMenu++;
updateMenu();
menuLevelSebelumnya = menuLevel;
}
}
void updateMenu()
{
if (menuLevel <= 0)
{
if (indexMenu == sizeof(MenuUtama) / sizeof(MenuUtama[0]))
{
indexMenu = 0;
}
if (menuLevelSebelumnya != menuLevel)
{
lcd.clear();
//lcd.print("KTN-IoT-0.1.1");
}
tampilMenuUtama(indexMenu);
}
else if(menuLevel == 1){
if (modeMenu == modeMenuStatus)
{
tampilMenuStatus(indexMenu);
}
else if (modeMenu == modeMenuSetting)
{
tampilMenuSetting(indexMenu);
}
else if (modeMenu == modeMenuDataSensor)
{
tampilMenuDataSensor(indexMenu);
}
}
else if(menuLevel == 2){
if (modeMenu == modeMenuModeSensor)
{
tampilMenuModeSensor(indexMenu);
}
else if (modeMenu == modeMenuKodeProyek)
{
tampilMenuKodeProyek(indexMenu);
}
}
else if(menuLevel == 3){
if (modeMenu == modeMenuModeSensor)
{
tampilMenuModeSensor(indexMenu);
}
else if (modeMenu == modeMenuKodeProyek)
{
tampilMenuKodeProyek(indexMenu);
}
else if (modeMenu == modeMenuEntryModeSensor)
{
tampilMenuEntryModeSensor(indexMenu);
}
else if (modeMenu == modeMenuEntryKodeProyek)
{
tampilMenuEntryKodeProyek(indexMenu);
}
else if (modeMenu == modeMenuCheckModeSensor)
{
tampilMenuCheckModeSensor(indexMenu);
}
else if (modeMenu == modeMenuCheckKodeProyek)
{
tampilMenuCheckKodeProyek(indexMenu);
}
}
}
void resetPilihan()
{
}
//menampikan menu
void tampilMenuUtama(byte index)
{
lcd.setCursor(0, 0);
lcd.print(MenuUtama[0]);
lcd.setCursor(1, 1);
lcd.print(MenuUtama[1]);
lcd.setCursor(1, 2);
lcd.print(MenuUtama[2]);
lcd.setCursor(1, 3);
lcd.print(MenuUtama[3]);
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
void tampilMenuStatus(byte index)
{
lcd.setCursor(0, 0);
lcd.print(MenuStatus[0]);
lcd.setCursor(0, 1);
lcd.print(MenuStatus[1]);
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(MenuStatus[3]);
}
void tampilMenuSetting(byte index)
{
lcd.setCursor(0, 0);
lcd.print(MenuSetting[0]);
lcd.setCursor(1, 1);
lcd.print(MenuSetting[1]);
lcd.setCursor(1, 2);
lcd.print(MenuSetting[2]);
lcd.setCursor(0, 3);
lcd.print(MenuSetting[3]);
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
void tampilMenuDataSensor(byte index){
if (sensor_mode == 0 && kode_proyek == ""){
lcd.setCursor(0, 0);
lcd.print(" Mode Sensor dan");
lcd.setCursor(0, 1);
lcd.print("Kode Proyek Belum");
lcd.setCursor(0, 2);
lcd.print(" Ditambahkan");
lcd.setCursor(0, 3);
lcd.print(CheckKodeProyek[3]);
}
else if (sensor_mode == 0){
lcd.setCursor(0, 0);
lcd.print(" Mode Sensor");
lcd.setCursor(0, 1);
lcd.print(" Belum Ditambahkan");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(CheckKodeProyek[3]);
}
else if (kode_proyek == ""){
lcd.setCursor(0, 0);
lcd.print(" Kode Proyek");
lcd.setCursor(1, 1);
lcd.print("Belum Ditambahkan");
lcd.setCursor(0, 2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(CheckKodeProyek[3]);
}
else if (sensor_mode != 0 && kode_proyek != ""){
if (sensor_mode == 1){
//Air temp and Air Hum
float a_temp = readDHT22(1);
float a_hum = readDHT22(2);
lcd.setCursor(0, 0);
lcd.print(MenuDataSensor[0]);
lcd.print(sensor_mode);
//baris 1
lcd.setCursor(0,1);
lcd.print("Air Temp: ");
lcd.print(a_temp);
lcd.print("*C");
//baris 2
lcd.setCursor(0,2);
lcd.print("Air Hum: ");
lcd.print(a_hum);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print(MenuDataSensor[1]);
} else if (sensor_mode == 2){
//soil temp and soil hum
float s_temp = readDS18B20();
float s_hum = readSoilHum();
lcd.setCursor(0, 0);
lcd.print(MenuDataSensor[0]);
lcd.print(sensor_mode);
//baris 1
lcd.setCursor(0,1);
lcd.print("Soil Temp: ");
lcd.print(s_temp);
lcd.print("*C");
//baris 2
lcd.setCursor(0,2);
lcd.print("Soil Hum: ");
lcd.print(s_hum);
lcd.print("%");
lcd.setCursor(0, 3);
lcd.print(MenuDataSensor[1]);
} else if (sensor_mode == 3){
//soil hum
float s_hum = readSoilHum();
lcd.setCursor(0, 0);
lcd.print(MenuDataSensor[0]);
lcd.print(sensor_mode);
//baris 1
lcd.setCursor(0,1);
lcd.print("Soil Hum: ");
lcd.print(s_hum);
lcd.print("%");
//baris 2
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(MenuDataSensor[1]);
} else if (sensor_mode == 4){
//soil ph
float PHSens = readPHSens();
lcd.setCursor(0, 0);
lcd.print(MenuDataSensor[0]);
lcd.print(sensor_mode);
//baris 1
lcd.setCursor(0,1);
lcd.print("PH: ");
lcd.print(PHSens);
lcd.print("");
//baris 2
lcd.setCursor(0,2);
lcd.print(" ");
lcd.setCursor(0, 3);
lcd.print(MenuDataSensor[1]);
} else if (sensor_mode == 5){
//soil NPK
float soil_nitro = readNPKSens(1);
float soil_phos = readNPKSens(2);
float soil_pota = readNPKSens(3);
lcd.setCursor(0, 0);
lcd.print(MenuDataSensor[0]);
lcd.print(sensor_mode);
//baris 1
lcd.setCursor(0,1);
lcd.print("nitro");
lcd.print(soil_nitro);
lcd.print("mg/kg");
//baris 2
lcd.setCursor(0,2);
lcd.print("phos: ");
lcd.print(soil_phos);
lcd.print("mg/kg");
lcd.setCursor(0, 3);
lcd.print(MenuDataSensor[1]);
} else{
lcd.setCursor(0, 0);
lcd.print(" mode Sensor :");
lcd.setCursor(0, 1);
lcd.print(" ");
lcd.print(sensor_mode);
lcd.setCursor(0, 2);
lcd.print(" salah ");
lcd.setCursor(0, 3);
lcd.print(CheckKodeProyek[3]);
}
}
}
void tampilMenuModeSensor(byte index)
{
lcd.setCursor(0, 0);
lcd.print(ModeSensor[0]);
lcd.print(sensor_mode);
lcd.setCursor(1, 1);
lcd.print(ModeSensor[1]);
lcd.setCursor(1, 2);
lcd.print(ModeSensor[2]);
lcd.setCursor(0, 3);
lcd.print(ModeSensor[3]);
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
void tampilMenuKodeProyek(byte index)
{
lcd.setCursor(0, 0);
lcd.print(KodeProyek[0]);
lcd.print(kode_proyek);
lcd.setCursor(1, 1);
lcd.print(KodeProyek[1]);
lcd.setCursor(1, 2);
lcd.print(KodeProyek[2]);
lcd.setCursor(0, 3);
lcd.print(KodeProyek[3]);
lcd.setCursor( 0, highlight + 1 );
lcd.print( F(">") );
}
void tampilMenuEntryModeSensor(byte index)
{
lcd.setCursor(0, 0);
lcd.print(EntryModeSensor[0]);
lcd.setCursor(0, 2);
lcd.print(EntryModeSensor[2]);
lcd.setCursor(0, 3);
lcd.print(EntryModeSensor[3]);
}
void tampilMenuEntryKodeProyek(byte index)
{
lcd.setCursor(0, 0);
lcd.print(EntryKodeProyek[0]);
lcd.setCursor(1, 2);
lcd.print(EntryKodeProyek[2]);
lcd.setCursor(0, 3);
lcd.print(EntryKodeProyek[3]);
}
void tampilMenuCheckModeSensor(byte index)
{
lcd.setCursor(0, 0);
lcd.print(CheckModeSensor[0]);
lcd.setCursor(0, 1);
lcd.print(sensor_mode);
lcd.print(CheckModeSensor[1]);
lcd.setCursor(0, 2);
lcd.print(CheckModeSensor[2]);
lcd.setCursor(0, 3);
lcd.print(CheckModeSensor[3]);
}
void tampilMenuCheckKodeProyek(byte index)
{
lcd.setCursor(0, 0);
lcd.print(CheckKodeProyek[0]);
lcd.setCursor(0, 1);
lcd.print(kode_proyek);
lcd.print(CheckKodeProyek[1]);
lcd.setCursor(0, 2);
lcd.print(CheckKodeProyek[2]);
lcd.setCursor(0, 3);
lcd.print(CheckKodeProyek[3]);
}
float readNPKSens(float jns){
float nit = random(60.04, 90.22);
float pos = random(60.04, 90.22);
float pot = random(60.04, 90.22);
if (jns == 1){
return nit;
} else if (jns == 2){
return pos;
} else if (jns == 3){
return pot;
}
}
float readDHT22(float jns){
//digital
float temperature = random(28.02,37.44);
float humidity = random(60.04, 90.22);
if (jns == 1){
return temperature;
} else if (jns == 2){
return humidity;
}
}
float readPHSens(){
//Analog
float voltage = random(28.02,37.44);
float PHSens = random(0.04, 14.22);
return PHSens;
delay(1000);
}
float readDS18B20(){
//Digital
float temperature = random(28.02,37.44);
return temperature;
}
float readSoilHum(){
//Analog
float soilprcnt = random(0.02,99.44);
return soilprcnt;
}