Introduction: ESP32 With Ultrasonic Sensor
Today, we are going to create a reverse sensor simulator, the kind that is used in cars. For this, we will make an assembly that uses the ESP32, a buzzer, four indicator LEDs, and an ultrasonic sensor, plus a 4-digit display (with 7 segments).
So, let's read the ultrasonic sensor and play with the distance on the display. As the distance reaches a "dangerous" space, the LEDs gradually light up from blue to green, yellow, and finally red, according to the shortening of the distance. An alarm goes off when reaching the space limit.
Step 1: WiFi NodeMCU-32S ESP-WROOM-32
Step 2: Display
As for the display, in this assembly, we show how to use the I2C, which enables the sending of vast information by only two wires.
Step 3: Ultrasonic Sensor
We explained that the HC-SR04, the most common ultrasonic sensor and widely used with Arduino, is cheap and easy to find. Remember the minimum distance that it can measure is from 2 inches away, and the maximum is 4 meters. Another detail is that 5 volts power it.
Step 4: Continuous Buzzer
Step 5: LEDs
There are 4 colored LEDs with 220 ohms resistors.
Step 6: Assembly
The principal details of the HC-SR 04 is that it has power and uses two pins, the trigger and the Echo, which appear in the source code.
Step 7: Libraries
In this assembly, we used two libraries: TM1637Display and Ultrasonic. The PDF file contains the links to download both, on: http://www.fernandok.com/2017/12/sensor-ultrassonico-com-esp32.html
Step 8: Source Code
In this part, you can see a demonstration about the operation of the project. Already in the code, we declare TM1637Display and Ultrasonic, with a reading range of 250 milliseconds. This was the chosen time to avoid extremely fast number changes. Next, we define the pins used for the LEDs and the buzzer. I declare yet another variable, the "unsigned int", which will save the distance of the device.
//Biblioteca responsável para comunicação com o display de 7 segmentos
#include <tm1637display.h> //Carrega a biblioteca do sensor ultrassonico #include < ultrasonic.h> #define INTERVALO_LEITURA 250 //(ms) //definição dos PINOS que utilizaremos para os LEDS e o BUZZER #define PIN_BLUE_LED 16 #define PIN_GREEN_LED 17 #define PIN_YELLOW_LED 18 #define PIN_RED_LED 19 #define PIN_BUZZER 21 //variável responsável por armazenar a distância lida pelo sensor ultrassônico unsigned int distancia = 0;
Sensor and Display
In this step, we define the pins and the constructors of the objects that we use to control the ultrasonic sensor and the display.
//conexão dos pinos para o sensor ultrasonico
#define PIN_TRIGGER 4 #define PIN_ECHO 5 //Inicializa o sensor nos pinos definidos acima Ultrasonic ultrasonic(PIN_TRIGGER, PIN_ECHO); // Module connection pins (Digital Pins) #define CLK 14 #define DIO 13 //Inicializa o display nos pinos definidos acima TM1637Display display(CLK, DIO);
Setup
In this function, we initialize the serial with a speed of 9600, configure the pins, and then configure the brightness for the display.
void setup()
{ Serial.begin(9600); configurarPinos(); //configura o brilho do display com valor máximo display.setBrightness(0x0a); Serial.println("Setup..."); }
Pin Configuration
Here, we set both the four LEDs and the buzzer as pinMode, all OUTPUT, because they are outputs.
/*
CONFIGURA O MODOS DE CADA UM DOS PINOS QUE UTILIZAREMOS COMO SAIDA */ void configurarPinos() { pinMode(PIN_BLUE_LED, OUTPUT); pinMode(PIN_GREEN_LED, OUTPUT); pinMode(PIN_YELLOW_LED, OUTPUT); pinMode(PIN_RED_LED, OUTPUT); pinMode(PIN_BUZZER, OUTPUT); }
Loop
In the Loop function, we have the distance and delay check, that is, the reading interval.
void loop()
{ verificarDistancia(); delay(INTERVALO_LEITURA); }
Get Distance
Now, we are going to read the current distance calculated by the sensor.
/*
FAZ A LEITURA DA DISTANCIA ATUAL CALCULADA PELO SENSOR */ int getDistance() { //faz a leitura das informacoes do sensor (em cm) int distanciaCM; long microsec = ultrasonic.timing(); // pode ser um float ex: 20,42 cm se declarar a var float distanciaCM = ultrasonic.convert(microsec, Ultrasonic::CM); return distanciaCM; }
Check Distance
We check the distance that will be shown on the 4-digit display. Then, we erase the 4 LEDs and silence the buzzer. This type of situation can be used in many applications.
/*
VERIFICA A DISTANCIA ATUAL QUE O SENSOR ULTRASONIC ESTA LENDO E EM SEGUIDA, IMPRIME O VALOR NO DISPLAY, E ACENDE O LED CORRESPONDENTE */ void verificarDistancia() { //recupera a distância atual lida pelo sensor distancia = getDistance(); //imprime no display o valor lido display.showNumberDec(distancia); //esse FOR tem como objetivo apagar todos os LEDS que estejam acesos. for(int i=PIN_BLUE_LED; i<=PIN_RED_LED; i++) { digitalWrite(i, LOW); } //desliga o BUZZER digitalWrite(PIN_BUZZER, LOW); //caso a distancia lida seja menor ou igual a 5, tomaremos como uma distância de perigo //então acenderemos o LED VERMELHO e ligaremos o BUZZER if( distancia <= 5 ) { digitalWrite(PIN_RED_LED, HIGH); digitalWrite(PIN_BUZZER, HIGH); } //caso a distancia seja maior que 5 e menor ou igual a 20, //tomaremos como uma distância de atenção, e ligaremos o LED AMARELO else if(distancia <=20) { digitalWrite(PIN_YELLOW_LED, HIGH); } //caso a distancia seja maior que 20 e menor ou igual a 40, //tomaremos como uma distância segura, e ligaremos o LED VERDE else if(distancia <= 40) { digitalWrite(PIN_GREEN_LED, HIGH); } //para distâncias maiores que 40, tomaremos como uma distância sem perigo //acenderemos o LED AZUL para indicar else { digitalWrite(PIN_BLUE_LED, HIGH); } }
2 Comments
5 years ago
Hello.
Thanks for the tutorial, but I have a doubt. The ultrassonic sensor is powered by 5V, the ESP 32 works at logic ports with 3.3 V. Does it create a comunication problem? The ESP will send a TRIGGER impulse of 3.3 V and the sensor will not return a ECHO response of 5 V? I am doing a project using this sensor and uC but I am afraid to burn the ESP module.
Thanks
Question 5 years ago
Hello, great tutorial. i saw that you are using a HC-SR04 that use 5V battery, but i had read that GPIO pins of ESP32 can handle up to 3.9V without problem.