Skenario : Ketika tombol ditekan maka LED dan Buzzer akan hidup; LED
7 void setup() {
…..
14 }
Fungsi setup() merupakan salah satu dari 2 fungsi yang wajib ada pada program
Arduino IDE. Variable void merupakan tipe data khusus yang menunjukkan tidak ada data
yang di-return atau yang akan dikembalikan setelah fungsi dieksekusi. Fungsi setup()
hanya dijalan sekali ketika program pertama kali dijalankan. Biasanya fungsi setup() ini
digunakan untuk mengeksekusi baris perintah yang hanya dibutuhkan ketika program
pertama kali dijalankan seperti untuk pengaturan kecepatan data dalam bit per detik
(baud) untuk transmisi data serial) menggunakan fungsi Serial.begin(), pin mode (input
atau Output), menginisialisasi variabel, memulai menggunakan perpustakaan (library),
dll.
8 Serial.begin(115200);
dapat digunakan pada ESP32 sperti 115200, 921600, 25600, 230400, 51200. Nilai
speed padaserial monitor harus di atur sama dengan nilai speed yang telah diatur pada
perintah Serial.begin().
10 Serial.println();
11 pinMode(LED_PIN,OUTPUT);
12 pinMode(BUZZER_PIN,OUTPUT); pinMode(BUTTON_PIN,INPUT);
13
16 Void loop() {
…..
28 }
Fungsi loop() merupakan fungsi kedua dari 2 fungsi yang wajib ada pada
program Arduino IDE. fungsi ini dijalan setah fungsi setup()
dijalankan. Fungsi loop() melakukan persis seperti namanya yaitu melakukan loop
atau perulangan. Fungsi ini melakukan perulangan secara berurutan sehingga
memungkinkan program yang ditulis merespon setiap perubahan yang terjadi pada pin
input dan menghasilkan perubahan pada pin output seperti membaca sinyal atau nilai
yang dibaca oleh pin input, mengolah nilai tersebut dan mengngirimkan sinyal kepada
pin output secara berulang dan terus menerus. Contoh: perintah untuk membaca nilai
digital dari tombol (apakah ditekan atau tidak) setiap saat ditulis pada fungsi loop() ini,
atau untuk menampilkan nilai yang berubah secara realtime pada layar LCD. Juga ditulis
pada fungsi ini.
17 buttonRead= digitalRead(BUTTON_PIN);
Pada baris kode ke 17 ini, dilakukan proses pembacaan nilai pada pin tombol.
Jika tombol ditekan maka perintah digitalRead(pin) akan membaca nilai 1 (HIGH) pada
pin tersebut dan disimpan pada variabel buttonRead dengan nilai 1 (HIGH) pada saat
perulangan pada loop() terjadi. Jika tombol dalam keadaan tidak ditekan maka fungsi
digitalRead(pin) akan akan membaca nilai digital 0 (LOW) dan menyimpannya kedalam
variable buttonRead sehingga nilai pada variable buttonRead berubah menjadi 0 (LOW).
Nilai variabel buttonRead akan di test menggunakan fungsi if(buttonRead == HIGH)
seperti pada baris kode ke-18 untuk mengetahui apakah tombol dalam keadaan
ditekan atau tidak. Jika buttonRead bernilai 1 (HIGH) dan sama dengan (“== ”) HIGH
maka if akan bernilai true. Jika if bernilai true ia akan mengeksekusi baris kode ke-19
hingga 21. Jika sebaliknya, ketika kondisi tombol tidak ditekan maka variable
buttonRead akan bernilai 0 (LOW), maka program akan mengeksekusi perintah yang
terdapat didalam fungsi else ( baris kode ke-23 hingga 26).
Skenario :
1 #define LED 2
2 #define BTN 32
3 #define BUZZER 4
4
5
6 int tempo=300;
7 int twinkleLength=15;
8 char twinkleNotes[]=”cecefggcecefgg”;
9 int twinkleBeats[]={1,1,1,1,1,1,4,1,1,1,1,1,1,4,4};
10
11
12 void setup() {
13 Serial.begin(115200);
14 pinMode(LED,OUTPUT);
15 pinMode(BUZZER,OUTPUT);
16 pinMode(BTN,INPUT);
17
18
19 digitalWrite(LED, LOW);
20 digitalWrite(BUZZER, LOW);
21 digitalWrite(BTN, LOW);
22
23
24 }
25
26
27 void loop() {
28 if(digitalRead(BTN)==1){
29 digitalWrite(LED,HIGH);
30 Serial.println(“Ringtone Gundul Gundul Pacul Dimainkan”);
31 playRingtone(twinkleNotes, twinkleBeats, twinkleLength);
32
33 }else {
34 digitalWrite(LED,LOW);
35 Serial.println(“Ringtone berhenti”);
36 delay(200);
37
38 }
39
40
41 void playRingtone(char notes[], int beats[],int length);
44 }else {
45 playNote(notes[i],beats,[i] *tempo);
}
46
47
}
48
49
}
50
51
52
void playNote(char note,int duration) {
53
chard names[]={‘c’,’d’,’e’,’f’,’g’,’a’,’b’,’c’};
54
int tones[]{1915,1700,1519,1432,1275,1136,1114,956};
55
56
57
for(int i=0;i<8; i++) {
58
59 if(names[i] ==note) {
60 Serial.printf(“Play Note Name=%c, tone=%d, duration =%d \n”, names[i] ,tones[i],
duration[i],playTone(tones[i],duration);
61
}
62
}
63
}
64
void playTone(int tone, int duration) {
65
for(long i =0; i < duration ‘100L; i += tone ‘2);
66
digitalWrite(BUZZER,HIGH);
67
delayMicroseconds(tone);
68
digitalWrite(BUZZER, LOW);
69
delayMicroseconds(tone);
70
}
71
72
}
73
74
Penjelasan skrip program percobaan kedua sebagai berikut :
Pada skenario program kali ini kita akan menjalankan skenario ketika tombol
ditekan maka program akan memutar ringtone pada buzzer pasif dengan nada "Do Re Mi
Fa Sol La Si DO DO Si La Sol Fa Mi Re Do”. Untuk memutar nada tersebut diperlukan variabel
untuk menyimpan tempo, note-note, jumlah total note nada, dan beats dari note nada-
nada tersebut, seperti yang ditunjukkan pada baris kode ke-7 hingga 12.
• int tempo = 300; pada baris kode ke-10 adalah varibel untuk
menyimpan tempo lagunya (cepat lambatnya sebuah lagu). Untuk
melakukan penyesuaian terhadap tempo, maka yang harus kita
lakukan adalah merubah nilai yang ada pada “int tempo” yaitu pada
angka 300. Kita bisa mengubahnya jadi lebih besar atau kecil. Nilai
yang besar akan mempercepat tempo dan nilai yang kecil akan
memperkecil tempo.
• int doremiLength = 15; pada baris kode ke-10 adalah variabel
berjenis integer untuk menyimpan nilai panjang nada
• char doremiNotes [] = "cecefggcecefgg"; pada baris kode ke-11
adalah variabel yang berjenis array yang berisi kumpulan
karakter/char yang menjukkan nada pada tangga lagu.
• int doremiBeats[] = {1, 1, 1, 1, 1, 1, 4, 1, 1, 1, 1, 1, 1, 4, 4}; pada baris
kode ke-12 adalah variable yang bertugas untuk menyimpan data
dalam bentuk array bertipe integer atau kumpulan nilai integer yang
menjukkan jumlah ketukan pada setiap note. Semakin besar angka
ketukannya menujukkan semakin panjang nada bunyinya.
Penyesuaian nada bisa kita lakukan dengan mengubah nilai pada “tones”. Kita bisa
mengganti nilainya sesuai dengan nada yang diinginkan. Karena nilai “tones” dan “names”
berkaitan maka saat kita menggantinya, pastikan untuk menyesuaikan keduanya. Misalkan
tones-nya adalah “1915”, maka names-nya harus “c”. Berikut ini adalah tabel nada yang bisa
kita gunakan.
Jadi, apabila kamu ingin membuat lagu sendiri, maka kamu hanya perlu browsing
untuk mencari informasi tentang nada lagu yang kamu inginkan lalu membuatnya seperti
format tersebut. Pada program ini juga disediakan beberapa contoh nada ringtone lain yang
dapat digunakan seperti:
Di dalam fungsi loop() akan dijalankan perintah untuk membaca kondisi input
tombol seperti pada baris kode ke-34 setiap kali siklus atau loop. Dan pada baris kode ke-35
akan dijalankan perintah if untuk mengecek kondisi apakah tombol ditekan (HIGH) atau
tidak (LOW) dan disimpan pada variable buttonRead. Jika variabel buttonRead
bernilai HIGH maka LED akan dihidupkan dengan perintah digitalWrite(LED_PIN,
HIGH) seperti pada baris kode ke-36. Dan Serial akan menampilkan text “Ringtone
Doremi dimainkan” (baris kode ke-37). Dan selanjutnya akan memanggil dan
menjalankan fungsi playRingtone() untuk memainkan nadaringtone yang di
inputkan padafungsi tersebut. Pada baris kode ke-38 fungsi
playRingtone(doremiNotes, doremiBeats, doremiLength); ini diminta untuk
memainkan nada ringtone “Do Re Mi Fa So La Si Do” dengan mengirim input berupa
doremiNotes, doremiBeats, doremiLength. Sebaliknya, jika variable buttonRead
bernilai selain dari HIGH maka ringtone tidak akan dimainkan setelah ringtone
sebelumnya selesai dimainkan.
33 void loop() {
34 buttonRead = digitalRead(BUTTON_PIN);
35 if(buttonRead== HIGH){
36 digitalWrite(LED_PIN,HIGH);
37 Serial.println("Ringtone Doremi Dimainkan");
38 playRingtone(doremiNotes, doremiBeats, doremiLength);
39 }else{
40 digitalWrite(LED_PIN,LOW);
41 Serial.println("Ringtoneberhenti");
42 delay(200);
43 }
44 }
Fungsi playRingtone(char notes[], int beats[], int length) pada baris kode ke-
46 hingga ke-56 merupakan fungsi yang dibuat untuk memainkan setiap note-note
dan beat-beat setiap note ringtone yang diinputkan pada fungsi playRingtone. Jika
pada baris kode-38 pada fungsi playRingtone() yang diinputkan adalah array note
doremi (doremiNotes) maka pada fungsi playRingtone(char notes[], int beats[], int
length) pada baris kode ke-46 akan melakukan proses perulang sebanyak nilai pada
variabel doremiLength yang di inputkan, dan memanggil serta menjalankan fungsi
playNote(notes[i], beats[i] * tempo); notes[i] merupakan note yang akan dimainkan pada
loop ke-i tersebut, sedangkan beat[i] adalah beat yang akan dimainkan pada loop ke-i
tersebut dan tempo adalah besar tempo yang telah di atur pada baris kode ke-7 sebelumnya.
Baris perintah ke-54 adalah untuk memberikan delay atau jeda selama separuh dari tempo
untuk setiap kali perulangan atau setiap kali suatu nada atau note dimainkan 150 milidetik.
46 void playRingtone(charnotes[], int beats[], int length){
47 for (int i = 0; i < length; i++){
48 if (notes[i] == ' ') {
49 delay(beats[i] * tempo); // jeda jika ada note yang bernilai karakter
50 empty/kosong
51 } else {
52 playNote(notes[i], beats[i] * tempo);
53 }
54 // jeda antar note
55 delay(tempo / 2);
56 }
}
Fungsi playTone(char tone, int duration) ini dibuat memainkan setiap tone dengan
melakukan perulang tone yang yaitu dengan memebrikan perintah kepada BUZZER_PIN
untuk mengirim sinyal HIGH dan diberi delay sebesar tone dan seanjutnya diberi sinyal LOW
dan nilai delay juga sebesar tone.
PENUTUP
5.1 Kesimpulan
Pada percobaan ini menggunakan pin-pin digital dari esp 32 dimana pin
tersebut dipakai sebagai digital input/output. Penggunaan ESP32 ialah supaya
program yang dibuat bisa dikontrol dan bisa diketahui bagaimana alur prosesnya.
Dan jika ingin membuat suatu program atau rangkaian maka terlebih dahulu kita
membuat wiring diagram dari projek yang akan dibuat, untuk memudahkan dalam
merangkai dan membuat skrip programnya. Aplikasi atau software Arduino harus
tersedia di laptop kita lengkap dengan board esp32 nya. Dalam membuat skrip
programnya kita harus tau fungsi yang akan kita gunakan dan kita panggil pada
program tersebut. Skrip progam yang dibuat harus disesuikan dengan pin ESP32
yang dipakai ketika membuat rangkaian program. Apabila salah dalam
menginputkan pin pada skrip program maka, program tidak akan jalan. Untuk itu,
diperlukan ketelitian dalam merangkai dan membuat skrip programnya agar tigak
terjadi kesalahan.
5.2 Saran
4. Pratikan harus lebih teliti dalam merangkai projek yang akan dibuat, untuk
meminimalisir terjadinya kerusakan baik pada alat yang digunakan maupun
diri kita sendiri.
5. Waktu atau timing pratikum diperpanjang lagi, agar memudahkan pratikan
dalam memahami rangkaian dan skrip program yang dibuatnya.