Skip to main content

Belajar input & output ESP32

Pada percobaan yang lalu kita telah belajar membuat LED internal ESP32 menyala berkedip (blink), kali ini kita akan mencoba membuat LED eksternal menyala dan mati dengan dikontrol oleh sebuah tombol (pushbutton) yang terhubung salah satu kaki ESP32. Pada percobaan kali ini, kita akan mempelajari bagaimana sebuah ESP32 menerima perintah (input) dan menjalankan perintah (output) sesuai dengan program yang kita tanamkan didalamnya. Pushbutton kita anggap sebagai komponen input yang akan dibaca oleh ESP32. Karena pushbutton adalah sebuah saklar yang hanya dapat mengalirkan dan memutuskan arus, maka ESP32 menggunakan port digital untuk dapat membaca nilai dari pushbutton. Pushbutton bernilai 0 jika tidak mengalirkan arus, sedangkan bernilai satu jika meneruskan arus. LED digunakan untuk menampilkan output dari ESP32, output disini adalah output digital ya teman-teman, yaitu pada saat LED menyala berarti bernilai 1 sedangkan pada saat mati bernilai 0.

Persiapan

komponen skema rangkaian

Skematik Basics.png

Pemrograman

let's coding...

const int buttonPin = 4;
const int ledPin = 23;

int buttonState = 0;
int iter = 0;

void setup(){
  Serial.begin(115200);
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
}

void loop(){
  buttonState = digitalRead(buttonPin);
  if (buttonState == HIGH) {
    digitalWrite(ledPin, HIGH);
  } else {
    digitalWrite(ledPin, LOW);
  }
}

image.png

Penjelasan kode

How the code works

Hasil

the result

Modifikasi program

let's advance

Modifikasi kode

#include <Wire.h>
#include <WiFi.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

// Membuat LED blink dan buzzer menyala dengan dikontrol oleh dua tombol
// Tombol pertama untuk mengeset berapa kali led atau buzzer menyala (<10)
// Tombol kedua untuk mengatur apakah hanya led, buzzer atau kedua-duanya yang menyala

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);

const int button1Pin = 4;
const int button2Pin = 2;
const int ledPin = 23;
const int buzzerPin = 27;

int button1State = 0;
int button2State = 0;
int modeState = 0;
int actionState = 0;

void setup(){
  Serial.begin(115200);
  if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)){
    Serial.println("OLED tidak terkoneksi");
    for(;;);
  } 

  pinMode(button1Pin, INPUT);
  pinMode(button2Pin, INPUT);
  pinMode(ledPin, OUTPUT);
  pinMode(buzzerPin, OUTPUT);

  // welcome message Smart-x di OLED
  delay(2000);
  display.clearDisplay();
  display.setTextColor(WHITE);
  display.setTextSize(1);
  display.setCursor(25, 31);
  display.print("SMART-X ITB");
  display.display();
  delay(5000);
  display.clearDisplay();
  delay(500);

 
}
// Fungsi untuk menyalakan led dan buzzer
void ledBlink(int t, int mode){
  for (int i=1; i<=t; i++){
    switch (mode){
    case 0:
      digitalWrite(ledPin,HIGH);
      digitalWrite(buzzerPin,HIGH);
      delay(100);
      digitalWrite(ledPin,LOW);
      digitalWrite(buzzerPin, LOW);
      delay(100);
      break;
    case 1:
      digitalWrite(ledPin,HIGH);
      delay(100);
      digitalWrite(ledPin,LOW);
      delay(100);
      break;
    case 2:
      digitalWrite(buzzerPin,HIGH);
      delay(100);
      digitalWrite(buzzerPin,LOW);
      delay(100);
      break;
    }
  }
}

// Fungsi untuk membunyikan buzzer
// Bunyi notifikasi selesai menyeting beep 3x
void beepSet(int times){
  for (int i=1; i<=times; i++){
    digitalWrite(buzzerPin, HIGH);
    delay(50);
    digitalWrite(buzzerPin, LOW);
    delay(50);
  }
}

// Fungsi untuk bunyi reset (beep panjang)
void beepReset(){
  digitalWrite(buzzerPin, HIGH);
  delay(1500);
  digitalWrite(buzzerPin, LOW);
}
// Fungsi untuk menampilkan pesan di OLED
void pesanOled(int modeState, int actionState) {
  display.clearDisplay();
  display.setCursor(25, 0);
  display.print("SMART-X ITB");
  display.setCursor(0, 21);
  display.print("Mode : ");
  switch (modeState) {
    case 0:
      display.print("LED & BUZ");
      break;
    case 1:
      display.print("LED");
      break;
    case 2:
      display.print("BUZ");
  }
  display.setCursor(0,31);
  display.print("Beep : ");
  display.print(actionState + 1);
  display.print("x");
  display.display();
}

// Main program yang harus dijalankan
void loop(){
  button1State = digitalRead(button1Pin);
  button2State = digitalRead(button2Pin);

  pesanOled(modeState, actionState);

  if (button1State == HIGH){
    Serial.println("Button 1: ditekan");
    actionState ++;
    delay(500);
    ledBlink(actionState, modeState);
    if (actionState >= 10){
      actionState = 0;
    }
  }

  // Mengubah value button2State untuk mengubah mode
  if (button2State == HIGH) {
    Serial.println("Button 2 : ditekan ");
    modeState ++;
    delay(500);
    if (modeState == 1) {
      beepSet(3);
    }
    if (modeState == 2) {
      beepSet(3);
    }
    if (modeState == 3) {
      modeState = 0;
      beepReset();
    }
  }
}

image.png

Skema rangkaian

Skematik Advance.png