You are on page 1of 45

BAHAGIAN PENDIDIKAN DAN LATIHAN TEKNIKAL VOKASIONAL

KEMENTERIAN PENDIDIKAN MALAYSIA


ARAS 5 & 6, BLOK E14, KOMPLEKS E,
PUSAT PENTADBIRAN KERAJAAN PERSEKUTUAN
62604 PUTRAJAYA

KOLEJ VOKASIONAL MALAYSIA

NOTA KULIAH 3
SEMESTER SEMESTER 3 DVM SESI 1

JABATAN JABATAN TEKNOLOGI  ELEKTRIK & ELEKTRONIK

PROGRAM DIPLOMA TEKNOLOGI ELEKTRONIK

KOD / KURSUS DEB3013_EMBEDDED SYSTEM

KOMPETENSI 3.0 EMBEDDED SYSTEM PROJECT

Define Types of Embedded Systems Development


1
3.1.1 Identify the specific task of the embedded systems according to application.
3.1.2 Develop system’s input/output devices (switches, push buttons, sensors, LCD displays,
KOMPETENSI UNIT
relays).
3.1.3 Application software requirements and procedures used in embedded system.
3.1.4 Evaluate interfacing result according to application.
3.1.5 Presentation of project development

Upon completion of the course, students will be able to:


1. Demonstrate the concept and main features of embedded system according to basic
HASIL architecture. (C3,PLO3)
PEMBELAJARAN 2. Construct the application of embedded system using C Language. (P3,PLO2)
3. Gather appropriate and relevant information according to embedded system.
(A2,PLO10)

NAMA PELAJAR
MUKA 01 DARIPADA 47
NO KOD DEB3013/NK03/NK03-03

1
Berasaskan Sistem Arduino
Kandungan

Bahagian 3
1. Penderia (Sensor) dan Pelaksana (Actuator).
2. Robot Arm Berserta Sistem Papan Pengawal Arduino
3. Sistem Lampu Trafik Simpang Empat
4. AT+COMMAND | WiFi ESP8266

2
1. Penderia (Sensor) dan Pelaksana (Actuator).

Pengenalan

Sensor / Penderia
Terdapat beratus-ratus jenis sensor yang digunakan dalam pelbagai lapangan dan
operasi. Antara jenama-jenama sensor yang pernah saya jumpa ialah seperti
OMRON, ALLEN BRADLEY, FESTO, FAIRCHILD, SUNX,SMC,
SIEMENS,FARNEL, KEYENCE, ROCKWELL, TELEMECHANIQUE,
YAMATAKE-HONEYWELL dan banyak lagi.

Sensor adalah sejenis peranti yang bertindak-balas terhadap perubahan dan


memberikan satu keluaran yang boleh digunakan untuk mendapatkan
maklumat/bacaan tentang sesuatu perubahan itu. Selain daripada itu, keluaran
daripada sensor juga ada yang berbentuk isyarat (elektrik) yang boleh digunakan
sebagai maklumat masukan kepada pengawal/pemproses ataupun digunakan terus
untuk sesuatu tindakan oleh litar penerima.
Contoh 1 : Mendapatkan bacaan/data : Termometer Merkuri

Juga adalah sejenis sensor di mana merkuri bertindak-balas kepada perubahan


suhu. Pengembangan dan penguncupan merkuri di dalam tiub memberikan bacaan
suhu yang dapat di lihat secara visual.

Contoh 2 : Masukkan(input) kepada litar pengawal ringkas - Float Sensor

3
Satu contoh litar pengawal ringkas yang menerima maklumat daripada ‘Float
sensor’ dan terus mengeluarkan amaran tentang paras air yang terlalu tinggi. Di
dalam kes ini, float sensor diletakkan di bahagian drain out pipe sebuah mesin
yang menggunakan air sebagai penyejuk di dalam prosesnya. Untuk mengesan jika
drain out pipe tersumbat,sebuah float sensor telah diletakkan didalamnya. Apabila
drain out pipe tersumbat, air tidak dapat mengalir keluar dengan cekap dan paras
air didalamnya akan naik. Disinilah fungsi float sensor iaitu mengesan kenaikan
paras air yang tidak sepatutnya berlaku.
Gambar float sensor dua wayar di atas adalah jenis yang biasa digunakan.
Berfungsi sama seperti magnetic switch, bahagian pelampung ( berwarna putih )
akan timbul mengikut paras air. Pelampung akan mempunyai magnet kecil di mana
medan magnet itu akan menyebabkan litar tertutup apabila pelampung berada pada
kedudukan atas.

Litar pengawal ringkas di sini ialah kerana apabila float sensor mengesan paras air
melebihi tahap sepatutnya, sebuah buzzer amaran akan terus dibunyikan,tanpa
tindakan susulan yang lain oleh mesin. Lihat ladder diagram di bawah di mana
sebuah relay digunakan sebagai isolator kerana buzzer yang digunakan dikuasakan
dengan arus ulang alik.

4
Selain daripada itu, fungsi yang lebih lanjut boleh juga dilaksanakan seperti
contohnya memberhentikan operasi mesin secara automatic di mana relay boleh
digunakan untuk memutuskan bekalan atau menghidupkan fungsi brek bagi
memberhentikan bahagian mesin yang bergerak.

Contoh 3: Masukkan (input) kepada litar pengawal kompleks (PLC, micro-


controller dll) : Displacement sensor
Istilah displacement sensor sebenarnya merujuk kepada fungsi sesebuah sensor itu
dan bukan jenis sensor. Jenis sensor yang digunakan untuk fungsi ini boleh jadi
jenis seperti optical-fork sensor ( optical-through beam sensor), optical-reflective
sensor, metal detector, proximity sensor, pressure sensor dan sebagainya mengikut
kesesuaian fungsi pada sesebuah mesin. Sebelum kita pergi kepada penerangan yg
lebih lanjut untuk setiap jenis sensor yang telah disebut,kita lihat dulu bagaimana
fungsi sensor yang dinamakan displacement sensor menjadi masukkan kepada litar
pengawal untuk fungsi yang lebih kompleks.
Displacement sensor berfungsi mengesan perubahan mekanikal sesuatu bahagian
sama ada bahagian itu hadir atau tidak pada tempat yang telah ditentukan.

Contoh A : Modul Pemilih ( selector module )


Sebuah mesin menghasilkan produk sama saiz tetapi berlainan material iaitu
plastic dan logam. Produk yang dihasilkan digerakkan diatas sebuah conveyor
untuk diasingkan mengikut jenis material oleh Modul Pemilih. Di modul pemilih,
sebuah sensor jenis metal detector digunakan untuk mengenalpasti produk yang
diperbuat daripada logam. Apabila sensor mengesan produk yang diperbuat
daripada logam, serta merta produk itu akan di tolak ke dalam suatu bekas khas.
Jika sensor tidak mengesan kehadiran logam, produk tersebut terus berlalu dan
masuk ke dalam bekas lain.

5
Gambarajah di bawah menunjukkan sambungan litar untuk kawalan seperti yang
dihuraikan di atas ;

Turutan fungsinya adalah seperti berikut ;


1.Sensor mengesan produk logam dan menghantar isyarat ke litar pengawal
melalui Input Interface.
2.CPU memproses maklumat isyarat yang di terima dan membandingkan dengan
arahan software/program yang di simpan di dalam memori.
3. Tindakan seperti yang telah dprogramkan ialah untuk menolak produk logam
tersebut maka CPU pun mengeluarkan arahan untuk isyarat keluaran ( output )
dikeluarkan melalui Output Interface untuk menghidupkan solenoid valve yang
akan memandu silinder pneumatic menolak produk logam.
Contoh B : Kawalan Posisi ( Position Control )
Position Control ialah satu proses di mana sebuah mesin dapat mengetahui tentang
kedudukan bahagian-bahagian mesin itu sendiri dan membuat pergerakkan pada
6
kadar yang ditentukan oleh program.  Fungsi inilah yang membawa kepada
teknologi robotic.  Lebih dekat kepada robotic ialah suatu system yang dikenali
sebagai ‘Servo’ dimana kawalan posisi melibatkan system computer dan
pemproses maklumat, sensory feedback dan output command. Saya akan
menyentuh tentang position control jenis ini nanti.
Baiklah, menggunakan kembali fungsi modul pemilih, untuk sebuah mesin seperti
di atas bekerja dengan lebih cekap tanpa kesilapan yang boleh merosakkan mesin,
beberapa syarat perlu dipenuhi semasa proses menolak produk logam oleh silinder
pneumatic ;
Pertama : semasa silinder hendak menolak produk logam, conveyer mestilah
berhenti.
Kedua : conveyer hanya akan bergerak jika pusher silinder pneumatic berada pada
posisi backward.
Untuk kedua-dua syarat di atas sahaja, sebuah lagi sensor perlu di tambah iaitu
sensor yang boleh mengesan kedudukan pusher silinder pneumatic. Selain daripada
itu, program mestilah juga mempunyai arahan untuk menjalankan dan
memberhentikan motor conveyer.  Lihat tambahan pada litar seperti di bawah.

Setakat ini diharapkan pembaca sudah boleh memahami fungsi sensor dan litar
kawalan serta bagaimana aplikasinya yang sangat penting dan sangat meluas di
dalam bidang automasi. Boleh dikatakan yang sensor adalah peranti utama yang 
mesti ada pada sesuatu mesin selepas ‘suis’.

7
Lanjutan daripada topic ini di post yang lain, saya akan menerangkan jenis-jenis
sensor yang kerap kali digunakan pada mesin-mesin automasi , fungsinya dan
aplikasinya satu persatu mengikut senarai di bawah ;
1.       Roller microswitch
2.       Optical reflective sensor
3.       Optical fork sensor / Optical through beam sensor
4.       Metal detector
5.       Capasitive sensor
6.       Thermocouple

2. Robot Arm Berserta Sistem Papan Pengawal Arduino

Pengenalan –

Kit Robot Arm ini direka untuk mempunyai 4 darjah pergerakkan yang digerakkan
oleh 4 biji motor servo MG90S bergear logam. 4 biji motor servo tersebut sesuai
digerakkan oleh papan papan elektronik yang terkenal masa kini seperti Arduino,
Raspberry Pi dan MicroBit. 
Robot Arm Assembled With MG90S 4DOF Servo 4 Axis Rotating Kit adalah
kit Robot Arm yang sudah siap dipasang. Ianya direka bertujuan untuk
membolehkan kanak-kanak dan orang dewasa belajar meneroka dunia teknologi,
kejuruteraan dan pengaturcaraan di samping memberi galakkan keseronokkan
untuk mereka mendalami bidang bidang yang amat diperlukan di masa hadapan
ini.

8
9
Kit Robot Arm ini direka untuk mempunyai 4 darjah pergerakkan yang digerakkan
oleh 4 biji motor servo MG90S bergear logam. 4 biji motor servo tersebut sesuai
digerakkan oleh papan papan elektronik yang terkenal masa kini seperti Arduino,
Raspberry Pi dan MicroBit.

Papan papan elektronik ini tidak didatangkan bersama sama dengan kit Robot Arm
ini. Oleh itu, para pereka cipta mempunyai kebebasan penuh untuk mereka cipta
sistem pengawal mereka sendiri untuk mengawal kit Robot Arm ini.

Untuk dimensi Robot Arm Assembled With MG90S, anda boleh merujuk laman
produk di Robot Arm Assembled With MG90S 4DOF Servo 4 Axis Rotating
Kit.

Sistem papan pengawal Arduino ini datang dalam bentuk yang sudah siap dipasang
seperti dalam gambar di bawah atau anda boleh secara DIY membuatnya sendiri
kerana di laman ini sudah disediakan senarai barang yang digunakan, litar
sambungan serta kod arduino nya.

10
Robot Arm Controller 4DOF Arduino Servo 4 Axis Joystick Circuit adalah
papan pengawal kit Robot Arm yang direka untuk mengawal 4 darjah pergerakkan
dari 4 biji motor servo MG90S bergear logam yang telah dipasang pada kit Robot
Arm. Papan pengawal Arduino ini telah dimasukkan kod dan dihantar pada
pelanggan dalam keadaan sedia digunakan (Plug and Play).
Sistem papan pengawal Robot Arm ini mampu mengawal 4 output (4 biji motor
servo) yang dikawal oleh 4 input (2 biji modul joystick yang mampu mengawal 4
darjah pergerakkan) serta mempunyai 4 input untuk menentukan offset kedudukan
asal setiap darjah pergerakkan.

 Jalur warna merah adalah Channel 1, kami sambungkan pin VRx modul


joystick kiri dan motor servo yang mengawal claw robot arm.
 Jalur warna hijau adalah Channel 2, kami sambungkan pin VRy modul
joystick kiri dan motor servo yang mengawal sendi pertama robot arm.
 Jalur warna kuning adalah Channel 3, kami sambungkan pin VRx modul
joystick kanan dan motor servo yang mengawal sendi kedua robot arm.
 Jalur warna oren adalah Channel 4, kami sambungkan pin VRy modul
joystick kanan dan motor servo yang mengawal tapak robot arm.

Di bawah adalah senarai barang yang diperlukan untuk membina litar di atas :

1. Protoboard yang bersesuaian
2. Solder Lead
3. Wayar Penyambung yang secukupnya
4. DC DC Step Down Converter
5. 90 Darjah Male Header
6. Straight Male Header

11
7. Female DC Jack With Terminal
8. AC DC Adapter
9. Jumper Wire Female Female
10. Jumper Wire Male Female
11. Jumper Wire Male Male
12. Preset 10k Ohm 4 unit
13. Arduino Nano
14. Modul Joystick 2 unit

Di bawah pula disertakan kod arduino untuk membuat Sistem Papan Pengawal


Arduino Robot Arm bagi yang berminat untuk membuatnya sendiri.

#include <Servo.h>

Servo servoClaw;Servo servoJoint1;Servo servoJoint2;Servo servoBase;

int pinServoClaw = 12;int pinServoJoint1 = 8;int pinServoJoint2 = 4;int pinServoBase = 2;

int valueServoClaw = 0;int valueServoJoint1 = 0;int valueServoJoint2 = 0;int valueServoBase = 0;

int servoOffset1 = 0;int servoOffset2 = 0;int servoOffset3 = 0;int servoOffset4 = 0;

int processServoOffset1 = 0;int processServoOffset2 = 0;int processServoOffset3 = 0;int processServoOffset4 = 0;

int minimumServoDegree = 40;int maximumServoDegree = 140;

int pinLeftVRy = A0;int pinLeftVRx = A1;int pinRightVRy = A2;int pinRightVRx = A3;

int pinOffset1 = A4;int pinOffset2 = A5;int pinOffset3 = A6;int pinOffset4 = A7;

int valueLeftVRy = 0;int valueLeftVRx = 0;int valueRightVRy = 0;int valueRightVRx = 0;

int valueOffset1 = 0;int valueOffset2 = 0;int valueOffset3 = 0;int valueOffset4 = 0;

int avarageValue = 1000;

void setup() {

 Serial.begin(9600);

 servoClaw.attach(pinServoClaw);

 servoJoint1.attach(pinServoJoint1);

 servoJoint2.attach(pinServoJoint2);

12
 servoBase.attach(pinServoBase);}

void loop() {

 valueRightVRy = analogRead(pinRightVRy);

 valueRightVRx = analogRead(pinRightVRx);

 valueLeftVRy = analogRead(pinLeftVRy);

 valueLeftVRx = analogRead(pinLeftVRx);

   valueOffset1 = analogRead(pinOffset1);

 valueOffset2 = analogRead(pinOffset2);

 valueOffset3 = analogRead(pinOffset3);

 valueOffset4 = analogRead(pinOffset4);

 Serial.print("RightVRy = "); Serial.print(valueRightVRy);

 Serial.print("\tRightVRx = "); Serial.print(valueRightVRx);

 Serial.print("\tLeftVRy = "); Serial.print(valueLeftVRy);

 Serial.print("\tLeftVRx = "); Serial.print(valueLeftVRx);

 Serial.print("\tOffset1 = "); Serial.print(valueOffset1);

 Serial.print("\tOffset2 = "); Serial.print(valueOffset2);

 Serial.print("\tOffset3 = "); Serial.print(valueOffset3);

 Serial.print("\tOffset4 = "); Serial.println(valueOffset4);

 servoOffset1 = map(valueOffset1, 0, 1023, 0, maximumServoDegree);

 servoOffset2 = map(valueOffset2, 0, 1023, 0, maximumServoDegree);

 servoOffset3 = map(valueOffset3, 0, 1023, 0, maximumServoDegree);

 servoOffset4 = map(valueOffset4, 0, 1023, 0, maximumServoDegree);

 if( servoOffset1 > 90 ) processServoOffset1 = servoOffset1 - 90;

 else if( servoOffset1 < 90 )  processServoOffset1 = 90 - servoOffset1;

 else  processServoOffset1 = 0;

13
 if( servoOffset2 > 90 ) processServoOffset2 = servoOffset2 - 90;

 else if( servoOffset2 < 90 )  processServoOffset2 = 90 - servoOffset2;

 else  processServoOffset2 = 0;

 if( servoOffset3 > 90 ) processServoOffset3 = servoOffset3 - 90;

 else if( servoOffset3 < 90 )  processServoOffset3 = 90 - servoOffset3;

 else  processServoOffset3 = 0;

 if( servoOffset4 > 90 ) processServoOffset4 = servoOffset4 - 90;

 else if( servoOffset4 < 90 )  processServoOffset4 = 90 - servoOffset4;

 else  processServoOffset4 = 0;

 valueServoClaw = map(valueLeftVRx, 0, 1023, minimumServoDegree, maximumServoDegree);

 valueServoJoint1 = map(valueLeftVRy, 0, 1023, minimumServoDegree, maximumServoDegree);

 valueServoJoint2 = map(valueRightVRx, 0, 1023, minimumServoDegree, maximumServoDegree);

 valueServoBase = map(valueRightVRy, 0, 1023, minimumServoDegree, maximumServoDegree);   

 if( servoOffset1 > 90 ) valueServoClaw = valueServoClaw + processServoOffset1;

 else if( servoOffset1 < 90 ) valueServoClaw = valueServoClaw - processServoOffset1;

 if( servoOffset2 > 90 ) valueServoJoint1 = valueServoJoint1 + processServoOffset2;

 else if( servoOffset2 < 90 ) valueServoJoint1 = valueServoJoint1 - processServoOffset2;

 if( servoOffset3 > 90 ) valueServoJoint2 = valueServoJoint2 + processServoOffset3;

 else if( servoOffset3 < 90 ) valueServoJoint2 = valueServoJoint2 - processServoOffset3;    

   if( servoOffset4 > 90 ) valueServoBase = valueServoBase + processServoOffset4;

 else if( servoOffset4 < 90 ) valueServoBase = valueServoBase - processServoOffset4;

   if( valueServoClaw > maximumServoDegree ) valueServoClaw = maximumServoDegree;

 else if( valueServoClaw < minimumServoDegree ) valueServoClaw = minimumServoDegree;

 if( valueServoJoint1 > maximumServoDegree ) valueServoJoint1 = maximumServoDegree;

 else if( valueServoJoint1 < minimumServoDegree ) valueServoJoint1 = minimumServoDegree;

14
 if( valueServoJoint2 > maximumServoDegree ) valueServoJoint2 = maximumServoDegree;

 else if( valueServoJoint2 < minimumServoDegree ) valueServoJoint2 = minimumServoDegree;

 if( valueServoBase > maximumServoDegree ) valueServoBase = maximumServoDegree;

 else if( valueServoBase < minimumServoDegree ) valueServoBase = minimumServoDegree;

 servoClaw.write(valueServoClaw);

 servoJoint1.write(valueServoJoint1);

 servoJoint2.write(valueServoJoint2);

 servoBase.write(valueServoBase);}

3. Sistem Lampu Trafik Simpang Empat

Simulasi Traffic Light Simpang 4 Proteus 7 dan ARDUINO

15
               Pada kesempatan kali ini saya akan menjelaskan mengenai bagaimana
cara membuat sebuah alat atau simulasi yang berfungsi sebagaimana kinerja dari
traffic light atau lampu merah di perkotaan. alat ini menggunakan arduino dan
interface lcd i2c serta dilengkapi dengan RTC. untuk lebih jelasnya berikut
komponen dan kodingnya.

a. Arduino

16
b. Lcd 16x2 + I2C

c. RTC Ds1307

17
d. Led

e. Push Button

f. Program Arduino IDE

#include <Wire.h>

18
#include <EEPROM.h>
#include <LiquidCrystal_I2C.h>
#define DS3231_I2C_ADDRESS 0x68
//0x20 untuk simulasi proteus jika real gunakan 0x27 atau 0x3F
LiquidCrystal_I2C lcd(0x20,16,2); 
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;

int addr1 = 0;
int addr2 = 1;
int addr3 = 2;
int addr4 = 3;
int addr5 = 4;
int addr6 = 5;

int ledg1 = 0;
int ledy1 = 1;
int ledr1 = 2;

int ledg2 = 3;
int ledy2 = 4;
int ledr2 = 5;

int ledg3 = 6;
int ledy3 = 7;
int ledr3 = 8;

int ledg4 = 9;
int ledy4 = 10;
int ledr4 = 11;

int btset = A0;


int btup = A1;
int btdown = A2;
int btok = A3;

int btsetx = 0;
int btupx = 0;
int btdownx = 0;
int btokx = 0;

19
int delaykuning = 300;

// Convert normal decimal numbers to binary coded decimal


byte decToBcd(byte val)
{
  return( (val/10*16) + (val%10) );
}
// Convert binary coded decimal to normal decimal numbers
byte bcdToDec(byte val)
{
  return( (val/16*10) + (val%16) );
}

int jam,menit,hari,awalflash,akhirflash;
int hijau1,hijau2,hijau3,hijau4;

void setup()
{
  
hijau1 = EEPROM.read(addr1);
hijau2 = EEPROM.read(addr2);
hijau3 = EEPROM.read(addr3);
hijau4 = EEPROM.read(addr4);
awalflash = EEPROM.read(addr5);
akhirflash = EEPROM.read(addr6);

lcd.begin();   
lcd.noCursor();
lcd.clear();

pinMode(ledg1,OUTPUT);
pinMode(ledy1,OUTPUT);
pinMode(ledr1,OUTPUT);

pinMode(ledg2,OUTPUT);
pinMode(ledy2,OUTPUT);
pinMode(ledr2,OUTPUT);

pinMode(ledg3,OUTPUT);

20
pinMode(ledy3,OUTPUT);
pinMode(ledr3,OUTPUT);

pinMode(ledg4,OUTPUT);
pinMode(ledy4,OUTPUT);
pinMode(ledr4,OUTPUT);

pinMode(btset,INPUT_PULLUP);
pinMode(btup,INPUT_PULLUP);
pinMode(btdown,INPUT_PULLUP);
pinMode(btok,INPUT_PULLUP);

  Wire.begin();
  // set the initial time here:
  // DS3231 seconds, minutes, hours, day, date, month, year
  // setDS3231time(0,47,11,6,23,11,18);
  
btsetx = digitalRead(btset);
  
if(btsetx == 0)
{
   lcd.clear();  
   hijau1 = 0;
   hijau2 = 0;
   hijau3 = 0;
   hijau4 = 0;
  
   awalflash = 0;
   akhirflash = 0;
  
   settingjam();
   settingmenit();
   settinghari();
   setdelayhijau1();
   setdelayhijau2();
   setdelayhijau3();
   setdelayhijau4();
   setawalflash();
   setakhirflash();
   EEPROM.write(addr1, hijau1);

21
   EEPROM.write(addr2, hijau2);
   EEPROM.write(addr3, hijau3);
   EEPROM.write(addr4, hijau4);
   EEPROM.write(addr5, awalflash);
   EEPROM.write(addr6, akhirflash);
  // DS3231 seconds, minutes, hours, day, date, month, year
   setDS3231time(0,menit,jam,hari,23,11,20);

  
}

void setDS3231time(byte second, byte minute, byte hour, byte dayOfWeek, byte
dayOfMonth, byte month, byte year)
{
  // sets time and date data to DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set next input to start at the seconds register
  Wire.write(decToBcd(second)); // set seconds
  Wire.write(decToBcd(minute)); // set minutes
  Wire.write(decToBcd(hour)); // set hours
  Wire.write(decToBcd(dayOfWeek)); // set day of week (1=Sunday, 7=Saturday)
  Wire.write(decToBcd(dayOfMonth)); // set date (1 to 31)
  Wire.write(decToBcd(month)); // set month
  Wire.write(decToBcd(year)); // set year (0 to 99)
  Wire.endTransmission();
}
void readDS3231time(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(0); // set DS3231 register pointer to 00h
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 7);
  // request seven bytes of data from DS3231 starting from register 00h

22
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}
void displayTime()
{
  lcd.setCursor(0,0);
  // retrieve data from DS3231
  readDS3231time(&second, &minute, &hour, &dayOfWeek, &dayOfMonth,
&month,
  &year);
  // send it to the serial monitor
  lcd.print(hour, DEC);
  // convert the byte variable to a decimal number when displayed
  lcd.print(":");
  if (minute<10)
 {
    lcd.print("0");
 }
  lcd.print(minute, DEC);
  lcd.print(":");
  if (second<10)
 {
    lcd.print("0");
 }
  lcd.print(second, DEC);
  lcd.print(" ");
/* 
  lcd.setCursor(0,1);
  lcd.print(dayOfMonth, DEC);
  lcd.setCursor(0,2);
  lcd.print(month, DEC);
  lcd.print(" / ");
  lcd.print(year, DEC);
  lcd.setCursor(0,3);
  //lcd.print(" Day of week: ");

23
 
  switch(dayOfWeek){
  case 1:
    lcd.print("Sunday");
    break;
  case 2:
    lcd.print("Monday");
    break;
  case 3:
    lcd.print("Tuesday");
    break;
  case 4:
    lcd.print("Wednesday");
    break;
  case 5:
    lcd.print("Thursday");
    break;
  case 6:
    lcd.print("Friday");
    break;
  case 7:
    lcd.print("Saturday");
    break;
 }
*/  

lcd.setCursor(0,1);
lcd.print("TEXT BISA EDIT");

void loop()
{
   displayTime();
   delay(1);

//hijau apil 1   
digitalWrite(ledg1,LOW);
digitalWrite(ledy1,HIGH);

24
digitalWrite(ledr1,HIGH);

digitalWrite(ledg2,HIGH);
digitalWrite(ledy2,HIGH);
digitalWrite(ledr2,LOW);

digitalWrite(ledg3,HIGH);
digitalWrite(ledy3,HIGH);
digitalWrite(ledr3,LOW);

digitalWrite(ledg4,HIGH);
digitalWrite(ledy4,HIGH);
digitalWrite(ledr4,LOW);
delay(hijau1);

//kuning apil 1 
digitalWrite(ledg1,HIGH);
digitalWrite(ledy1,LOW);
digitalWrite(ledr1,HIGH);
delay(delaykuning);

//hijau apil 2   
digitalWrite(ledg1,HIGH);
digitalWrite(ledy1,HIGH);
digitalWrite(ledr1,LOW);

digitalWrite(ledg2,LOW);
digitalWrite(ledy2,HIGH);
digitalWrite(ledr2,HIGH);

digitalWrite(ledg3,HIGH);
digitalWrite(ledy3,HIGH);
digitalWrite(ledr3,LOW);

digitalWrite(ledg4,HIGH);
digitalWrite(ledy4,HIGH);
digitalWrite(ledr4,LOW);
delay(hijau2);

25
//kuning apil 2 
digitalWrite(ledg2,HIGH);
digitalWrite(ledy2,LOW);
digitalWrite(ledr2,HIGH);
delay(delaykuning);

//hijau apil 3   
digitalWrite(ledg1,HIGH);
digitalWrite(ledy1,HIGH);
digitalWrite(ledr1,LOW);

digitalWrite(ledg2,HIGH);
digitalWrite(ledy2,HIGH);
digitalWrite(ledr2,LOW);

digitalWrite(ledg3,LOW);
digitalWrite(ledy3,HIGH);
digitalWrite(ledr3,HIGH);

digitalWrite(ledg4,HIGH);
digitalWrite(ledy4,HIGH);
digitalWrite(ledr4,LOW);
delay(hijau3);

//kuning apil 3 
digitalWrite(ledg3,HIGH);
digitalWrite(ledy3,LOW);
digitalWrite(ledr3,HIGH);
delay(delaykuning);
  

//hijau apil 4   
digitalWrite(ledg1,HIGH);
digitalWrite(ledy1,HIGH);
digitalWrite(ledr1,LOW);

digitalWrite(ledg2,HIGH);
digitalWrite(ledy2,HIGH);
digitalWrite(ledr2,LOW);

26
digitalWrite(ledg3,HIGH);
digitalWrite(ledy3,HIGH);
digitalWrite(ledr3,LOW);

digitalWrite(ledg4,LOW);
digitalWrite(ledy4,HIGH);
digitalWrite(ledr4,HIGH);
delay(hijau4);

//kuning apil 4 
digitalWrite(ledg4,HIGH);
digitalWrite(ledy4,LOW);
digitalWrite(ledr4,HIGH);
delay(delaykuning);   

if(hour == awalflash){
mulaiflash();
}
      
}

void settingjam(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("Jam = ");
lcd.print(jam);
lcd.print("   ");

if(btupx == 0){
delay(10);
jam++;
}
if(btdownx == 0){
delay(10);

27
jam--;
}

if(jam > 23){


jam = 0;
}

if(jam < 0){


jam = 23;
}

if(btokx == 0){
lcd.clear();
delay(100);
return;
}
  
settingjam();  
}

void settingmenit(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("menit = ");
lcd.print(menit);
lcd.print("   ");

if(btupx == 0){
menit++;
}
if(btdownx == 0){
menit--;
}

if(menit > 59){

28
menit = 0;
}

if(menit < 0){


menit = 59;
}

if(btokx == 0){
lcd.clear();
delay(100);
return;
}
  
settingmenit();  
}

void settinghari(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("hari= ");

if(hari == 1){
lcd.print("senin     ");
}
if(hari == 2){
lcd.print("selasa   ");
}
if(hari == 3){
lcd.print("rabu     ");
}
if(hari == 4){
lcd.print("kamis    ");
}
if(hari == 5){

29
lcd.print("jumat     ");
}
if(hari == 6){
lcd.print("sabtu    ");
}
if(hari == 7){
lcd.print("minggu    ");
}

if(btupx == 0){
hari++;
}
if(btdownx == 0){
hari--;
}

if(hari < 1){


hari = 7;
}

if(hari > 7){


hari = 1;
}

if(btokx == 0){
lcd.clear();
delay(100);
return;
}
  
settinghari();  
}

void setdelayhijau1(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

30
lcd.setCursor(0,0);
lcd.print("delay1= ");
lcd.print(hijau1);
lcd.print("   ");

if(btupx == 0){
hijau1++;
}
if(btdownx == 0){
hijau1--;
}

if(hijau1 < 1){


hijau1 = 1;
}

if(btokx == 0){
lcd.clear();
delay(100);
hijau1 = hijau1 * 100; 
return;
}
  
setdelayhijau1();  
}

void setdelayhijau2(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("delay2= ");
lcd.print(hijau2);
lcd.print("   ");

31
if(btupx == 0){
hijau2++;
}
if(btdownx == 0){
hijau2--;
}

if(hijau2 < 1){


hijau2 = 1;
}

if(btokx == 0){
lcd.clear();
delay(100);
hijau2 = hijau2 * 100; 
return;
}
  
setdelayhijau2();  
}

void setdelayhijau3(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("delay3= ");
lcd.print(hijau3);
lcd.print("   ");

if(btupx == 0){
hijau3++;
}
if(btdownx == 0){
hijau3--;

32
}

if(hijau3 < 1){


hijau3 = 1;
}

if(btokx == 0){
lcd.clear();
delay(100);
hijau3 = hijau3 * 100; 
return;
}
  
setdelayhijau3();  
}

void setdelayhijau4(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("delay4= ");
lcd.print(hijau4);
lcd.print("   ");

if(btupx == 0){
hijau4++;
}
if(btdownx == 0){
hijau4--;
}

if(hijau4 < 1){


hijau4 = 1;
}

33
if(btokx == 0){
lcd.clear();
delay(100);
hijau4 = hijau4 * 100; 
return;
}
  
setdelayhijau4();  
}

void setawalflash(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("awalflash= ");
lcd.print(awalflash);
lcd.print("   ");

if(btupx == 0){
awalflash++;
}
if(btdownx == 0){
awalflash--;
}

if(awalflash < 0){


awalflash = 23;
}

if(awalflash > 23){


awalflash = 0;
}

if(btokx == 0){

34
lcd.clear();
delay(100);
return;
}
  
setawalflash();  
}

void setakhirflash(){

btokx = digitalRead(btok);
btupx = digitalRead(btup);
btdownx = digitalRead(btdown);

lcd.setCursor(0,0);
lcd.print("akhirflash= ");
lcd.print(akhirflash);
lcd.print("   ");

if(btupx == 0){
akhirflash++;
}
if(btdownx == 0){
akhirflash--;
}

if(akhirflash < 0){


akhirflash = 23;
}

if(akhirflash > 23){


akhirflash = 0;
}

if(btokx == 0){
lcd.clear();
delay(100);
return;
}

35
  
setakhirflash();  
}

void mulaiflash(){
  
displayTime();
delay(1);
  
digitalWrite(ledg1,HIGH);
digitalWrite(ledy1,LOW);
digitalWrite(ledr1,HIGH);
digitalWrite(ledg2,HIGH);
digitalWrite(ledy2,LOW);
digitalWrite(ledr2,HIGH);

digitalWrite(ledg3,HIGH);
digitalWrite(ledy3,LOW);
digitalWrite(ledr3,HIGH);

digitalWrite(ledg4,HIGH);
digitalWrite(ledy4,LOW);
digitalWrite(ledr4,HIGH);
delay(200);

digitalWrite(ledg1,HIGH);
digitalWrite(ledy1,HIGH);
digitalWrite(ledr1,HIGH);

digitalWrite(ledg2,HIGH);
digitalWrite(ledy2,HIGH);
digitalWrite(ledr2,HIGH);

digitalWrite(ledg3,HIGH);
digitalWrite(ledy3,HIGH);
digitalWrite(ledr3,HIGH);

digitalWrite(ledg4,HIGH);
digitalWrite(ledy4,HIGH);
digitalWrite(ledr4,HIGH);

36
delay(200);

if(hour == akhirflash){
return;
}

mulaiflash();
}

4. AT+COMMAND | WiFi ESP8266

Module ESP8266 ini sudah jarang digunakan untuk projek-projek IOT kerana ke-
tidak-stabilan connection WiFi nya, juga disebabkan kaedah sambungan
wiring yang rumit kerana perlu menggunakan Resistor.
Jika anda sedang membuat projek IOT, kami galakkan anda terus
menggunakan NodeMCU, iaitu sejenis Arduino yang mempunyai ‘Built-In’
WiFi Module yang lebih berkualiti.

Guide untuk “Beginners” bagaimana menggunakan AT Command untuk setting


WiFi Module ESP8266 (ESP-01). AT Command ini hanya perlu di-setting
SEKALI sahaja pada peringkat awal, selepas itu, tidak perlu setting AT
Command. AT Command ini kebiasannya adalah untuk Setup module supaya ia
dapat digunakan berdasarkan kondisi yang kita tetapkan, sebagai contoh berikut
untuk ESP8266:

• menetapkan Mode module (AP/Station)


• menetapkan kelajuan Baud Rate
• menetapkan SSID Wifi/Network juga Password Network

Secara theory, AT command ini patut dapat digunakan untuk versi


lain ESP8266, namun kami tidak memberi warranty selain dari
module dan versi yang kami nyatakan di bawah.

37
Module WiFi ESP8266 (ESP-01)

Module yang kami gunakan dalam guide ini boleh didapati


dari URL berikut:
• Module ESP8266 (ESP-01)

AT+COMMAND Melalui UNO


Dalam guide ini, kita akan menggunakan kaedah mudah melalui
Arduino UNO untuk membuat komunikasi AT-Command dengan
Module ESP 8266.

Dalam Guide ini, kami akan menerangkan kaedah termudah


dengan menggunakan Arduino UNO sahaja tanpa perlu membeli
module- module lain dan software lain yang berasingan.

Untuk membuat module ESP berkomunikasi terus dengan komputer


melalui UNO, terdapat beberapa mazhab di internet, seperti perlu
keluarkan chip ATMega328P, ada yang kata perlu sambungkan pin
RESET pada Ground dan macam-macam lagi.

Kaedah yang kami tunjukkan di sini, tidak memerlukan aktiviti


yang pelik-pelik, cuma sambungkan ESP terus pada Arduino pada
pin Rx dan Tx.
Apa yang penting, sambungkan Pin Tx dan Rx seperti di bawah:

• Tx ESP – Tx UNO
• Rx ESP – Rx UNO (melalui voltage divider) – Tx UNO (melalui Voltage

38
Divider)

Dengan TIDAK menyilangkan Tx-Rx, USB connection akan by-pass chip


ATMega dan terus berkomunikasi dengan Module ESP melalui Serial
Monitor.

Nota Kaki: Pada penggunaan Normal ESP (bukan AT-Command),


sambungan Tx-Rx adalah seperti berikut:

• Tx ESP – Rx UNO
• Rx ESP – Tx UNO (melalui voltage divider) – Tx UNO (melalui Voltage
Divider)

Step 1: Masukkan (upload) Sketch Kosong ke dalam Arduino UNO

Sebelum upload
sketch, pastikan Module ESP8266 TIDAK- DISAMBUNGKAN. Upload sketch
kosong dengan Void Setup dan Void Loop sahaja ke dalam Arduino UNO.
Sketch ini juga dikenali sebagai sketch “Bare-Minimum”.

Step 2: Sambungkan ESP8266 Pada Arduino UNO

Selepas sketch kosong di-Upload, CABUT semula USB dan power, untuk
off kan UNO Board.

39
Kemudian sambungkan Module ESP mengikut wiring-diagram di bawah.

(3 biji resistor 1k ohm adalah menjadi voltage divider supaya signal yang
pergi ke pin Rx ESP adalah 3.3V, manakala voltage selebihnya diground-
kan)

Pastikan Pin Tx ESP disambungkan pada Pin Tx UNO dan Pin Rx ESP
(bersama voltage divider) sambung pada Pin Rx UNO.

Sambungan Tx-Tx dan Rx-Rx membolehkan ESP berkomunikasi terus pada


PC dan bukan pada Arduino. Sambungan yang sebaliknya akan membuat
ESP berkomunikasi dengan UNO.

Step 3: Sambungkan semula USB dan buka Serial Monitor

40
AT+GMR – Lihat Version AT dan SDK
“AT+GMR” akan meminta ESP nyatakan version software AT dan SDK yang
ada dalam flash memorynya.

Dalam Gambar di atas, Version AT ESP adalah version 1.1.0.0 manakala


version SDK adalah version 1.5.4 , antara version yang terbaru.

AT+CWMODE – Lihat fungsi-fungsi WiFi Mode

“AT+CWMODE=?” akan listkan jenis-jenis mode WiFi yang ada.

Mode 1 – Mode Station, yang hanya akan connect pada mana-

41
mana router/wifi berdekatan
Mode 2 – Mode AP (Access Point) , di mana ESP menjadi router
yang boleh di-access oleh mana-mana device lain. Dalam mode 2,
anda boleh memberi command untuk melihat Nama AP juga boleh
memberi password
Mode 3 – Mode Station + AP, dalam mode ini, ESP boleh dipilih
untuk menjadi AP atau Station

“AT+CWMODE?” akan memberikan konfigurasi mode “sekarang”

“AT+CWMODE=<nombor mode>“sebagai contoh, “AT+CWMODE=2″


akan menukar setting ESP pada mode 2, iaitu AP Mode.

AT+CWLAP – Listkan semua AP/WiFi Router berdekatan

“AT+CWLAP” akan listkan semua network WiFi (AP) yang berdekatan,


nama , MAC Address serta kekuatan signal akan terpapar.

AT+CWJAP – Sambung pada mana-mana AP/Router WiFi/Hotspot


“AT+CWJAP=<SSID>,<PWD>” akan menyambungkan ESP pada WiFi
SSID yang dinyatakan. Contoh penuh menulis adalah,
“AT+CWJAP=”Rumah-Saya”, “abc123”

“AT+CWJAP?” akan menyatakan apakah AP atau WiFi network yang

42
sedang disambung pada ESP.

SETTING BAUD RATE

Selain dari setting-setting di atas, Command untuk menukar Baud Rate


juga penting. Tetapi perlu dilaksanakan dengan berhati-hati kerana ia akan
terus di simpan dalam Flash Memory ESP.

AT+UART_DEF – tukar setting Baud Rate


“AT+UART_DEF=9600, 8, 1,0,0” akan menukar Baud Rate default ESP
dari 115200(atau yang sedia ada) pada Baud Rate 9600.

Penukaran Baud Rate adalah penting sekiranya anda menggunakan


SoftwareSerial.h library untuk berkomunikasi dengan Module ESP.

Advance AT+COMMAND
Sekiranya anda mempunyai sebarang kemusykilan dan mahu mengetahui
lebih mengenai semua AT Command yang ada, anda boleh lihat document
lengkap di URL berikut dari Sparkfun :

• ESP8266 AT Instructions

Atau anda boleh download document lengkap di URL berikut:

• Document Lengkap AT Command ESP8266

Selamat Menggunakan ESP8266!

Module Komunikasi Untuk AT+COMMAND

Dalam guide ini, kita akan menggunakan kaedah mudah melalui


Arduino UNO untuk membuat komunikasi AT-Command dengan
Module ESP 8266.

Walaubagaimanapun, terdapat beberapa kaedah lain dan module lain yang


boleh digunakan untuk sambungan ESP8266 terus pada PC. Terdapat
sesetengah Hobbyist yang menggunakan module FTDI yang
disambungkan terus pada pin Tx dan Rx ESP8266.

43
FT232RL FTDI USB to TTL Serial
Adapter Module
Ada juga yang menggunakan Software Communication lain seperti Putty
dan lain-lain. Putty mempunyai display seperti ruangan Command
Promt/MS-Dos.

Dalam Guide ini, kami akan menerangkan kaedah termudah dengan


menggunakan Arduino UNO sahaja tanpa perlu membeli module- module lain
dan software lain yang berasingan.

44
Selepas membukan Serial Monitor, tukar setting Baud Rate pada default
Baud Rate 115200.
(module ESP dari tempat lain mungkin mempunyai Baud Rate default yang
berlainan, pastikan anda check datasheet mereka)

Kemudian, tukarkan setting “No Line Ending” pada “Both NL & CR” di
ruangan bawah kanan Serial Monitor.

ASAS BASIC AT-COMMAND

AT – Test AT Startup
Dengan menulis “AT” pada Serial Monitor dan enter, anda memberi
command pada module ESP untuk Start dalam mode AT.

Jika module ok dan tidak bermasalah, anda pasti akan dapat return “OK”
dari ESP.

45

You might also like