Modul Lengkap [PDF]

  • 0 0 0
  • Suka dengan makalah ini dan mengunduhnya? Anda bisa menerbitkan file PDF Anda sendiri secara online secara gratis dalam beberapa menit saja! Sign Up
File loading please wait...
Citation preview

Modul Pelatihan Pemrograman Mikrokontroler Berbasis Arduino



Disusun Oleh : Rausan Fikri, S.Si Herjuno Aji Prayogo, S.Kom



1



Modul 1



Pertemuan ke-



Materi 1



2 Teori 1 3 4 5 Praktik



1



Copyright (c) 2016 Kedai Techno



Mengenal Mikrokontroller



Deskripsi Materi



Mikrokontroler dan Kegunaannya Perbedaan antara Mikrokontroler dengan Mikroprosesor CISC & RISC Arduino Apa Itu Arduino Jenis-jenis Board Arduino Arduino Nano ATmega328 Konfigurasi Pin Arduino Nano Pengenalan Bahasa C Struktur Penulisan Pemograman C Penjelasan kaki led Anoda dan katoda pada LED Penggunaan breadboard agar rangkaian Penjelasan Jalur Breadboard berjalan dengan baik dan tidak terjadi korslet. Input Output Blinking Led Variabel, Tipe Data & #define



2



Teori 1. Mengenal Mikrokontroller 1.1. Mikrokontroler dan Kegunaannya Menurut Wikipedia yang namanya Mikrokontroler atau biasa disingkat MCU (Microcontroller Unit) merupakan sebuah komputer kecil yang dikemas dalam satu IC (Integrated Circuit) berisikan sebuah prosesor, memory dan peripherals Input/Output yang terprogram. Penggunaan teknologi mikrokontroler dapat kita temui pada peralatan elektronik dirumah seperti remote televisi, telepon digital, mesin cuci dll. Pengaplikasian teknologi mikrokontroler dapat digunakan pada bidang otomatisasi industri, akuisi data, telekomunikasi dll. 1.2. Mikrokontroler & Mikroprosesor  Di dalam mikrokontroler terdapat mikroposesor.  Mikroprosesor tanpa RAM, ROM Timer, PORT I/O  Mikrokontroler ada mikroporesor, RAM, ROM, TIMER, Port I/O yang disusun dalam sebuah IC 1.3. CISC & RISC Berdasarkan desain CPU dan set Instruksi mikrokontroler dibedakan menjadi 2 yaitu Complex Instruction Set Computing (CISC) & Reduce Instruction Set Computing (RISC). CISC memiliki set instruksi yang kompleks dengan tujuan untuk mengurangi ukuran program yang telah terkompilasi sehingga model ini memiliki ukuran memori utama sedikit, contoh mikrokontroler CISC intel 8051 (MCS51), motorola 68HC11 dll. Sistem RISC lebih populer saat ini karena tingkat kinerjanya. sistem ini memiliki jumlah instruksi lebih sedikit sehingga untuk pemrogramannya lebih mudah menggunakan bahasa pemrograman tingkat tinggi, salah satunya bahasa C. Sistem ini memiliki lebih banyak register. Selain itu eksekusi intruksi pada sistem RISC dilakukan lebih cepat rata-rata satu clock per instruksi. Contoh mikrokontroler RISC yaitu AVR keluaran ATMEL, PIC12/16XX dll.



Copyright (c) 2016 Kedai Techno



3



2. Arduino 2.1. Arduino dan Jenis Board Arduino merupakan Open Board elektronik atau bisa disebut sebagai sistem minimum board dari sebuah mikrokontroler yang sudah memiliki bootloader sehingga pemrogramannya tidak menggunakan chip programer lagi melainkan hanya melalui komunikasi serial. Arduino menjadi populer karena sangat mudah digunakan bagi mereka yang tidak memiliki pengetahuan yang kuat tentang pemrograman karena arduino sudah memiliki library yang banyak dan bersifat open source sehingga sangat mudah digunakan. Ada beberapa jenis produk development board & modul yang dikembangkan oleh Arduino. Produk yang diberi nama Arduino dijual di USA saja sedangkan untuk diluar USA diberi nama Genuino. Jenis produk Arduino dibedakan dalam beberapa kategori yaitu Kategori Entry level, Enhanced Features, IoT (internet of Things), Wearable & Retired. Kategori Entry level Product diperuntukan bagi mereka yang ingin mulai belajar pemrograman, mudah digunakan dan sangat cocok untuk project pertama anda. Untuk kamu yang ingin melakukan project yang lebih complex dan memerlukan board yang memiliki advanced functionalities dan performa yang cepat bisa memilih kategori Enhanced features Product. Sedangkan bagi kamu yang ingin yang ingin mengebangkan teknologi berbasis IoT bisa memilih IoT product. Info lebih lanjut tentang produk Arduino bisa diliat disitus resminya (arduino.cc).



Copyright (c) 2016 Kedai Techno



4



Gambar 1. Arduino Entry Level Product (Sumber : www.Arduino.cc) Setiap jenis Board arduino tidak memiliki mikrokontroler yang sama. Contohnya pada Arduino Uno menggunakan chip ATmega328 yg merupakan mikrokontroler keluaran ATMEL sedangkan pada Aduino 101 menggunakan chip Intel Curie besutan Intel. 2.2. Arduino Nano 3.0 Berdasarkan chip mikrokontroler yang digunakan Arduino Nano dibedakan menjadi dua yaitu Arduino Nano versi 2.x yang menggunakan chip mikrokontroler ATmega168 dan Arduino Nano versi 3.x yang menggunakan ATmega328.



Gambar 2 Arduino Nano (sumber Arduino.cc)



Copyright (c) 2016 Kedai Techno



5



Spesifikasi dari Arduino Nano 3.0 dapat dilihat pada tabel 1 dibawah ini (sumber :arduino.cc). Tabel 1. spesifikasi Arduino Nano 3.0 Microcontroller Operating Voltage (logic level) Input Voltage (recommended) Input Voltage (limits) Digital I/O Pins Analog Input Pins DC Current per I/O Pin Flash Memory SRAM EEPROM Clock Speed Dimensions Length Width Weigth



Copyright (c) 2016 Kedai Techno



ATmega328 5V 7-12 V 6-20 V 14 (of which 6 provide PWM output) 8 40 mA 32 KB (ATmega328) of which 2 KB used by bootloader 2 KB (ATmega328) 1 KB (ATmega328) 16 MHz 0.73" x 1.70" 45 mm 18 mm 5g



6



Gambar 3 Konfigurasi Pin Arduino Nano 3.0



Copyright (c) 2016 Kedai Techno



7



3. Struktur Penulisan Program Arduino Pemrograman mikrokontroler platform arduino bisa menggunakan program Arduino IDE dan bahasa pemrogramannya menggunakan bahasa C/C++. struktur penulisan program Arduino sama dengan penulisan program C dimana pada hakekatnya sebuah program tersusun atas sejumlah blok fungsi. Sebuah fungsi dibuat dengan beberapa pernyataan yang tujuannya untuk melaksanakan sebuah tugas dan ada biasanya sebuah fungsi juga ada yang tidak mengandung pernyataan. i.



Pre-processor Merupakan bagian dari program dalam bahasa c yang selalu dijalankan pertama kali. Bagian ini juga melakukan proses tertentu. Banyak sekali syntax dalam pre-processor. Namun setidaknya ada dua syntax yang akan sering kita gunakan dalam latihan programming dasar, yaitu syntax #include dan #define. #include:



proses



yang



pertama



kali



dijalankan



untuk



memanggil



library/prototype fungsi yang ada di dalam header file. #include



Berarti meng-include file servo.h. Dengan demikian berarti kita mempersiapkan, fungsi-fungsi dan instruksi-instruksi yang dapat digunakan untuk mengontrol servo seperti attach, detach, dan write. #define: proses yang pertama kali dijalankan untuk mendefinisikan konstanta dan macro. Nilai dari konstanta tidak akan berubah selama program berlangsung. #define pinServo 9 #define pinPotensio 0



Kita dapat juga membuat sebuah objek dan mendefinisikan variabel pada pre-processor Servo myservo; int val;



myservo merupakan objek dari ‘Servo’, sedangkan val merupakan variabel yang tipe datanya integer.



Copyright (c) 2016 Kedai Techno



8



ii.



Fungsi Utama Jika kita ingin menggunakan fasilitas atau fitur tertentu sebuah mikrokontroler maka kode program yang dituliskan diletakkan pada fungsi utama. void(setup){ myservo.attach(pinServo); }



iii. Fungsi Looping Fungsi looping (perulangan) merupakan fungsi yang akan menjalankan perintah yang



kita



buat



dan



terus



menerus



akan



dijalankan. void(loop){ val = analogRead(pinPotensio); val = map(val, 0, 1023, 0, 179); myservo.write(val); delay(15); }



B. Tipe Data dan Variabel Dalam pemrograman bahasa C juga dikenal banyak tipe data, namun kita akan membahas beberapa yang paling sering digunakan dalam pemrograman dasar arduino. a) int (integer) = tipe data untuk menyimpan bilangan bulat b) float = tipe data untuk menyimpan bilangan desimal c) selain



string = tipe data untuk menyimpan kata tiga



tipe



data



diatas,



dapat



di



cek



pada



https://www.arduino.cc/en/Reference/HomePage pada bagian “Data Types”. Tipe data digunakan untuk menentukan tipe suatu variabel yang nantinya akan digunakan. Variabel adalah suatu pengenal (identifier) yang mewakili nilai tertentu di dalam proses suatu program. Berikut contoh penggunaan variabel dan inisialisasi nilainya int val = 100; float dec = 100.01; string alpha = “seratus”;



Hal-hal yang perlu diperhatikan dalam Penulisan Bahasa C  Setiap akhir penulisan kode program diakhiri tanda titik koma (;) kecuali penulisan sebuah fungsi & preprocessor.



Copyright (c) 2016 Kedai Techno



9



 Besar kecilnya huruf harus diperhatikan, alias case-sensitive. Artinya jika ada salah menuliskasama sekali. Berikut struktur penulisan program Arduino 4. Penjelasan Kaki pada LED



Gambar 4. Anoda dan katoda pada LED LED (Light Emitting Diode) memiliki dua kaki, yaitu anoda dan katoda. Anoda adalah kutub positif dan katoda adalah kutub negatif. Anoda biasanya yang berkaki panjang, dan kepalanya yang kecil.



5. Penjelasan Penggunaan Breadboard



Penjelasan jalur breadboard/protoboard 1. Sisi dalam breadboard, a-b-c-d-e merupakan satu jalur, f-g-h-i-j merupakan satu jalur, 1,2,3 dst berbeda jalur 2. Sisi tepi breadboard (jalur panjang) hanya memiliki 2 jalur, biasanya digunakan untuk jalur + dan - . Gambar 5. contoh pemasangan LED pada breadboard



Copyright (c) 2016 Kedai Techno



10



PRAKTIKUM 1 Job 1  Schematic



Cathode



Anode



Copyright (c) 2016 Kedai Techno



11



Anode



Cathode



ARDUINO D13 - Resistor 220 ohm GND -



LED Anoda Katoda



 Kode Program void setup() { pinMode(13, OUTPUT); // menginstruksikan mode pin 13 sebagai OUTPUT } void loop() { digitalWrite(13, HIGH); // menghidupkan LED, pin 13 diberi nilai HIGH delay(1000); // delay 1 detik atau 1000 milisekon digitalWrite(13, LOW); // mematikan LED, pin 13 diberi nilai LOW delay(1000); }



Copyright (c) 2016 Kedai Techno



12



Job 2  Schematic



D13 - R1 - LED1 - GND D12 - R3 - LED2 - GND D11 - R2 - LED3 - GND TASK :  Rangkai 3 led  Hidup dan matikan 3 led secara bersamaan dengan delay 1 detik setiap hidup dan mati  Hidup dan matikan 3 led secara bergantian dengan delay 500 milisekon  Gunakan #define atau tipe data integer untuk mendefinisikan pin



Copyright (c) 2016 Kedai Techno



13



Modul 2



Pertemuan ke-



Materi



Teori



1



Operator Relasi



2



Operator Logika



3 4



Pernyataan If Pernyataan If - else Pernyataan Nested If (if di dalam if)



5 2



Praktik



6



Pernyataan If - else if - else



7



Komunikasi Serial



1



Digital Input Pull-Up



2



Kendali 2 lampu



Copyright (c) 2016 Kedai Techno



Deskripsi Materi Membandingkan dua nilai untuk mengambil keputusan Untuk menggabungkan banyak kondisi logika. Penjelasan dan penggunaan If Penjelasan dan penggunaan If - else Penjelasan dan penggunaan If di dalam if Penjelasan dan penggunaan If - else if else Penjelasan dan penggunaan komunikasi serial Menghidupkan dan mematikan lampu menggunakan pushbutton Menghidupkan dan mematikan 2 lampu secara bergantian menggunakan 1 pushbutton



14



Pengambilan Keputusan 1. OPERATOR RELASI Untuk membandingkan dua buah nilai kita bisa menggunakan operator relasi. Adapun operator relasi dalam bahasa C dapat dilihat pada Tabel 1. Tabel 1. Operator Relasi Operator == > < >= TRUE X != 2 --> FALSE X>1 --> TRUE X FALSE X TRUE X != 5 --> TRUE 2. Operator Logika Operator logika digunakan untuk menggabungkan banyak kondisi logika yaitu kondisi TRUE dan kondisi FALSE. Operator logika dapat digunakan di dalam if jika menggunakan 2 kondisi atau lebih. Jenis operator logika dalam bahasa C adalah sebagai berikut: Tabel 2. Operator Logika contoh Nama Operator (simbol) x && y And (&&) y || y Or (||) !y Not (!) Contoh : TRUE && TRUE TRUE && FALSE TRUE || FALSE !(TRUE && TRUE) FALSE || FALSE



--> TRUE --> FALSE --> TRUE --> FALSE --> FALSE



Copyright (c) 2016 Kedai Techno



Keterangan True jika x dan y bernilai true True jika salah satu dari x atau y bernilai true True jika nilai dari y adalah tidak true (bernilai kebalikan atau merubah true menjadi false)



15



3. Pernyataan if int val = 51; If (val > 50){ // kondisi terpenuhi, perintah di dalam if di eksekusi digitalWrite(12,HIGH); }



If digunakan dalam pengambilan keputusan, jika kondisi yang diinginkan terpenuhi maka perintah yang berada di dalam kurung kurawal akan dieksekusi. Pada contoh diatas jika nilai dalam variabel val lebih besar daripada 50, maka pin D12 menjadi HIGH 4. Pernyataan if-else int val = 49; if (val > 50){ //kondisi tidak terpenuhi digitalWrite(12,HIGH); } else { // perintah di dalam else di eksekusi digitalWrite(12,LOW); }



If - else digunakan bila ada kondisi selain dari if, misalnya pada contoh diatas, jika nilai dalam variabel val lebih besar daripada 50 makan pin D12 menjadi HIGH, lalu untuk elsenya adalah kondisi selain if, jika nilai dalam variabel value lebih kecil atau sama dengan 50 makan pin D12 menjadi LOW. 5. Pernyataan If di dalam if (nested if) if (val > 50){ If (val2 < 90){ digitalWrite(12,HIGH); } } else { digitalWrite(12,LOW); }



If di dalam if digunakan bila untuk mengecek / validasi berganda, atau untuk mencapai 2 kondisi yang berbeda secara bertahap. Contoh diatas adalah jika variabel val bernilai lebih dari 50, lalu melakukan if lagi, jika val2 bernilai kurang dari 90, maka pin D12 menjadi HIGH. Jika kondisinya tidak tepenuhi maka eksekusi else yaitu pin D12 menjadi LOW.



Copyright (c) 2016 Kedai Techno



16



6. Pernyataan If -else if - else if (val >= 50 && val =< 100){ digitalWrite(12,HIGH); } else if (val < 50 && val > 0){ digitalWrite(13,HIGH) } else { digitalWrite(12,LOW); digitalWrite(13,LOW); }



If - else if - else digunakan jika terdapat banyak kondisi. Pada contoh diatas jika val bernilai 50 sampai 100 maka pin 12 bernilai HIGH, jika val bernilai 1 sampai 49 maka pin 13 bernilai HIGH, pada kondisi selain dari itu maka pin 12 dan 13 bernilai LOW. 7. Komunikasi Serial Komunikasi serial digunakan untuk berkomunikasi dengan mikrokontroler, komunikasi serial sangat berguna untuk memberikan informasi apa yang sedang dikerjakan oleh mikrokontroler. Lewat komunikasi serial kita juga dapat memberikan perintah kepada mikrokontroler pada saat beroperasi. Berikut contoh komunikasi serial. void setup() { // memulai komunikasi serial dengan baud rate 9600 serial.begin(9600); serial.print(“Booting Arduino”); serial.print(“...............”); delay(1000); serial.println(“booting selesai”); } void loop() { serial.println(“looping”); delay(1000); }



Penjelasan :  serial.begin(9600)  serial.print  serial.println



: memulai komunikasi serial dengan baud rate 9600 : print / cetak tulisan yang diinginkan : cetak tulisan sekaligus cetak enter setelah menulis tulisan



Setelah mengupload sketch diatas, buka serial monitor, icon pada pojok kanan atas arduino IDE



Copyright (c) 2016 Kedai Techno



17



Gambar 1. Membuka Serial monitor Setelah terbuka, pastikan baud ratenya sesuai dengan yang ada di sketch yang diupload



Copyright (c) 2016 Kedai Techno



18



Job 1 Digital Input Pullup Schematic



D13 - resistor 220ohm - LED - GND D2 - pushbutton - GND



Copyright (c) 2016 Kedai Techno



Praktikum



19



KODE PROGRAM void setup() { pinMode(2, INPUT_PULLUP); // setting sebagai pull up resistor pinMode(13, OUTPUT); // pin LED, setting sebagai OUTPUT } void loop() { int tombol= digitalRead(2); delay(50); //INPUT_PULLUP menjadikan kondisi awal pin menjadi HIGH // jika tombol di tekan maka kondisi pin menjadi LOW if (tombol== HIGH) { // jika tombol dilepas, lampu menjadi mati digitalWrite(13, LOW); } else { //jika tombol ditekan, lampu menjadi hidup digitalWrite(13, HIGH); } }



Komunikasi serial Serial print void setup() { Serial.begin(9600); pinMode(2, INPUT_PULLUP); // setting sebagai pull up resistor pinMode(13, OUTPUT); } void loop() {



}



int tombol= digitalRead(2); delay(50); if (tombol== HIGH) { digitalWrite(13, LOW); Serial.println("lampu mati"); delay(50); } else { digitalWrite(13, HIGH); Serial.println("lampu Hidup"); delay(50); }



Copyright (c) 2016 Kedai Techno



20



Job 2 Kendali 2 lampu Skema



D5 - R1 - LED1 -GND D6 - R2 - LED2 - GND



Copyright (c) 2016 Kedai Techno



21



Kode PROGRAM int led1 = 13; int val = 0; void setup() { //mulai komunikasi serial Serial.begin(9600);



}



//jadikan pin2 sebagai pullup pinMode(2, INPUT_PULLUP); pinMode(led1, OUTPUT);



void loop() { //baca nilai pushbutton int sensorVal = digitalRead(2); //print nilai sensorVal pada komunikasi serial Serial.println(sensorVal); // harus diingat, pada digitalpullup, logikanya terbalik // ketika tombol ditekan maka bernilai LOW // ketika tidak ditekan makan nilainya HIGH



}



if (sensorVal == LOW) { if (val == 0){ digitalWrite(led1, HIGH); Serial.println(“lampu hidup”); }else if (val == 1){ digitalWrite(led1, LOW); Serial.println(“lampu mati”); } val = val + 1; if (val > 1) { val = 0; } } delay(500);



Tugas : 1. Gunakan 3 lampu LED 2. Hidupkan secara bergantian menggunakan pushbutton a) Tekan 1 kali lampu 1 hidup b) Tekan 2 kali lampu 2 hidup c) Tekan 3 kali lampu 3 hidup d) Tekan 4 kali semua lampu mati



Copyright (c) 2016 Kedai Techno



22



Modul 3 Pertemuan ke-



Materi



Teori 3 Praktik



1



Analog Vs Digital, ADC dan PWM



2



Perulangan (Looping)



1



ADC



2



PWM



Copyright (c) 2016 Kedai Techno



Deskripsi Materi Analog Vs Digital ADC (Analog Digital Converter) PWM (Pulse Width Modulation) Looping For Looping While Memonitor nilai dari potensiometer Mengontrol nyala led menggunakan PWM, bisa terang, dan redup, atau mati



23



4. Analog Vs Digital, ADC & PWM 1.4. Analog Vs Digital



1.5. Analog Digital Converter (ADC) Analog Digital Converter (ADC) merupakan sistem pengubahan sinyal analog menjadi sinyal digital. 2 karakter prinsip yang dimiliki ADC yaitu kecepatan sampling dan kecepatan resolusi. pada Arduino Nano 3.0 yang menggunakan mikrokontroler ATmega328 keluaran Atmel bisa menggunakan resolusi ADC 10 bit . Cara konversi perhitungan nilai input tegangan ke bilangan biner dapat kita gunakan persamaan 1.1 sebagai berikut : x



Vin R Vref



dimana : x=nilai input pin ADC yang terbaca Vin = tegangan input Vref = tegangan referensi R= nilai resolusi dari ADC



Copyright (c) 2016 Kedai Techno



(1.1)



24



Sebagai contoh kita ingin mengetahui berapa nilai input pin adc yang terbaca jika Vin sebesar 3 v dengan tegangan referensi sebesar 5 v dan nilai resolusi ADC 1023 (10bit). Diketahui : Vin = 3v Vref= 5v R=1023 Nilai input pin ADC yang terbaca (x)? x



Vin R Vref



x



3 x1023 5



x  614



Jika kita ingin mengubah nilai 614 (yang merupakan nilai desimal) menjadi nilai biner maka cara perhitungannya. 614  307 sisa 0 2 307  153 2



sisa 1



153  76 2



sisa 1



76  38 2



sisa 0



38  19 2



sisa 0



19 9 2



sisa 1



9 4 2



sisa 1



4 2 2



sisa 0



2 1 2



sisa 0



1 0 2



sisa 1



Copyright (c) 2016 Kedai Techno



25



Jadi bilangan binernya 1001 1001 10 1.6. Pulse Width Modulation (PWM) Seperti kita ketahui bahwa nilai tegangan output pada Arduino Nano 3.0 bisa bernilai 5V (HIGH) atau 0v (Low). namun jika kita hendak mengatur besar nilai tegangan output menjadi 1,2 atau 3v ( rentang nilai diantara 0-5 v ) maka kita bisa menggunakan teknik PWM (Pulse Width Modulation). Parameter yang dapat diatur pada PWM adalah periode & lebar pulsa, sedangkan untuk mengatur besarnya tegangan yang diinginkan kita bisa mengatur besarnya duty cycle. duty cycle merupakan persentase nilai lebar pulsa dalam satu periode gelombang.



Sedangkan untuk mencari nilai dari Duty Cycle kita bisa menggunakan persamaan 1.2 dibawah ini D



tHIGH  100% ttotal



(1.2)



Keterangan: D



= Duty cycle



tHIGH = waktu pada saat keadaan HIGH (lebar pulsa) Ttotal = total waktu dalam satu gelombang (periode) Untuk memahami lagi tentang duty cycle bisa kita lihat pada Gambar 2 dibawah ini :



Copyright (c) 2016 Kedai Techno



26



Gambar 2 Ilustrasi duty cycle 0%, 100% & 50% Pada gambar diatas terlihat jika duty cyclce 0% maka nilai tegangan yang keluar 0v sedangkan pada duty cycle 100% tegangan keluarannya sebesar 5v (HIGH) dan jika duty cycle sebesar 50% maka tegangan keluarannya sebesar 2,5v.



Copyright (c) 2016 Kedai Techno



27



5. Looping (perulangan) for & while 2.3. Looping for “For” dalam bahasa C merupakan fungsi atau kontrol untuk pengulangan sampai dengan batas yang ditentukan. for ( init; condition; increment ) { statement(s); } Keterangan kode:



 Init : inisialisasi batas awal pengulangan  Condition : kondisi pengulangan yang akan ditentukan  Increment : pengaturan penambahan nilai pada variable Lebih jelasnya dapat dilihat pada contih berikut ini. for ( int i = 0; i Example > RTClib > ds3231 // Date and time functions using a DS3231 RTC connected via I2C and Wire lib #include #include "RTClib.h" RTC_DS3231 rtc;



Copyright (c) 2016 Kedai Techno



48



char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"}; void setup () { #ifndef ESP8266 while (!Serial); // for Leonardo/Micro/Zero #endif Serial.begin(9600); delay(3000); // wait for console opening if (! rtc.begin()) { Serial.println("Couldn't find RTC"); while (1); } if (rtc.lostPower()) { Serial.println("RTC lost power, lets set the time!"); // following line sets the RTC to the date & time this sketch was compiled rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); // This line sets the RTC with an explicit date & time, for example to set // January 21, 2014 at 3am you would call: // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0)); } } void loop () { DateTime now = rtc.now();



Copyright (c) 2016 Kedai Techno



49



Serial.print(now.year(), DEC); Serial.print('/'); Serial.print(now.month(), DEC); Serial.print('/'); Serial.print(now.day(), DEC); Serial.print(" ("); Serial.print(daysOfTheWeek[now.dayOfTheWeek()]); Serial.print(") "); Serial.print(now.hour(), DEC); Serial.print(':'); Serial.print(now.minute(), DEC); Serial.print(':'); Serial.print(now.second(), DEC); Serial.println(); Serial.print(" since midnight 1/1/1970 = "); Serial.print(now.unixtime()); Serial.print("s = "); Serial.print(now.unixtime() / 86400L); Serial.println("d"); // calculate a date which is 7 days and 30 seconds into the future DateTime future (now + TimeSpan(7,12,30,6)); Serial.print(" now + 7d + 30s: "); Serial.print(future.year(), DEC); Serial.print('/'); Serial.print(future.month(), DEC); Serial.print('/'); Serial.print(future.day(), DEC); Serial.print(' '); Serial.print(future.hour(), DEC); Copyright (c) 2016 Kedai Techno



50



Serial.print(':'); Serial.print(future.minute(), DEC); Serial.print(':'); Serial.print(future.second(), DEC); Serial.println(); Serial.println(); delay(3000); } Task : 1. Tampilkan jarak dari sensor ultrasonik ke LCD 2. Tampilkan jam dari rtc ke LCD 3. Tampilkan jarak dan jam ke LCD



Copyright (c) 2016 Kedai Techno



51



Modul 6



Pertemuan ke-



Materi Teori



3 Praktik



1 2 3



Interupsi Komunikasi I2C Array



1



Interupsi



2



Komunikasi I2C



3



Array



Copyright (c) 2016 Kedai Techno



Deskripsi Materi Interupsi pada arduino I2C pada arduino Array pada pemrograman Arduino (C) Interupsi eksternal menggunakan pushbutton Mengkomunikasikan 2 arduino, 1 menjadi slave, 1 menjadi master Contoh penggunaaan array



52



1. Interupsi (Interrupts) Pada tingkat sederhana, interupsi adalah sebuah sinyal yang mengiterupsi proses yang sedang berlangsung pada prosesor. Interupsi dapat dipicu oleh perubahan faktor eksternal (seperti perubahan status pada pin input) atau juga faktor internal (seperti timer atau juga software signal). Pada saat dipicu, interupsi menghentikan sementara proses yang sedang berlangsung dan menyebabkan program untuk mengeksekusi perintah atau fungsi lain. Pada saat fungsinya selesai dilakukan, maka program akan kembali bekerja seperti semula. Pada Arduino Uno, Nano, Mini atau yang berbasis atmega328 pin interupsi terdapat pada pin 2 dan 3. Untuk arduino yang lain, dapat kita lihat pada tabel berikut. Board Pin Interupsi Uno, Nano, Mini, dan 328-based 2, 3 Mega, Mega2560, MegaADK 2, 3, 18, 19, 20, 21 Micro, Leonardo, dan 32u4-based 0, 1, 2, 3, 7 Zero semua pin digital, kecuali 4 MKR1000 Rev.1 0, 1, 4, 5, 6, 7, 8, 9, A1, A2 Due Semua pin digital 101 Semua pin digital Penjelasan sintaks lebih https://www.arduino.cc/en/Reference/AttachInterrupt 2. Komunikasi I2C



lanjut



di



Inter-Integrated Circuit atau sering disebut I2C adalah standar komunikasi serial dua arah menggunakan dua saluran yang didisain khusus untuk mengirim maupun menerima data. Sistem I2C terdiri dari saluran SCL (Serial Clock) dan SDA (Serial Data) yang membawa informasi data antara I2C dengan pengontrolnya. Piranti yang dihubungkan dengan sistem I2C Bus dapat dioperasikan sebagai Master dan Slave. Master adalah piranti yang memulai transfer data pada I2C Bus dengan membentuk sinyal Start, mengakhiri transfer data dengan membentuk sinyal Stop, dan membangkitkan sinyal clock. Slave adalah piranti yang dialamati master. Sinyal Start merupakan sinyal untuk memulai semua perintah, didefinisikan sebagai perubahan tegangan SDA dari “1” menjadi “0” pada saat SCL “1”. Sinyal Stop merupakan sinyal untuk mengakhiri semua perintah, didefinisikan sebagai perubahan tegangan SDA dari “0” menjadi “1” pada saat SCL “1”. Sinyal dasar yang lain dalam I2C Bus adalah sinyal acknowledge yang disimbolkan dengan ACK Setelah transfer data oleh master berhasil diterima slave, slave akan menjawabnya dengan mengirim sinyal acknowledge, yaitu dengan membuat SDA menjadi “0” selama siklus clock ke 9. Ini menunjukkan bahwa Slave telah menerima 8 bit data dari Master.



Copyright (c) 2016 Kedai Techno



53



Pada arduino, komunikasi I2C telah dibuat library nya, yaitu “Wire Library”. Library ini mampu membuat arduino berkomunikasi dengan perangkat I2C. Pada arduino Uno dan Nano, pin I2C terdapat pada A4 (SDA) dan A5 (SCL) 3. Array Array (larik) merupakan suatu variabel yang merepresentasikan daftar (list) atau kumpulan data yang memiliki tipe data sama. Array merupakan konsep yang penting dalam pemrograman, karna array memungkinkan kita untuk menyimpan data dalam jumlah banyak dan terindeks. Misalkan ada kumpulan data bertipe int yaitu angka 1, 2, 3, 4, dan 5. Kumpulan data ini dapat disajikan dalam bentuk Array karena memiliki tipe data yang sama yaitu Int. Misal kumpulan data tadi kita beri nama Angka sehingga jika disajikan dalam bentuk array akan menjadi Int Angka[]={1, 2, 3, 4, 5} atau Int Angka[5]={1, 2, 3, 4, 5}. Pada sebuah array, index array dimulai dari indeks ke-0, sehingga pada array Angka[], angka 1 berada di indeks ke-0 (Array[0]), angka 2 berada di indeks ke-1 (Array[1]), dan seterusnya. Sedangkan pada pendeklarasian Array, Int Angka [5] berarti Array Angka dapat menampung 5 masukan nilai Int. Tabel penjelasan array Angka[5] = {1,2,3,4,5} Indeks array Angka[0] (variabel Angka indeks ke 0) Angka[1] (variabel Angka indeks ke 1) Angka[2] (variabel Angka indeks ke 2) Angka[3] (variabel Angka indeks ke 3) Angka[4] (variabel Angka indeks ke 4)



Copyright (c) 2016 Kedai Techno



Nilai 1 2 3 4 5



54



Praktikum JOB 1 - Interupsi Skema



Kode Program



const byte ledPin = 13; //pin 13 sebagai pinled const byte interruptPin = 2; //pin 2 sebagai pin interup volatile byte state = LOW; void setup() { pinMode(ledPin, OUTPUT); // mode input pullup, pada saat terbuka (tombol tidak ditekan), bernilai HIGH, pinMode(interruptPin, INPUT_PULLUP); // pasang interup pada pin 2, // pemicunya CHANGE yaitu perubahan nilai LOW/HIGH pada pin/tombol



Copyright (c) 2016 Kedai Techno



55



// lalu eksekusi fungsi blink ketika pemicu terjadi attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE); } void loop() { digitalWrite(ledPin, state); } void blink() { state = !state; }



Task : 1. Ubah CHANGE menjadi FALLING, dan RISING 2. Tambahkan komunikasi serial, lalu berikan keterangan state lewat serial pada saat state berubah JOB 2 - I2C Skema



Copyright (c) 2016 Kedai Techno



56



Kode Program untuk Master (Arduino 1) // Wire Master Writer // by Nicholas Zambetti // Demonstrates use of the Wire library // Writes data to an I2C/TWI slave device // Refer to the "Wire Slave Receiver" example for use with this // Created 29 March 2006 // This example code is in the public domain.



#include void setup() { Wire.begin(); // join i2c bus (address optional for master) } byte x = 0;



Copyright (c) 2016 Kedai Techno



57



void loop() { Wire.beginTransmission(8); // transmit to device #8 Wire.write("suti"); // sends five bytes //Wire.write(x); // sends one byte Wire.endTransmission(); // stop transmitting //



x++; delay(500);



}



Kode Program untuk Slave (Arduino 2) // Wire Slave Receiver // by Nicholas Zambetti // Demonstrates use of the Wire library // Receives data as an I2C/TWI slave device // Refer to the "Wire Master Writer" example for use with this // Created 29 March 2006 // This example code is in the public domain.



#include void setup() { Wire.begin(8); // join i2c bus with address #8 Wire.onReceive(receiveEvent); // register event Serial.begin(9600); // start serial for output } void loop() { delay(100); }



// function that executes whenever data is received from master // this function is registered as an event, see setup() void receiveEvent(int howMany) { while (1 < Wire.available()) { // loop through all but the last char c = Wire.read(); // receive byte as a character Serial.print(c); // print the character } int x = Wire.read(); // receive byte as an integer Serial.println(x); // print the integer



JOB 3 - ARRAY int angka[5] = {1, 2, 3, 4, 5};



Copyright (c) 2016 Kedai Techno



58



int i = 0; void setup() { Serial.begin(9600); } void loop() { if (i < 5) { Serial.print("Variabel angka indeks ke "); Serial.print(i); Serial.print(" adalah "); Serial.println(angka[i]); i++; } if (i == 5) { i = 0; } delay(1000); }



Task : 1. panggil urutan array secara berurutan mulai dari yang terbesar (indeks ke 4) ke yang paling kecil (indeks 0)



Copyright (c) 2016 Kedai Techno