ESP32 Digital Inputs and Digital Outputs (Arduino IDE)

In this getting started guide you’ll learn how to read digital inputs like a button switch and control digital outputs like an LED using the ESP32 with Arduino IDE.

ESP32 Read Inputs Control Outputs Arduino IDE

Prerequisites

We’ll program the ESP32 using Arduino IDE. So, make sure you have the ESP32 boards add-on installed before proceeding:

ESP32 Control Digital Outputs

First, you need set the GPIO you want to control as an OUTPUT. Use the pinMode() function as follows:

pinMode(GPIO, OUTPUT);

To control a digital output you just need to use the digitalWrite() function, that accepts as arguments, the GPIO (int number) you are referring to, and the state, either HIGH or LOW.

digitalWrite(GPIO, STATE);

All GPIOs can be used as outputs except GPIOs 6 to 11 (connected to the integrated SPI flash) and GPIOs 34, 35, 36 and 39 (input only GPIOs);

Learn more about the ESP32 GPIOs: ESP32 GPIO Reference Guide

ESP32 Read Digital Inputs

First, set the GPIO you want to read as INPUT, using the pinMode() function as follows:

pinMode(GPIO, INPUT);

To read a digital input, like a button, you use the digitalRead() function, that accepts as argument, the GPIO (int number) you are referring to.

digitalRead(GPIO);

All ESP32 GPIOs can be used as inputs, except GPIOs 6 to 11 (connected to the integrated SPI flash).

Learn more about the ESP32 GPIOs: ESP32 GPIO Reference Guide

Project Example

To show you how to use digital inputs and digital outputs, we’ll build a simple project example with a pushbutton and an LED. We’ll read the state of the pushbutton and light up the LED accordingly as illustrated in the following figure.

ESP32 button pressed or not to turn LED on and off

Schematic Diagram

Before proceeding, you need to assemble a circuit with an LED and a pushbutton. We’ll connect the LED to GPIO 5 and the pushbutton to GPIO 4.

Parts Required

Here’s a list of the parts to you need to build the circuit:

You can use the preceding links or go directly to MakerAdvisor.com/tools to find all the parts for your projects at the best price!

ESP32 Digital Input and Digital Output Schematic Circuit LED Pushbutton

Code

Copy the following code to your Arduino IDE.

// Complete Instructions: https://RandomNerdTutorials.com/esp32-digital-inputs-outputs-arduino/

// set pin numbers
const int buttonPin = 4;  // the number of the pushbutton pin
const int ledPin =  5;    // the number of the LED pin

// variable for storing the pushbutton status 
int buttonState = 0;

void setup() {
  Serial.begin(115200);  
  // initialize the pushbutton pin as an input
  pinMode(buttonPin, INPUT);
  // initialize the LED pin as an output
  pinMode(ledPin, OUTPUT);
}

void loop() {
  // read the state of the pushbutton value
  buttonState = digitalRead(buttonPin);
  Serial.println(buttonState);
  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH
  if (buttonState == HIGH) {
    // turn LED on
    digitalWrite(ledPin, HIGH);
  } else {
    // turn LED off
    digitalWrite(ledPin, LOW);
  }
}

View raw code

How the Code Works

In the following two lines, you create variables to assign pins:

const int buttonPin = 4;
const int ledPin = 5;

The button is connected to GPIO 4 and the LED is connected to GPIO 5. When using the Arduino IDE with the ESP32, 4 corresponds to GPIO 4 and 5 corresponds to GPIO 5.

Next, you create a variable to hold the button state. By default, it’s 0 (not pressed).

int buttonState = 0;

In the setup(), you initialize the button as an INPUT, and the LED as an OUTPUT. For that, you use the pinMode() function that accepts the pin you are referring to, and the mode: INPUT or OUTPUT.

pinMode(buttonPin, INPUT);
pinMode(ledPin, OUTPUT);

In the loop() is where you read the button state and set the LED accordingly.

In the next line, you read the button state and save it in the buttonState variable. As we’ve seen previously, you use the digitalRead() function.

buttonState = digitalRead(buttonPin);

The following if statement, checks whether the button state is HIGH. If it is, it turns the LED on using the digitalWrite() function that accepts as argument the ledPin, and the state HIGH.

if (buttonState == HIGH) {
  digitalWrite(ledPin, HIGH);
}

If the button state is not HIGH, you set the LED off. Just set LOW as a second argument to in the digitalWrite() function.

else {
  digitalWrite(ledPin, LOW);
}

Uploading the Code

Before clicking the upload button, go to Tools > Board, and select the board you’re using. In my case, it’s the DOIT ESP32 DEVKIT V1 board.

Go to Tools > Port and select the COM port the ESP32 is connected to. Then, press the upload button and wait for the “Done uploading” message.

Done uploading Arduino IDE button

If you see a lot of dots (…__…__) on the debugging window and the â€śFailed to connect to ESP32: Timed out waiting for packet header” message, that means you need to press the ESP32 on-board BOOT button after the dots start appearing.

Demonstration

After uploading the code, test your circuit. Your LED should light up when you press the pushbutton:

ESP32 Input Output Button Pressed LED On Arduino IDE

And turn off when you release it:

ESP32 Input Output Button Not Pressed Arduino IDE

Wrapping Up

With this getting started guide, you’ve learned how to read digital inputs and control digital outputs with the ESP32 using Arduino IDE.

If you want to learn how to read analog inputs, or output PWM signals, read the following guides:

You may also find useful taking a look at the ESP32 GPIO Reference that shows how to use the ESP32 GPIOs and its functions.

Finally, if you want to learn more about the ESP32, take a look at our resources:



Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »
Learn how to build a home automation system and we’ll cover the following main subjects: Node-RED, Node-RED Dashboard, Raspberry Pi, ESP32, ESP8266, MQTT, and InfluxDB database DOWNLOAD »

Enjoyed this project? Stay updated by subscribing our newsletter!

18 thoughts on “ESP32 Digital Inputs and Digital Outputs (Arduino IDE)”

      • Hi Sara! Just one question. Can i use GPIO pins witch have ADC2 function as normal digital I/O pins whole the time while esp32 is using wifi or just after on serial i get message client is disconected. For example some of those pin is set to high after “client is disconnected” and not during communication? Or in other words are those pins also
        not usable as digital I/O while data is send during communication over wifi.

        Reply
    • Hello Steve, that’s a pull-down resistor which means that when your not pressing a button, your GPIO is always reading the GND connection (LOW) and when pressed it reads the 3.3V (HIGH).
      I hope that helps, but you can search for “pull-down resistor” to learn more about that subject.

      Reply
  1. Hello,

    I have a esp32 dev kit 1.i want to use touch spi based tft (ili9341).

    I need some help in connection of lcd and esp32.

    Please guide

    Reply
  2. Hello,
    Is there any tutorial to read and write the whole register, instead of one bit at a time I would like to read and write multiple pins at the same time in parallel, thanks in advance.

    Reply
  3. Hello!
    I am trying to connect the IR Transmitter module with the esp32 dev kit module , so when I connect it with TX0 it shows in the mobile camera that radiation passing through it but nothing is receive on the IR receiver module and unfortunately it stops the serial communication. Their some garbage values are printed. And when I connect the signal pin of transmitter to the TX2 pin of the esp32 there is no output.
    So will provide the proper solution for it that on which pin is should connect the IR Transmitter so I can get proper output.
    I will be waiting for your reply.
    Thank you for your support.

    Reply
  4. Can you please show me how to integrate the 2 codes together to use ESP NOW to switch a input from one board to a output of another please even if you can email me the code please. Thanks Sam

    Reply
  5. Hello,
    I have a ESP32-DevKitC-32 mounted ESP32-WROOM-32 and tried to use pin 34 as input connected to a button. But because the value read never changed, I later used pin 26 and it worked. Is there something special about that input-only pins?
    I used internal pullup and connected the button to GND.

    Reply

Leave a Comment

Download Our Free eBooks and Resources

Get instant access to our FREE eBooks, Resources, and Exclusive Electronics Projects by entering your email address below.