Membaca GPIO pada ESP32 Dengan Register

Membaca GPIO pada ESP32 Dengan Register #

Pada ESP32 terdapat pin GPIO (General Purpose Input Output) yang dapat dibaca oleh perangkat lunak. Membaca GPIO dapat dilakukan dengan library Arduino dengan fungsi digitalRead(), dan dapat juga dengan langsung mengakses register. Pembacaaan melalui register lebih cepat, namun sedikit lebih rumit dibandingkan menggunakan library Arduino. Berikut cara membaca Nilai GPIO pada ESP32 langsung melalui register.

Percobaan 1 dengan struktur data GPIO #

Pada percobaan ini menggunakan variabel GPIO.in yang dipetakan ke register IO.

#include "soc/gpio_struct.h"  // Include the GPIO register definitions

const int gpioPin_lo = 5;
const int gpioPin_hi = 33;

void setup() {
  Serial.begin(115200);
  Serial.println("\nContoh program membaca digital input menggunakan akses langsung register");
  Serial.println(__FILE__);

  pinMode(gpioPin_lo, INPUT_PULLUP);  // Enable pull-up
  pinMode(gpioPin_hi, INPUT_PULLUP);  // enable pull up
}

void loop() {
  // Read the GPIO input register
  bool gpio_lo_state = (GPIO.in >> gpioPin_lo) & 0x01;
  bool gpio_hi_state = (GPIO.in1.val >> (gpioPin_hi - 32)) & 0x01;
  Serial.print("GPIO state: ");
  Serial.print(gpio_lo_state);
  Serial.print(" ");
  Serial.println(gpio_hi_state);
  delay(1000);
}

Percobaan 2 dengan akses register #

Pada percobaan ini menggunakan register GPIO_IN_REG dan GPIO_IN1_REG.

alt ESP32 dengan 1 input tombol push button

// contoh program membaca digital input menggunakan register
#define INPUT_PIN1 5   // pin nomor kecil
#define INPUT_PIN2 34  // pin nomor besar

void setup() {
  pinMode(INPUT_PIN1, INPUT_PULLUP);
  pinMode(INPUT_PIN2, INPUT_PULLUP);
  Serial.begin(115200);
  Serial.println("\nContoh program membaca digital input menggunakan register");
  Serial.println(__FILE__);
}
int counter = 0;
void loop() {
  int input_value_1, input_value_2;
  input_value_1 = (REG_READ(GPIO_IN_REG) >> (INPUT_PIN1)) & 0x1;
  input_value_2 = (REG_READ(GPIO_IN1_REG) >> (INPUT_PIN2 - 32)) & 0x1;
  Serial.print(counter);
  Serial.print(" ");
  Serial.print(input_value_1);
  Serial.print(" ");
  Serial.print(input_value_2);
  Serial.println();
  delay(1000);
  counter++;
}

Daftar register dapat dibaca di manual referensi teknis ESP32 . Register yang dipakai adalah GPIO_IN_REG dan GPIO_IN1_REG.

Referensi #

comments powered by Disqus