11 : Sensor Ultrassom para medir distancias com ESP - efrainmpp1/URA-2.0-ESP GitHub Wiki

Introdução

O sensor ultrassônico é um aparelho que emite ondas ultrassonoras e nos permite saber a distancia de um objeto qualquer até nosso sensor.É constantemente utilizado no cotidiano,como por exemplo em um sistema de segurança se utilizam alarmes que são disparados quando o sensor indica que algo não deveria estar influenciando no sensor então provavelmente tem um intruso.Alguns carros já apresentam a tecnologia usando-a para avisar se está perto de mais de um outro carro ou qualquer objeto,o que facilita muito na hora de estacionar de ré.

Montagem

O ESP em sua normalidade alimenta seus sensores com 3.3 V e trabalha com essa voltagem.O sensor ultrassom que vamos utilizar é o HC-SR04 que funciona apenas com uma alimentação de 5V. Percebemos que temos um problema.Como vamos fazer o sinal de 3.3 V alimentar nosso sensor ? Para resolver esse problema utilizaremos o que chamamos de PONTE H que fará essa conversão para nós.

Código

Inicialmente o Python não apresenta a biblioteca Ultrassom para conseguirmos fazermos o programa que calcule a distancia com esse sensor.Então teremos que implementar essa biblioteca manualmente antes de rodarmos o programa main.Rode esse programa antes de tudo(Não precisa obrigatoriamente entender tudo que está na biblioteca Ultrassom).

import machine, time
from machine import Pin

__version__ = '0.2.0'
__author__ = 'Roberto S鐠嬶箯chez'
__license__ = "Apache License 2.0. https://www.apache.org/licenses/LICENSE-2.0"

class HCSR04:
    """
    Driver to use the untrasonic sensor HC-SR04.
    The sensor range is between 2cm and 4m.

    The timeouts received listening to echo pin are converted to OSError('Out of range')

    """
    # echo_timeout_us is based in chip range limit (400cm)
    def __init__(self, trigger_pin, echo_pin, echo_timeout_us=500*2*30):
        """
        trigger_pin: Output pin to send pulses
        echo_pin: Readonly pin to measure the distance. The pin should be protected with 1k resistor
        echo_timeout_us: Timeout in microseconds to listen to echo pin. 
        By default is based in sensor limit range (4m)
        """
        self.echo_timeout_us = echo_timeout_us
        # Init trigger pin (out)
        self.trigger = Pin(trigger_pin, mode=Pin.OUT, pull=None)
        self.trigger.value(0)

        # Init echo pin (in)
        self.echo = Pin(echo_pin, mode=Pin.IN, pull=None)

    def _send_pulse_and_wait(self):
        """
        Send the pulse to trigger and listen on echo pin.
        We use the method `machine.time_pulse_us()` to get the microseconds until the echo is received.
        """
        self.trigger.value(0) # Stabilize the sensor
        time.sleep_us(5)
        self.trigger.value(1)
        # Send a 10us pulse.
        time.sleep_us(10)
        self.trigger.value(0)
        try:
            pulse_time = machine.time_pulse_us(self.echo, 1, self.echo_timeout_us)
            return pulse_time
        except OSError as ex:
            if ex.args[0] == 110: # 110 = ETIMEDOUT
                raise OSError('Out of range')
            raise ex

    def distance_mm(self):
        """
        Get the distance in milimeters without floating point operations.
        """
        pulse_time = self._send_pulse_and_wait()

        # To calculate the distance we get the pulse_time and divide it by 2 
        # (the pulse walk the distance twice) and by 29.1 becasue
        # the sound speed on air (343.2 m/s), that It's equivalent to
        # 0.34320 mm/us that is 1mm each 2.91us
        # pulse_time // 2 // 2.91 -> pulse_time // 5.82 -> pulse_time * 100 // 582 
        mm = pulse_time * 100 // 582
        return mm

    def distance_cm(self):
        """
        Get the distance in centimeters with floating point operations.
        It returns a float
        """
        pulse_time = self._send_pulse_and_wait()

        # To calculate the distance we get the pulse_time and divide it by 2 
        # (the pulse walk the distance twice) and by 29.1 becasue
        # the sound speed on air (343.2 m/s), that It's equivalent to
        # 0.034320 cm/us that is 1cm each 29.1us
        cms = (pulse_time / 2) / 29.1
        return cms

Após isso,podemos implementar nosso programa main:

from hcsr04 import HCSR04 ## Da biblioteca que criamos importamos HCSR04
import time # Importamos a biblioteca tempo

sensor = HCSR04(trigger_pin=4, echo_pin=0) ## Criamos um objeto sensor com os parametros indicando o pino trigger e echo.O trigger é o pino encarregado de emitir o sinal ultrassom e o echo de receber

while True:
    distance = sensor.distance_cm() # Aqui criamos a variavel distancia como a leitura do sensor convertendo para centimetros
    if distance<5: # Se a distância é menor que 5 cm 
        print('Menor que 5')
    else:
        print('Maior que 5')

    print('Distance:', distance, 'cm') # Imprime a distancia no serial
    time.sleep(1)