The words you are searching are inside this book. To get more targeted content, please make full-text search by clicking here.

Modul ini merupakan panduan komprehensif yang dibangunkan khusus untuk Program Perkongsian Ilmu: "Hand-On IoT Rekabentuk Sistem Berasaskan ESP32-Blynk Siri 1" Bersama Pelajar Diploma Vokasional Malaysia. Program ini merupakan kolaborasi strategik antara Program Teknologi Elektronik, Kolej Vokasional Batu Pahat dan para pakar daripada Fakulti Pendidikan Teknikal dan Vokasional (FPTV), Universiti Tun Hussein Onn Malaysia (UTHM).

Discover the best professional documents and content resources in AnyFlip Document Base.
Search
Published by KHAIRUIMAN MAHAMUD, 2026-02-27 08:47:03

Modul Hand-On IOT Rekabentuk Sistem Berasaskan ESP32 Blynk

Modul ini merupakan panduan komprehensif yang dibangunkan khusus untuk Program Perkongsian Ilmu: "Hand-On IoT Rekabentuk Sistem Berasaskan ESP32-Blynk Siri 1" Bersama Pelajar Diploma Vokasional Malaysia. Program ini merupakan kolaborasi strategik antara Program Teknologi Elektronik, Kolej Vokasional Batu Pahat dan para pakar daripada Fakulti Pendidikan Teknikal dan Vokasional (FPTV), Universiti Tun Hussein Onn Malaysia (UTHM).

Perbezaan = dan ==• Penggunaan = adalah untuk memberikan (assign) nilai kepadapembolehubah.• Penggunaan == adalah untuk membuat perbandingan, dan hasilnyaadalah dalam bentuk Boolean (TRUE atau FALSE).• Contoh:• x = 5; // Memberikan nilai 5 kepada pembolehubah x • x == 5; // Menyemak sama ada nilai x adalah 5 atau tidak


Rising Edge dan Falling Edge: PB1Idle = PB not pressed PB pressedFalling Edge Rising EdgeStill pressing PBHow to detect all button signal events in code?• Pada PB1, digital input adalah dalam konfigurasi Active LOW.


Rising Edge dan Falling Edge: PB1• Apabila PB1 ditekan (Falling Edge), LED1 akan menyala selama0.5 saat.• Jika PB1 masih berada dalam keadaan ditekan, LED2 akan terusmenyala.• Apabila PB1 dilepaskan (Rising Edge), LED3 akan menyala selama0.5 saat.• Semua LED akan dipadam apabila PB1 berada dalam keadaantidak aktif (idle).


Rising Edge dan Falling Edge: PB1…void loop() { if(PB1==0) { LED1(1); delay(500); { LED2(1); LED1(0); }LED3(0); }}… while(PB1==0) LED3(1); LED2(0); delay(500);…void loop(){ if(PB1==0){ LED1(1); delay(500);while(PB1==0){ LED2(1);LED1(0);}LED3(1); LED2(0); delay(500);LED3(0);}}…Falling EdgeStill pressing PBRising Edge LED8 LED1PB1 PB2


• Pada PB2, digital input adalah dalam konfigurasi Active HIGH.Rising Edge dan Falling Edge: PB2Idle = PB not pressed PB pressedRising Edge Falling EdgeStill pressing PBHow to detect all button signal events in code?


Rising Edge dan Falling Edge: PB2• Apabila PB2 ditekan (Rising Edge), LED4 akan menyala selama0.5 saat.• Jika PB2 masih berada dalam keadaan ditekan, LED5 akan terusmenyala.• Apabila PB2 dilepaskan (Falling Edge), LED6 akan menyalaselama 0.5 saat.• Semua LED akan dipadam apabila PB2 berada dalam keadaantidak aktif (idle).


Rising Edge dan Falling Edge: PB2…void loop() { if(PB2==1) { LED4(1); delay(500); { LED5(1); LED4(0); }LED6(0); }}… while(PB2==1) LED6(1); LED5(0); delay(500);…void loop(){ if(PB2==1){ LED4(1); delay(500);while(PB2==1){ LED5(1);LED4(0);}LED6(1); LED5(0); delay(500);LED6(0);}}…Rising EdgeStill pressing PBFalling Edge LED8 LED1PB1 PB2


Counter menggunakan PB + LED• Setiap kali PB1 ditekan:• Falling edge: buzzer berbunyi sekali• Rising edge: LED seterusnya menyala• Selepas tekan kali ke-9, semua LED dipadam serta buzzerberbunyi sebanyak 2 kali. Kitaran bermula semula.


Counter menggunakan PB + LED…uint8_t cnt=0; void loop() { if(PB1==0) { beep(1,50); cnt++; while(PB1==0); checkCnt(); delay(200); }}…uint8_t cnt=0;void loop(){ if(PB1==0){ beep(1,50);cnt++;while(PB1==0);checkCnt();delay(200);}}void checkCnt() { if(cnt==1) LED1(1); if(cnt==2) LED2(1); if(cnt==3) LED3(1); if(cnt==4) LED4(1); if(cnt==5) LED5(1); if(cnt==6) LED6(1); if(cnt==7) LED7(1); if(cnt==8) LED8(1); if(cnt==9) { cnt=0; beep(2,50); LED1(0);LED2(0);LED3(0);LED4(0); LED5(0);LED6(0);LED7(0);LED8(0); }return; }…void checkCnt(){ if(cnt==1) LED1(1);if(cnt==2) LED2(1);if(cnt==3) LED3(1);if(cnt==4) LED4(1);if(cnt==5) LED5(1);if(cnt==6) LED6(1);if(cnt==7) LED7(1);if(cnt==8) LED8(1);if(cnt==9){ cnt=0; beep(2,50); LED1(0);LED2(0);LED3(0);LED4(0);LED5(0);LED6(0);LED7(0);LED8(0);}return;}…Debounce


Fenomena Bouncing• Bouncing ialah kecenderungan dua kenalan logam dalam perantielektronik untuk menghasilkan beberapa isyarat apabila contacttersebut ditutup atau dibuka.• Debouncing merujuk kepada sebarang peranti perkakasan atauperisian yang memastikan hanya satu isyarat sahaja akandiproses bagi setiap tindakan pembukaan atau penutupancontact.


Debouncevideo


Apakah IR sensor?• Sensor IR (Infrared Sensor) ialah sejenis sensor elektronikyang digunakan untuk mengesan kehadiran objek, jarak, ataupergerakan berdasarkan sinaran inframerah (infrared).• Penjelasan ringkas:• IR sensor memancarkan cahaya inframerah dari pemancar (biasanyaLED IR).• Kemudian, penerima akan mengesan pantulan cahaya itu daripada objek.• Jika terdapat objek, sinaran IR akan dipantulkan, lalu dikesan olehpenerima.• Isyarat ini dihantar sebagai input digital atau analog ke mikropengawal.


Apakah IR sensor?OBJEKJarak: Nilai analog


Jenis-jenis IR sensor• Active IR• Sensor IR Aktif mengesan objek melalui pantulan cahaya inframerah.Ia digunakan dalam automasi, kawalan jauh, dan robotik untukpengesanan tepat dan pengukuran jarak.• Passive IR• Sensor IR Pasif mengesan haba dari badan manusia tanpa memancarkan cahaya, sesuai untuk sistem keselamatan.


Pendawaian IR Sensor


Pendawaian IR Sensor LED8 LED1PB1 PB2


Aturcara IR Sensor• Keluaran IR Sensor adalah dalam bentuk Active LOW. • Apabila ada halangan pada IR Sensor, buzzer akan berbunyi.…#define pb2 26 #define irs 25 #define PB2 digitalRead(pb2) #define IRS digitalRead(irs) { … pinMode(pb2,INPUT_PULLDOWN); pinMode(irs,INPUT); Serial.begin(9600); }…void setup() …#define pb2 26#define irs 25…#define PB2 digitalRead(pb2)#define IRS digitalRead(irs)void setup(){ …pinMode(pb2,INPUT_PULLDOWN);pinMode(irs,INPUT);Serial.begin(9600);}char tx2buf[100]; uint8_t cnt=0; void loop() { if(PB1==0) { beep(1,50); cnt++; while(PB1==0); checkCnt(); delay(200); }if(IRS==0) beep(1,50); }…char tx2buf[100];uint8_t cnt=0;void loop(){ if(PB1==0){ beep(1,50);cnt++;while(PB1==0);checkCnt();delay(200);}if(IRS==0)beep(1,50);}…


Konsep Asas Analog• Input Analog merujuk kepada keupayaan mikropengawal menukararas voltan kepada nilai digital yang boleh diproses.• Input Digital hanya mengesan dua keadaan logik: TINGGI(HIGH) atau RENDAH (LOW).• Dalam ESP32, input analog mampu mengesan voltan dari 0Vhingga 3.3V dan menukarnya kepada nilai digital dalam format12-bit, contohnya 2.41V atau 0.93V.


Konsep Asas Analog• Apakah Maksud 12-bit dalam Bacaan Analog?• Sistem 12-bit bermaksud nilai digital mempunyai 212 = 4096 kemungkinan.• Namun dalam mikropengawal, kiraan bermula dari 0, jadi julat nilai bacaan analog ialah 0 hingga 4095.• Nilai 0 mewakili 0V, manakala 4095 mewakili 3.3V (voltan rujukan dalam ESP32).• Formula untuk pengiraan: ??? =???????3.3× 4095 ??????? =???4095×3.3


ADC 1-bit10.21 = 2 ADC = 1volt,Vtime,s3.31.65ADC value2.4??? =2.43.3× 2


ADC 2-bit3.33021.22 = 4 ADC = 2volt,Vtime,s3.3ADC value2.41.650.825


ADC 4-bit3.3 1514131211109876543210.24 = 16 ADC = 11volt,Vtime,s3.3ADC value2.40.206251.65


ADC 12-bit3.3 409540943210.24 = 16 ADC = 11volt,Vtime,s3.3ADC value2.40.000805661.65


ADC resolusi VS noise• Semakin tinggi resolusi bit, semakin tinggi ketepatan bacaananalog kerana lebih banyak nilai boleh diwakili.• Namun, resolusi yang lebih tinggi juga lebih sensitif terhadapgangguan (noise), menyebabkan kemungkinan ralat bacaanmenjadi lebih besar sekiranya sistem tidak dirangka denganbaik.


Spesifikasi Pin ESP32• Saluran Input ADC – 12-bit (16 pin):- ADC1_CH0 (GPIO 36) - ADC2_CH0 (GPIO 4)- ADC1_CH3 (GPIO 39) - ADC2_CH1 (GPIO 0)- ADC1_CH4 (GPIO 32) - ADC2_CH2 (GPIO 2)- ADC1_CH5 (GPIO 33) - ADC2_CH3 (GPIO 15)- ADC1_CH6 (GPIO 34) - ADC2_CH4 (GPIO 13)- ADC1_CH7 (GPIO 35) - ADC2_CH5 (GPIO 12)- ADC2_CH6 (GPIO 14)- ADC2_CH7 (GPIO 27)- ADC2_CH8 (GPIO 25)- ADC2_CH9 (GPIO 26)


Pendawaian Variable Resistor


Pendawaian Variable Resistor LED8 LED1PB1 PB2


Aturcara Asas Analog…#define irs 25 #define var 34 void loop() { uint16_t an = analogRead(var); Serial.println(an); }………#define irs 25#define var 34…void loop(){ uint16_t an = analogRead(var);Serial.println(an);}…Aturcara diatas memaparkan nilai ADC 12-bitvoid loop() { uint16_t an = analogRead(var); float volt = (float)an/4095*3.3; Serial.println(tx2buf); } sprintf(tx2buf,\"ADC:%d, Volt:%.2f\",an,volt);void loop(){ uint16_t an = analogRead(var);float volt = (float)an/4095*3.3;sprintf(tx2buf,\"ADC:%d, Volt:%.2f\",an,volt);Serial.println(tx2buf);}Aturcara diatas memaparkan nilai ADC 12-bit dan nilai voltan.Type casting ke float mengelakkan truncation danmemastikan nilai voltan lebih tepat.


Range Mapping• Bacaan analogRead() pada ESP32 memberikan nilai 12-bit, iaitudalam julat 0 hingga 4095.• Lapan LED digunakan untuk mewakili 8-bit data, iaitu nilai dari 0hingga 255 sahaja.• Bacaan ADC 12-bit dipetakan kepada julat 0 hingga 8 bagimembolehkan LED memaparkan tahap voltan secara visual dalambentuk bar graf.• Proses ini dipanggil penyesuaian julat (range mapping).


…#define IRS digitalRead(irs) void loop() { uint16_t an = analogRead(var); float volt = (float)an/4095*3.3; uint16_t anMAP=map(an,0,4095,0,8); Serial.println(tx2buf); digitalWrite(LEDs[i], i<anMAP? HIGH:LOW); }…uint8_t LEDs[]={15,2,4,16,17,5,18,19}; sprintf(tx2buf,\"ADC:%d, Volt:%.2f\",an,volt); for(uint8_t i=0; i<8; i++) ……#define IRS digitalRead(irs)uint8_t LEDs[]={15,2,4,16,17,5,18,19};…void loop(){ uint16_t an = analogRead(var);float volt = (float)an/4095*3.3;uint16_t anMAP=map(an,0,4095,0,8);sprintf(tx2buf,\"ADC:%d, Volt:%.2f\",an,volt);Serial.println(tx2buf);for(uint8_t i=0; i<8; i++)digitalWrite(LEDs[i], i<anMAP? HIGH:LOW);}…Range Mapping• Ini merupakan operator ternari yang berfungsisebagai ringkasan kepada struktur if-else.• Jika nilai i kurang daripada anMAP, LED akandihidupkan (HIGH).• Jika i sama dengan atau melebihi anMAP, LEDakan dipadamkan (LOW).Fungsi map() dalam Arduino digunakanuntuk menukar satu julat nomborkepada julat nombor yang lain.Array digunakan supaya kita boleh kawal banyakLED dengan gelung for, tanpa tulis digitalWritesatu per satu. Pendek, kemas, dan mudah ubah suai.


Pendawaian LDR module


Pendawaian LDR module LED8 LED1PB1 PB2


Pengenalan kepada LDR• Apa itu LDR?• LDR (Light Dependent Resistor) ialah komponen elektronik yangmengubah rintangan berdasarkan intensiti cahaya.• Semakin terang cahaya, semakin rendah rintangannya (dan sebaliknya).• Digunakan dalam aplikasi seperti lampu automatik, sistem keselamatan,dan robotik.


LDR Memerlukan Voltage Divider• Kenapa Voltage Divider?• LDR tidak memberikan output terus (analog) seperti potentiometer.• Rintangannya berubah dengan cahaya, jadi voltage divider diperlukanuntuk menukar perubahan rintangan kepada perubahan voltan.


Penyelesaian Mudah: Modul LDR• Modul LDR sudah dilengkapi voltage divider dan penyesuaiisyarat.• Tidak perlu litar tambahan.• Output terus dalam bentuk analog (0V–5V) atau digital (HIGH/LOW)jika ada comparator.• Contoh modul:• Pin AO (Analog Output) untuk bacaan analog.• Pin DO (Digital Output) untuk trigger cahaya tertentu.


Membaca ADC bagi nilai LDR…#define var 34 #define ldr 35 void loop() { uint16_t an = analogRead(var); float volt = (float)an/4095*3.3; uint16_t anMAP=map(an,0,4095,0,8); uint16_t LDR = analogRead(ldr); Serial.println(tx2buf); digitalWrite(LEDs[i], i<anMAP? HIGH:LOW); }…… sprintf(tx2buf,\"ADC:%d, Volt:%.2f, LDR:%d\",an,volt,LDR); for(uint8_t i=0; i<8; i++)…#define var 34#define ldr 35…void loop(){ uint16_t an = analogRead(var);float volt = (float)an/4095*3.3;uint16_t anMAP=map(an,0,4095,0,8);uint16_t LDR = analogRead(ldr);sprintf(tx2buf,\"ADC:%d, Volt:%.2f, LDR:%d\",an,volt,LDR);Serial.println(tx2buf);for(uint8_t i=0; i<8; i++)digitalWrite(LEDs[i], i<anMAP? HIGH:LOW);}…Membaca nilai ADC LDR melalui analogReadBuat aturcara untuk menghidupkan buzzer sekiranya cahaya persekitaran adalah gelapDaripada pemerhatian, nilai pembolehubah sentiasa berubah (±5). Bagaimana untuk menyelesaikannya?


Smoothing Analog Value• Kaedah yang digunakan adalah dikenali sebagai “moving average”.• Ia akan menambah nilai analog mengikut jumlah yang penggunatetapkan seperti 10 kali penambahan.• Setelah itu, jumlah tersebut akan dibahagikan dengan nilai 10untuk mendapatkan nilai purata dan dikembalikan semula kepadafunction call.


Smoothing Analog Value …void writeOLED(uint8_t x, uint8_t y,String text) uint16_t smoothingAnalogValue(uint8_t pin, uint8_t samples = 10) { uint32_t sum = 0; for(uint8_t i = 0; i < samples; i++) { sum += analogRead(pin); delay(2); }return sum / samples; }…void loop() { uint16_t an = smoothingAnalogValue(var); float volt = (float)an/4095*3.3; uint16_t anMAP=map(an,0,4095,0,8); uint16_t LDR = smoothingAnalogValue(ldr); …void setup() …void writeOLED(uint8_t x, uint8_t y,String text)…uint16_t smoothingAnalogValue(uint8_t pin, uint8_t samples = 10){ uint32_t sum = 0;for(uint8_t i = 0; i < samples; i++){ sum += analogRead(pin);delay(2); }return sum / samples;}void setup()…void loop(){ uint16_t an = smoothingAnalogValue(var);float volt = (float)an/4095*3.3;uint16_t anMAP=map(an,0,4095,0,8);uint16_t LDR = smoothingAnalogValue(ldr); …Daripada pemerhatian, nilai pembolehubah kini dalam julat ±1.


Pengenalan kepada OLED• OLED 0.96\" merupakan sejenis paparan mini yang mampu memaparkanteks dan grafik tanpa memerlukan lampu belakang.• Modul ini beroperasi menggunakan sambungan I2C yang hanyamemerlukan dua talian data.• Spesifikasi Umum:• Saiz paparan: 0.96 inci• Resolusi: 128 x 64 piksel• Protokol komunikasi: I2C• Voltan operasi: 3.3V – 5V• Warna paparan: Putih, biru atau kombinasi kuning-biru (bergantung versi)


Pendawaian OLED


Pendawaian OLEDLED8 LED1PB1 PB2


Installasi library OLED• Bagi menggunakan perkakasan OLED 0.96”, pengguna perluinstall 2 library seperti di bawah melalui Arduino IDE.• Adafruit GFX library• Adafruit SSD1306• Setelah itu, rujuk contoh diberi.


Asas pengaturcaraan OLED• Buka contoh berdasarkan kepada gambarajah dibawah.• Ubah aturcara pada baris ke-35 dari 0x3D kepada 0x3C. • Upload aturcara.0x3C


Asas pengaturcaraan OLED• Contoh aturcara tersebut menguji kefungsian OLED sebelummenggunakan untuk proses berikutnya.• OLED akan digunakan untuk membuat paparan tulisan berkenaanstatus dan nilai pembolehubah seperti LDR, potentiometer.• Sebelum itu, berikut adalah aturcara asas bagi OLED yang telahdiringkaskan


Asas pengaturcaraan OLED#include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, Wire, OLED_RESET); …#define SCREEN_WIDTH 128#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#define SCREEN_WIDTH 128#define SCREEN_HEIGHT 64#define OLED_RESET -1#define SCREEN_ADDRESS 0x3CAdafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);…void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); display.display(); delay(2000); display.setTextColor(SSD1306_WHITE); display.clearDisplay(); display.setCursor(0,0); display.println(F(\"Hello, World!\")); display.setCursor(0,11); display.println(F(\"Abd Rahim\")); display.display(); }… display.setTextSize(1); void setup(){ Serial.begin(9600);display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);display.display();delay(2000);display.setTextSize(1); display.setTextColor(SSD1306_WHITE);display.clearDisplay();display.setCursor(0,0); display.println(F(\"Hello, World!\"));display.setCursor(0,11); display.println(F(\"Abd Rahim\"));display.display();}…


Mengintegrasi OLED dalam aturcara…#define IRS digitalRead(irs) #include <SPI.h> #include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_HEIGHT 64 #define OLED_RESET -1 #define SCREEN_ADDRESS 0x3C Adafruit_SSD1306 display(…); uint8_t LEDs[]={15,2,4,16,17,5,18,19}; //============================== OLED #define SCREEN_WIDTH 128 //============================== Variables…#define IRS digitalRead(irs)//============================== OLED#include <SPI.h>#include <Wire.h>#include <Adafruit_GFX.h>#include <Adafruit_SSD1306.h>#define SCREEN_WIDTH 128#define SCREEN_HEIGHT 64#define OLED_RESET -1#define SCREEN_ADDRESS 0x3CAdafruit_SSD1306 display(…);//============================== Variablesuint8_t LEDs[]={15,2,4,16,17,5,18,19};…void setup() { Serial.begin(9600); display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS); display.display(); delay(2000); display.setTextColor(SSD1306_WHITE); display.setCursor(0,0); display.println(F(\"Hello, World!\")); display.setCursor(0,11); display.println(F(\"Abd Rahim\")); display.display(); … display.setTextSize(1); display.clearDisplay(); pinMode(led1,OUTPUT); pinMode(led5,OUTPUT);…void setup(){ Serial.begin(9600);display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS);display.display();delay(2000);display.setTextSize(1); display.setTextColor(SSD1306_WHITE);display.clearDisplay();display.setCursor(0,0); display.println(F(\"Hello, World!\"));display.setCursor(0,11); display.println(F(\"Abd Rahim\"));display.display();pinMode(led1,OUTPUT); pinMode(led5,OUTPUT);…


Membina fungsi untuk OLED …//============================== Variables uint8_t LEDs[]={15,2,4,16,17,5,18,19}; { display.setCursor(x,y); display.println(text); display.display(); }{ … display.setTextColor(SSD1306_WHITE); writeOLED(0,0,\"Hello World!\"); writeOLED(0,11,\"Abd Rahim Kasiman\"); pinMode(led1,OUTPUT); pinMode(led5,OUTPUT); …void writeOLED(uint8_t x, uint8_t y,String text) void setup() display.clearDisplay();…//============================== Variablesuint8_t LEDs[]={15,2,4,16,17,5,18,19};void writeOLED(uint8_t x, uint8_t y,String text){ display.setCursor(x,y); display.println(text);display.display();}void setup(){ …display.setTextColor(SSD1306_WHITE);display.clearDisplay();writeOLED(0,0,\"Hello World!\");writeOLED(0,11,\"Abd Rahim Kasiman\");pinMode(led1,OUTPUT); pinMode(led5,OUTPUT); …Fungsi menerima 3 argument iaitu koordinat x, y dan pembolehubah dalam bentuk String


Pengenalan kepada DHT11• DHT11 ialah modul penderia digital yang digunakan untukmengukur suhu dan kelembapan relatif persekitaran.• Ia mempunyai kelebihan dari segi kos yang rendah dan mudahdigunakan bersama mikropengawal seperti Arduino dan ESP32.• Penderia ini menghantar data secara digital melalui satu pindata tunggal, menjadikannya sesuai untuk aplikasi asas dalamsistem IoT, pemantauan cuaca, atau automasi rumah.


Pendawaian DHT11


Pendawaian DHT11LED8 LED1PB1 PB2


Click to View FlipBook Version