Teknik Kawalan Output Digital PWM
Frequency = time to complete 1 cyclevoltage(v)3.3V1 period, tDuty Cycle = ON time for 1 cycle in %50% DC 75% DCDC 100% ? DC 75% ?time(s)50100× 3.3? = 1.65?75100× 3.3? = 2.475?100100× 3.3? = 3.3?Teknik Kawalan Output Digital PWM
Pemasangan Arduino IDEArduino Integrated Development Environment (IDE) ialahperisian open source, direka untuk memudahkan prosespengaturcaraan mikropengawal Arduino.Ia menyediakan interface mesra untuk menulis, menyusun(compile), dan memuat naik kod, membolehkan pengguna membinaprojek elektronik interaktif dengan mudah.Klik untuk muat turun Arduino 2.3.6 untuk WindowsKlik untuk muat turun Arduino 2.3.6 untuk Windows
Sahkan Pemasangan Pemacu (Driver)1. Klik bar carian dan taip “Device Manager.”2. Buka Device Manager.3. Kembangkan bahagian “Ports (COM & LPT)”.4. Cari label seperti “Arduino Uno (COMx)”.5. Jika ia tidak muncul, pemacu (driver) perludipasang.6. Pemasangan pemacu tidak diperlukan jikaArduino Uno adalah asli (genuine).
Kelebihan Arduino IDEFeature Arduino IDE 2.x Arduino IDE 1.x (Legacy)User Interface Modern, responsive UI built with Theia and Electron; includessidebar navigation, dark mode, and high-DPI support.Classic Java-based UI; minimalistic and lightweight.Code EditingOffers code autocompletion, syntax highlighting, and real-timeerror detection; features like \"Go to Definition\" and hover-overtooltips enhance code navigation.Basic text editor with syntax highlighting; lacks advanced codenavigation features.Serial Monitor & PlotterIntegrated into the main window; allows simultaneous viewing ofcode and serial output; includes a Serial Plotter for real-time datavisualization.Separate Serial Monitor window; lacks integrated Serial Plotter.Library & Board ManagementEnhanced Library and Board Managers with improved search andinstallation processes; better support for third-party boards andlibraries.Basic Library and Board Managers with limited searchcapabilities.Cloud Integration Seamless integration with Arduino Cloud; allows syncing sketchesacross devices and collaboration.No cloud integration features.Performance & StabilityFaster compilation times and more stable performance, especiallyfor larger projects; regular updates and active maintenance.Stable for small projects; may experience slower compilationtimes; minimal updates as it's no longer actively maintained.
Menyediakan board ESP32 1. Buka perisian Arduino IDE2. Klik File > Preferences dan taip pada bahagian AdditionalBoard Manager:https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json
Menyediakan board ESP32 3. Klik ikon Boards Manager.
Menyediakan board ESP32 4. Taip esp32 dan pasang versi terkini.Selepaspemasangan, sambungkan USB ke ESP32.5. Walau bagaimanapun, selepas pemasangan,Arduino IDE masih tidak mengenal pastiperkakasan (port) kerana pemacu (driver)belum dipasang.12
Pemasangan Pemacu USB• Pemacu CP2102 atau CH340 mesti dipasang kerana iamembolehkan komunikasi antara komputer dan mikropengawalmelalui USB dengan mewujudkan port COM maya.Untuk memuatturun pemacu tersebut, klik pautan di bawah:Klik untuk muat turun CH340Klik untuk muat turun CH340Klik untuk muat turun CP21xxKlik untuk muat turun CP21xx
Menguji kefungsian ESP32• Ubah jenis board kepada ESP32 Dev Module dan nombor portmengikut kesesuaian.
Menguji ESP32• Buat pendawaian mengikut skematik berikut:
Menguji ESP32• Tulis & upload aturcara untuk membuat kerlipan LED 1 Hz.void setup(){ pinMode(15,OUTPUT); }void loop(){ digitalWrite(15,HIGH); delay(1000); digitalWrite(15,LOW); delay(1000); }Bagaimana membuat kerlipan untuk 5 Hz?? =??=?????= ?????
Macro Constant• Menjadikan kod lebih mudah dibaca dan difahami• Memudahkan proses penyelenggaraan kod• Mengurangkan risiko kesilapan pengaturcaraan• Tidak menggunakan ruang memori semasa atur cara dijalankan#define led1 15void setup(){ pinMode(led1,OUTPUT);}void loop(){ digitalWrite(led1,HIGH);delay(200);digitalWrite(led1,LOW);delay(200);}
Function• Kaedah ini dikenali sebagai void function withno parameters.• Kod ini menggunakan subrutin jenis void tanpaargument, iaitu fungsi yang tidak menerimasebarang data masuk dan tidak memulangkansebarang nilai return.• Subrutin ini digunakan untuk melaksanakantugas tertentu berulang kali, dalam kes ini,mengawal nyalaan LED secara berkelip.#define led1 15void setup(){ pinMode(led1,OUTPUT);}void loop(){ kelip();}void kelip(){ digitalWrite(led1,HIGH);delay(200);digitalWrite(led1,LOW);delay(200);}
8-bit LED• Tambah komponen mengikut litar diberi. LED8 LED1
8-bit LED• Tambah komponen mengikut litar diberi.LED1 LED8Periksa continuity breadboard anda
Latihan 8-bit LED1. Buat kerlipan LED 8-bit pada frekuensi 5 Hz.2. Hasilkan corak kerlipan LED frekuensi 20 Hz ke arah kanan.3. Seterusnya, hasilkan corak kerlipan yang sama ke arah kiri.
Macro Definition• Kepentingan macro definition dalam pengaturcaraan:• Memendekkan kod yang berulang • Mengurangkan risiko kecuaian penulisan• Menambah kejelasan dan kebolehbacaan kod• Membolehkan pengurusan kod yang lebih sistematik• Digunakan meluas dalam sistem terbenam dan header files• Prestasi lebih baik untuk operasi ringkas
Macro Definition#define led1 15 #define led2 2 #define led3 4 #define led4 16 #define led5 17 #define led6 5 #define led7 18 #define led8 19 #define LED2(x) digitalWrite(led2, x? HIGH:LOW) #define LED3(x) digitalWrite(led3, x? HIGH:LOW) #define LED4(x) digitalWrite(led4, x? HIGH:LOW) #define LED5(x) digitalWrite(led5, x? HIGH:LOW) #define LED6(x) digitalWrite(led6, x? HIGH:LOW) #define LED7(x) digitalWrite(led7, x? HIGH:LOW) #define LED8(x) digitalWrite(led8, x? HIGH:LOW) …#define LED1(x) digitalWrite(led1, x? HIGH:LOW)#define led1 15#define led2 2#define led3 4#define led4 16#define led5 17#define led6 5#define led7 18#define led8 19#define LED1(x) digitalWrite(led1, x? HIGH:LOW)#define LED2(x) digitalWrite(led2, x? HIGH:LOW)#define LED3(x) digitalWrite(led3, x? HIGH:LOW)#define LED4(x) digitalWrite(led4, x? HIGH:LOW)#define LED5(x) digitalWrite(led5, x? HIGH:LOW)#define LED6(x) digitalWrite(led6, x? HIGH:LOW)#define LED7(x) digitalWrite(led7, x? HIGH:LOW)#define LED8(x) digitalWrite(led8, x? HIGH:LOW)…void loop() { kelip(); }{ LED8(0); LED1(1); delay(50); LED1(0); LED2(1); delay(50); LED2(0); LED3(1); delay(50); LED3(0); LED4(1); delay(50); LED4(0); LED5(1); delay(50); LED5(0); LED6(1); delay(50); LED6(0); LED7(1); delay(50); LED7(0); LED8(1); delay(50); LED1(0); LED8(1); delay(50); LED8(0); LED7(1); delay(50); LED7(0); LED6(1); delay(50); LED6(0); LED5(1); delay(50); LED5(0); LED4(1); delay(50); LED4(0); LED3(1); delay(50); LED3(0); LED2(1); delay(50); LED2(0); LED1(1); delay(50); }void kelip()void loop(){ kelip();}void kelip(){ LED8(0); LED1(1); delay(50);LED1(0); LED2(1); delay(50);LED2(0); LED3(1); delay(50);LED3(0); LED4(1); delay(50);LED4(0); LED5(1); delay(50);LED5(0); LED6(1); delay(50);LED6(0); LED7(1); delay(50);LED7(0); LED8(1); delay(50);LED1(0); LED8(1); delay(50);LED8(0); LED7(1); delay(50);LED7(0); LED6(1); delay(50);LED6(0); LED5(1); delay(50);LED5(0); LED4(1); delay(50);LED4(0); LED3(1); delay(50);LED3(0); LED2(1); delay(50);LED2(0); LED1(1); delay(50);}
Data type dalam pengaturcaraan C• Menentukan jenis nilai yang disimpan (nombor, aksara, dll.)• Menentukan saiz memori yang digunakan• Menentukan operasi yang sah terhadap sesuatu nilai
Jenis Data Type Umum dalam CJenis Keterangan Contohint Nombor bulat int suhu = 25;char Aksara tunggal char huruf = 'A';float Nombor perpuluhan float suhu = 23.5;double Nombor perpuluhan lebih tepat double pi = 3.1416;bool Nilai logik true/false bool status = true;
Keperluan Data Type Khusus• Di dalam embedded system, data type perlu khusus kerana:• Penggunaan memori yang terhad• Prestasi pemprosesan• Keserasian perkakasan• Kejelasan dan kebolehbacaan kod
Keperluan Data Type KhususJenis Saiz Julat Nilai Guna Untukuint8_t 8 bit 0 hingga 255 Data binari, kawalan portint8_t 8 bit -128 hingga 127 Nombor bulat keciluint16_t 16 bit 0 hingga 65535 Counter, masa, sensorint16_t 16 bit -32,768 hingga 32,767uint32_t 32 bit 0 hingga ~4 bilion Pengiraan besarint32_t 32 bit Negatif dan positif besarfloat 32 bit Perpuluhan, jarang digunakan jika tiada FPU
Asas Control Structure: FOR• FOR digunakan untuk melaksanakan pengulangan berdasarkankiraan tertentu.• Sintaks umum:• Contoh for Loop:for (inisialisasi; syarat; kemaskini) {// blok arahan}for (int i = 0; i < 5; i++) {printf(\"Ulangan ke-%d\\", i);}Ulangan ke-0Ulangan ke-1Ulangan ke-2Ulangan ke-3Ulangan ke-4
Mengawal kerlipan LED: FOR• Buat kerlipan LED running light sebanyak 2 turutan. Setelah itu, lengahan masa sebanyak 3 saat sebelum mengulangi aturcara.…void loop() { for(uint8_t i=0;i<2;i++) { kelip(); }LED1(0); delay(3000); }……void loop(){ for(uint8_t i=0;i<2;i++){kelip();}LED1(0);delay(3000);}……void loop() { for(uint8_t i=0;i<2;i++) kelip(); LED1(0); delay(3000); }……void loop(){ for(uint8_t i=0;i<2;i++)kelip();LED1(0);delay(3000);}…Bagaimanakah cara untuk menghentikankitaran pengulangan loop()?
Asas Control Structure: WHILE• Digunakan untuk melaksanakan pengulangan berdasarkan syaratlogik yang diuji sebelum setiap kitaran ulangan.• Ciri-ciri:• Syarat diuji sebelum arahan dalam blok dijalankan.• Jika syarat tidak benar sejak awal, kod dalam blok tidak akandilaksanakan.• Sintaks umum:while (syarat) {// Arahan diulang selagi syarat benar}
Penggunaan while(1)• Digunakan untuk mencipta gelung infiniti yang membolehkansistem terus berjalan tanpa henti, seperti:• Membaca sensor secara berterusan (polling)• Menangani input pengguna• Menjalankan tugasan utama dalam program• Kenapa tidak guna FOR?• FOR lebih sesuai untuk pengulangan dengan bilangan tertentu• while(1) lebih sesuai untuk loop tanpa syarat tamat, iaitu sistem terusdilaksanakan selagi kuasa dibekalkan atau arahan BREAK diberi.
Mengawal kerlipan LED: WHILE• Buat kerlipan LED running light sebanyak 2 turutan. Setelah itu, LED1 berkelip dengan frekuensi 5Hz.…void loop() { for(uint8_t i=0;i<2;i++) kelip(); LED1(0); { LED1(1); delay(200); LED1(0); delay(200); }}… while(1)…void loop(){ for(uint8_t i=0;i<2;i++)kelip();LED1(0);while(1){ LED1(1); delay(200);LED1(0); delay(200);}}…3∞
Active Buzzer VS Passive Buzzer• Active Buzzer• Buzzer yang menghasilkan bunyi sendiri apabila dibekalkan voltan(biasanya 3.3V atau 5V).• Mempunyai oscillator dalaman, jadi hanya perlu HIGH/LOW signal.• Passive Buzzer• Tidak mempunyai oscillator dalaman.• Memerlukan isyarat frekuensi (PWM) untuk hasilkan bunyi.• Menghasilkan pelbagai bunyi bergantung kepada frekuensi diberikan.
Buzzer dalam aturcaraCiri Active Buzzer Passive BuzzerCara Kawalan digitalWrite(pin, HIGH/LOW) tone(pin, freq) atau PWMFleksibiliti Bunyi Hanya satu nada tetap Boleh hasilkan pelbagai frekuensi/nadaKegunaan Mudah, sesuai untuk notifikasi ringkas Sesuai untuk main melodi atau bunyi kompleksContoh Kod (Arduino) digitalWrite(buzzerPin, HIGH); tone(buzzerPin, 1000); // 1kHz toneKeperluan PWM Tidak perlu Perlu (tone atau analogWrite/frekuensi PWM)Bunyi tanpa Kod Ya (hanya sambung +V) Tidak, perlu kod PWM
Buzzer dalam aturcara• Tambah active buzzer mengikut litar diberi. LED8 LED1
Buzzer dalam aturcara• Tambah active / passive buzzer mengikut litar diberi. LED8 LED1
Buzzer dalam aturcara …#define led8 19 #define buzz 23 void setup() { … pinMode(led4,OUTPUT); pinMode(led8,OUTPUT); pinMode(buzz,OUTPUT); }void loop() { for(uint8_t i=0;i<2;i++) kelip(); LED1(0); tone(buzz,1000); delay(50); noTone(buzz); … ……#define led8 19#define buzz 23…void setup(){ …pinMode(led4,OUTPUT); pinMode(led8,OUTPUT);pinMode(buzz,OUTPUT);}void loop(){ for(uint8_t i=0;i<2;i++)kelip();LED1(0);tone(buzz,1000); delay(50);noTone(buzz);…Dengan menggunakan kaedah function, kawal bilangan dan kadar bunyi buzzer
Function• Kaedah ini dikenali sebagai void functionwith parameters.• Kod ini menggunakan subrutin jenis voiddengan argument, iaitu fungsi yangmenerima data masuk (parameter), tetapitidak memulangkan sebarang nilai (return).• Subrutin ini digunakan untuk melaksanakantugas tertentu secara fleksibel, di mananilai yang dihantar ke dalam fungsi akanmengawal cara fungsi itu bekerja.…void loop() { for(uint8_t i=0;i<2;i++) kelip(); LED1(0); beep(3,50); …}void beep(uint8_t bil, uint16_t tempoh) { for(uint8_t i=0;i<bil;i++) { tone(buzz,1000); delay(tempoh); noTone(buzz); delay(tempoh); }}……void loop(){ for(uint8_t i=0;i<2;i++)kelip();LED1(0);beep(3,50);…}void beep(uint8_t bil, uint16_t tempoh){ for(uint8_t i=0;i<bil;i++){ tone(buzz,1000); delay(tempoh);noTone(buzz); delay(tempoh);}}…
Kawalan voltan tinggi: Relay Module• Modul relay 2-saluran membolehkan mikropengawal mengawallitar voltan tinggi (seperti 240 VAC atau 12 VDC) secaraselamat menggunakan isyarat voltan rendah.• Logik Kawalan:• Logik Rendah (LOW): Relay ON• Logik Tinggi (HIGH): Relay OFF• Mengawal lampu AC, pam air, motor DC, dll.VccIN2IN1GndNONCCOM
Pendawaian Relay ModuleLED8 LED1
Pendawaian Relay Module LED8 LED1
Pengaturcaraan Relay Module…#define buzz 23 #define rly1 13 #define rly2 14 #define LED8(x) digitalWrite(led8, x? HIGH:LOW) #define RLY2(x) digitalWrite(rly2, x? LOW:HIGH) { … pinMode(rly1,OUTPUT); pinMode(rly2,OUTPUT); }…#define RLY1(x) digitalWrite(rly1, x? LOW:HIGH) void setup() …#define buzz 23#define rly1 13#define rly2 14…#define LED8(x) digitalWrite(led8, x? HIGH:LOW)#define RLY1(x) digitalWrite(rly1, x? LOW:HIGH)#define RLY2(x) digitalWrite(rly2, x? LOW:HIGH)void setup(){ …pinMode(rly1,OUTPUT); pinMode(rly2,OUTPUT);}…void loop() { RLY1(1); RLY2(0); for(uint8_t i=0;i<2;i++) kelip(); LED1(0); RLY1(0); RLY2(1); beep(3,50); while(1) { LED1(1); delay(200); LED1(0); delay(200); }}……void loop(){ RLY1(1); RLY2(0);for(uint8_t i=0;i<2;i++)kelip();LED1(0);RLY1(0); RLY2(1);beep(3,50);while(1){ LED1(1); delay(200);LED1(0); delay(200);}}…Kenapa LOW:HIGH??
Mini Projek: Kawalan Lampu Isyarat• Anda dikehendaki membangunkan sistem lampu isyarat menggunakan tigabuah LED untuk mewakili warna:• Lampu Hijau (Jalan)• Menyala selama 7 saat.• Kemudian berkelip selama 3 saat (0.5 saat ON, 0.5 saat OFF) untuk memberi amaran pertukaran.• Lampu Kuning (Bersedia)• Menyala tetap selama 3 saat sebagai amaran pertukaran ke merah.• Lampu Merah (Berhenti)• Menyala selama 7 saat.• Kemudian berkelip selama 3 saat (0.5 saat ON, 0.5 saat OFF) sebelum kembali ke hijau.• Ulangi kitaran secara berterusan.
Hari KeduaPengenalan kepada Blynk
Recap Hari Pertama1. Apakah definisi Internet of Things (IoT)?2. Sebutkan 3 tonggak Revolusi Industri 4.0 (IR4.0) yangberkaitan dengan IoT.3. Bandingkan protokol MQTT dan HTTP dalam IoT.4. Mengapa ESP32 lebih baik daripada ESP8266?5. Apakah fungsi optocoupler dalam kawalan output digital?6. Jelaskan konsep duty cycle dalam PWM.
Konsep Kawalan Digital Input• Pull-down resistor:• Suis terbuka: input pin berada pada LOW• Suis tertutup: input pin menjadi HIGH• Maka, keluarannya adalah active HIGH,isyarat aktif apabila HIGH• Pull-up resistor:• Suis terbuka: input pin berada pada HIGH• Suis tertutup: input pin menjadi LOW• Maka, keluarannya adalah active LOW,isyarat aktif apabila LOWPull-down RESActive HIGH Active LOWPull-up RES
Pendawaian Digital Input ESP32• Buat pendawaian PB berdasarkan kepada gambarajah berikut:Active LOWActive HIGHLED8 LED1
Pendawaian Digital Input ESP32 LED8 LED1PB1 PB2
Pendawaian Digital Input ESP32• Daripada litar, PB1 adalah active LOW. Oleh itu, ia memerlukaninternal pull_up resistor dari ESP32.• Manakala PB2 adalah active HIGH. Ia memerlukan internalpull_down resistor dari ESP32.• Perhatikan deklarasi pada bahagian setup untuk pinMode danbacaan dalam serial monitor bagi aturcara berikut.• PB1: Tak tekan-1 Tekan-0• PB2: Tak tekan-0 Tekan-1
Aturcara Active Low/High…#define rly2 14 #define pb1 27 #define pb2 26 #define RLY2(x) digitalWrite(rly2, x? LOW:HIGH) #define PB2 digitalRead(pb2) { … pinMode(pb1,INPUT_PULLUP); pinMode(pb2,INPUT_PULLDOWN); Serial.begin(9600); }…#define PB1 digitalRead(pb1) void setup() pinMode(rly1,OUTPUT); pinMode(rly2,OUTPUT);…#define rly2 14#define pb1 27#define pb2 26…#define RLY2(x) digitalWrite(rly2, x? LOW:HIGH)#define PB1 digitalRead(pb1)#define PB2 digitalRead(pb2)void setup() { …pinMode(rly1,OUTPUT); pinMode(rly2,OUTPUT);pinMode(pb1,INPUT_PULLUP);pinMode(pb2,INPUT_PULLDOWN);Serial.begin(9600);}void loop() { Serial.print(\"PB1:\"); Serial.print(PB1); Serial.print(\" PB2:\"); Serial.println(PB2); }…void loop(){ Serial.print(\"PB1:\");Serial.print(PB1);Serial.print(\" PB2:\");Serial.println(PB2);}…PB Idle
Formatted Data Handlingvoid loop() { Serial.print(\"PB1:\"); Serial.print(PB1); Serial.print(\" PB2:\"); Serial.println(PB2); }…void loop(){ Serial.print(\"PB1:\");Serial.print(PB1);Serial.print(\" PB2:\");Serial.println(PB2);}…Asas, mudah dibaca, tetapi menghantar output bersiri yang berasingan.Output yang lebih kemas menggunakan pemformatan string dan buffer — lebih sesuai untuk output .char tx2buf[100]; void loop() { sprintf(tx2buf,\"PB1:%d PB2:%d\",PB1,PB2); Serial.println(tx2buf); }char tx2buf[100];void loop(){ sprintf(tx2buf,\"PB1:%d PB2:%d\",PB1,PB2); Serial.println(tx2buf);}
Aturcara PB + LED• Apabila PB1 ditekan secara berterusan, LED bernombor ganjilakan menyala.• Apabila PB2 ditekan secara berterusan, LED bernombor genapakan menyala.• Apabila kedua-dua PB1 dan PB2 berada dalam keadaan tidakditekan (idle), semua LED akan berkelip pada frekuensi 10 Hz.
Aturcara PB + LED …char tx2buf[100]; void loop() { sprintf(tx2buf,\"PB1:%d PB2:%d\",PB1,PB2); Serial.println(tx2buf); { LED1(1); LED3(1); LED5(1); LED7(1); LED2(0); LED4(0); LED6(0); LED8(0); }if(PB2==1) { LED1(0); LED3(0); LED5(0); LED7(0); LED2(1); LED4(1); LED6(1); LED8(1); if(PB1==1 & PB2==0) LED2(0); LED4(0); LED6(0); LED8(0); }… if(PB1==0) …char tx2buf[100];void loop(){ sprintf(tx2buf,\"PB1:%d PB2:%d\",PB1,PB2); Serial.println(tx2buf);if(PB1==0){ LED1(1); LED3(1); LED5(1); LED7(1);LED2(0); LED4(0); LED6(0); LED8(0);}if(PB2==1){ LED1(0); LED3(0); LED5(0); LED7(0);LED2(1); LED4(1); LED6(1); LED8(1);}if(PB1==1 && PB2==0){ LED1(0); LED3(0); LED5(0); LED7(0);LED2(0); LED4(0); LED6(0); LED8(0);}}…PB1 & PB2 IdlePB2 ditekan(Active High)PB1 ditekan(Active Low)
Asas Control Structure: IF• Digunakan untuk melaksanakan sesuatu arahan berdasarkansyarat logik yang ditentukan.• Ciri-ciri:• Syarat diuji terlebih dahulu.• Jika syarat benar, kod dalam blok akan dilaksanakan.• Jika syarat tidak benar, kod dalam blok akan diabaikan.• Sintaks umum:if (syarat) {// arahan jika syarat benar}