Listing Program Arduino
#include <Wire.h>// Library Wire
#include "RTClib.h" // Library RTC (Real Time Clock
#include <EEPROM.h> // library eeprom
#include <SoftwareSerial.h> // library Komunikasi Serial
// deklarasi variabel RTC
RTC_DS1307 RTC;
// Deklarasi variabel waktu
DateTime now;
// Deklarasi variabel jam dan menit dan detik
String jam,menit,detik;
// Deklarasi Komunikasi Serial - RX,TX
SoftwareSerial mySerial(11, 10);
// Deklarasi Pin TL-1
int Red1 = 5;
int Yellow1 = 6;
int Green1 = 7;
// Deklarasi Pin TL-2
int Red2 = 2;
int Yellow2 = 3;
int Green2 = 4;
// Deklarasi Pin TL-3
int Red3 = 8;
int Yellow3 = 9;
int Green3 = 12;
// Deklarasi Pin TL-4
int Red4 = A0;
int Yellow4 = A1;
int Green4 = A2;
// Deklarasi waktu jeda TL (Traffic Light)
int wait = 6000;
int waitY = 2000;
// Deklarasi timer
unsigned long timer,timerupdate;
// Deklarasi variabel temporary
int cmd = 0;
int tmp_i = 0;
// Deklarasi variabel data jadwal
byte j_jam[5],j_menit[5],t_detik[5];
// Deklarasi variabel data komunikasi
String InData = "";
// Deklarasi variabel mode sistem
bool isAuto = true;
bool thefirst = false;
void setup()
{
Serial.begin(9600); // set baudrate serial port comp
mySerial.begin(9600); // set baudrate serial bluetooth
Wire.begin(); // set begin Wire
RTC.begin(); // set begin RTC
if (!RTC.isrunning()) // cek apakah RTC ready
{
// jika tidak, set Time ke default
RTC.adjust(DateTime(__DATE__, __TIME__));
Serial.println("set time");
}
now = RTC.now();// ambil nilai waktu sekarang
// deklarasi pin Led sebagai pin Output
pinMode(Red1,OUTPUT);
pinMode(Yellow1,OUTPUT);
pinMode(Green1,OUTPUT);
pinMode(Red2,OUTPUT);
pinMode(Yellow2,OUTPUT);
pinMode(Green2,OUTPUT);
pinMode(Red3,OUTPUT);
pinMode(Yellow3,OUTPUT);
pinMode(Green3,OUTPUT);
pinMode(Red4,OUTPUT);
pinMode(Yellow4,OUTPUT);
pinMode(Green4,OUTPUT);
OffAll(); // padamkan semua led
ReadData(); // baca data eeprom
thefirst = false;
void loop() {
if (mySerial.available()>0)
{
char inChar= (char)mySerial.read();
if(inChar != '*')
{
InData += (String)inChar;
}else{
InData.trim();
// Cek Terima Data - Mode //
if(InData== "auto")
{
isAuto = true;
}else if(InData == "manual")
{
isAuto = false;
OffAll();
cmd = 0;
}else if(InData == "sync")
{
// Syncronisasi data ke smartphone //
KirimData();
}else if(InData == "save")
{
// save data ke eeprom //
WriteData();
thefirst = false;
}
// Cek Terima Data - Mode Manual //
if(isAuto == false)
{
if(InData == "1R1")
{
digitalWrite(Red1,1);
}else if(InData == "1R0")
{
digitalWrite(Red1,0);
}else if(InData == "2R1")
{
digitalWrite(Red2,1);
}else if(InData == "2R0")
{
digitalWrite(Red2,0);
}else if(InData == "3R1")
{
digitalWrite(Red3,1);
}else if(InData == "3R0")
{
digitalWrite(Red3,0);
}else if(InData == "4R1")
{
digitalWrite(Red4,1);
}else if(InData == "4R0")
{
digitalWrite(Red4,0);
}else if(InData == "1Y1")
{
digitalWrite(Yellow1,1);
}else if(InData == "1Y0")
{
digitalWrite(Yellow1,0);
}else if(InData == "2Y1")
{
digitalWrite(Yellow2,1);
}else if(InData == "2Y0")
{
digitalWrite(Yellow2,0);
}else if(InData == "3Y1")
{
digitalWrite(Yellow3,1);
}else if(InData == "3Y0")
{
digitalWrite(Yellow3,0);
}else if(InData == "4Y1")
{
digitalWrite(Yellow4,1);
}else if(InData == "4Y0")
{
digitalWrite(Yellow4,0);
}else if(InData == "1G1")
{
digitalWrite(Green1,1);
}else if(InData == "1G0")
{
digitalWrite(Green1,0);
}else if(InData == "2G1")
{
digitalWrite(Green2,1);
}else if(InData == "2G0")
{
digitalWrite(Green2,0);
}else if(InData == "3G1")
{
digitalWrite(Green3,1);
}else if(InData == "3G0")
{
digitalWrite(Green3,0);
}else if(InData == "4G1")
{
digitalWrite(Green4,1);
}else if(InData == "4G0")
{
digitalWrite(Green4,0);
}
}
// Cek Terima Data - Schedule Waktu //
//---------- Data Jam -------------- //
if(InData.substring(0,2)== "j1")
{
tmp_i = InData.substring(2).toInt();
j_jam[0] = (byte)tmp_i;
}else if(InData.substring(0,2)== "j2")
{
tmp_i = InData.substring(2).toInt();
j_jam[1] = (byte)tmp_i;
}else if(InData.substring(0,2)== "j3")
{
tmp_i = InData.substring(2).toInt();
j_jam[2] = (byte)tmp_i;
}else if(InData.substring(0,2)== "j4")
{
tmp_i = InData.substring(2).toInt();
j_jam[3] = (byte)tmp_i;
}else if(InData.substring(0,2)== "j5")
{
tmp_i = InData.substring(2).toInt();
j_jam[4] = (byte)tmp_i;
}
//---------- Data Menit -------------- //
if(InData.substring(0,2)== "m1")
{
tmp_i = InData.substring(2).toInt();
j_menit[0] = (byte)tmp_i;
}else if(InData.substring(0,2)== "m2")
{
tmp_i = InData.substring(2).toInt();
j_menit[1] = (byte)tmp_i;
}else if(InData.substring(0,2)== "m3")
{
tmp_i = InData.substring(2).toInt();
j_menit[2] = (byte)tmp_i;
}else if(InData.substring(0,2)== "m4")
{
tmp_i = InData.substring(2).toInt();
j_menit[3] = (byte)tmp_i;
}else if(InData.substring(0,2)== "m5")
{
tmp_i = InData.substring(2).toInt();
j_menit[4] = (byte)tmp_i;
}
//---------- Data Delay -------------- //
if(InData.substring(0,2)== "d1")
{
tmp_i = InData.substring(2).toInt();
t_detik[0] = (byte)tmp_i;
}else if(InData.substring(0,2)== "d2")
{
tmp_i = InData.substring(2).toInt();
t_detik[1] = (byte)tmp_i;
}else if(InData.substring(0,2)== "d3")
{
tmp_i = InData.substring(2).toInt();
t_detik[2] = (byte)tmp_i;
}else if(InData.substring(0,2)== "d4")
{
tmp_i = InData.substring(2).toInt();
t_detik[3] = (byte)tmp_i;
}else if(InData.substring(0,2)== "d5")
{
tmp_i = InData.substring(2).toInt();
t_detik[4] = (byte)tmp_i;
}
InData = "";
}
}
if(millis() >= timerupdate + 1000)
{
// ambil waktu dari RTC setiap 1 detik //
GetTime();
timerupdate = millis();
}
if(!isAuto) return;
switch(cmd)
{
case 0:
cmd = 5;
break;
case 5:
// Mode Auto - Traffic Light //
OffAll();
digitalWrite(Green1,1);
digitalWrite(Red2,1);
digitalWrite(Red3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 10;
break;
case 10:
if(millis() >= timer + wait)
{
OffAll();
digitalWrite(Yellow1,1);
digitalWrite(Red2,1);
digitalWrite(Red3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 12;
}
break;
case 12:
if(millis() >= timer + waitY)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Yellow2,1);
digitalWrite(Red3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 15;
}
break;
case 15:
if(millis() >= timer + waitY)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Green2,1);
digitalWrite(Red3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 20;
}
break;
case 20:
if(millis() >= timer + wait)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Yellow2,1);
digitalWrite(Red3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 22;
}
break;
case 22:
if(millis() >= timer + waitY)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Red2,1);
digitalWrite(Yellow3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 25;
}
break;
case 25:
if(millis() >= timer + waitY)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Red2,1);
digitalWrite(Green3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 30;
}
break;
case 30:
if(millis() >= timer + wait)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Red2,1);
digitalWrite(Yellow3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 32;
}
break;
case 32:
if(millis() >= timer + waitY)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Red2,1);
digitalWrite(Red3,1);
digitalWrite(Yellow4,1);
timer = millis();
cmd = 35;
}
break;
case 35:
if(millis() >= timer + waitY)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Red2,1);
digitalWrite(Red3,1);
digitalWrite(Green4,1);
timer = millis();
cmd = 40;
}
break;
case 40:
if(millis() >= timer + wait)
{
OffAll();
digitalWrite(Red1,1);
digitalWrite(Red2,1);
digitalWrite(Red3,1);
digitalWrite(Yellow4,1);
timer = millis();
cmd = 42;
}
break;
case 42:
if(millis() >= timer + waitY)
{
OffAll();
digitalWrite(Yellow1,1);
digitalWrite(Red2,1);
digitalWrite(Red3,1);
digitalWrite(Red4,1);
timer = millis();
cmd = 45;
}
break;
case 45:
if(millis() >= timer + waitY)
{
cmd = 5;
}
break;
}
}
//-------------- FUNCTION -------------//
// default jumlah jadwal : 5 (07:00, 12:00 , 17:00, 00:00 , 03:00 )
//
// Config Data :
// 1 - 2 : jadwal waktu (jam-menit)
// 3 : delay traffic (detik)
void ReadData()
{
byte def_jam[5],def_menit[5];
byte def_delay[5];
def_jam[0] = 7; def_menit[0] = 0; // jam 07:00
def_jam[1] = 12; def_menit[0] = 0; // jam 12:00
def_jam[2] = 17; def_menit[0] = 0; // jam 17:00
def_jam[3] = 0; def_menit[0] = 0; // jam 00:00
def_jam[4] = 3; def_menit[0] = 0; // jam 03:00
def_delay[0] = 10; // 10 detik
def_delay[1] = 10; // 10 detik
def_delay[2] = 10; // 10 detik
def_delay[3] = 10; // 10 detik
def_delay[4] = 10; // 10 detik
// baca memori eeprom //
Serial.println("========== READ MEMORY =============");
for(int i =0; i<5; i++)
{
int addr = i * 3;
j_jam[i] = EEPROM.read(addr) == 255 ? def_jam[i] : EEPROM.read(addr);
j_menit[i] = EEPROM.read(addr+1) == 255 ? def_menit[i] : EEPROM.read(addr+1);
t_detik[i]= EEPROM.read(addr+2) == 255 ? def_delay[i] : EEPROM.read(addr+2);
Serial.println("EEPROM(" + (String)(addr+1) + ") == Jam : " + (String)j_jam[i] + " menit :
" + (String)j_menit[i] + " delay : " + (String)t_detik[i] ) ;
}
void WriteData()
{
Serial.println("========== WRITE MEMORY =============");
for(int i =0; i<5; i++)
{
int addr = i * 3;
EEPROM.write(addr,j_jam[i]);
EEPROM.write(addr+1,j_menit[i]);
EEPROM.write(addr+2,t_detik[i]);
Serial.println("EEPROM(" + (String)(addr+1) + ") == Jam : " + (String)j_jam[i] + " menit : "
+ (String)j_menit[i] + " delay : " + (String)t_detik[i] ) ;
}
}
void KirimData()
{
for(int i=0; i<5; i++)
{
mySerial.println("j"+ (String)(i+1) + (String)j_jam[i]);
mySerial.println("m"+ (String)(i+1) + (String)j_menit[i]);
mySerial.println("d"+ (String)(i+1) + (String)t_detik[i]);
}
}
void ClearData()
{
for(int i=0; i<255; i++)
EEPROM.write(i,255);
}
void GetTime()
{
now = RTC.now(); // ambil nilai waktu sekarang
jam = (String)now.hour(); // ambil data jam
menit = (String)now.minute();// ambil data menit
detik = (String)now.second();// ambil data detik
//Serial.println(jam + ":" + menit + ":" + detik);
for(int i=0; i<5; i++)
{
if (thefirst == false)
{
int tnow = (now.hour() * 60) + now.minute();
int tmin = (j_jam[i] * 60) + j_menit[i];
int tmax = 0;
if(i == 4)
{
tmax = (j_jam[0] * 60) + j_menit[0];
}else{
tmax = (j_jam[i+1] * 60) + j_menit[i+1];
}
thefirst = true;
if(tnow >= tmin && tnow < tmax)
{
wait = t_detik[i]*1000;
}
Serial.println("tnow : " + (String) tnow + " tmin:" + (String) tmin + " tmax:" + (String)
tmax + "delay :" + (String) wait);
}
// =============================== Cek Time ==========================
//
if((j_jam[i] == (byte)now.hour()) && (j_menit[i] == (byte)now.minute()))
{
wait = t_detik[i]*1000;
}
}
}
void OffAll()
{
for(int i=2; i<=9; i++)
digitalWrite(i,LOW);
digitalWrite(12,LOW);
digitalWrite(Red4,LOW);
digitalWrite(Yellow4,LOW);
digitalWrite(Green4,LOW);
}