Ultrasonic sensor HC-SR04 only returning 0cm on ESP32

Hello, this is my first post here.

I’m using HC-SR04 ultrasonic sensor to measure distance from the sensor to my face/RFID card, but my sensor kept returning 0cm, and rarely 343 or 2 cm which in fact is incorrect from my observation.

Below is my full coding for the my project. I’ve already managed to display the distance measurement on the Blynk app widget (gauge) with the help of Blynk Community, but now my problem is the accuracy of the HC-SR04 sensor.

#define BLYNK_TEMPLATE_ID "REDACTED"
#define BLYNK_DEVICE_NAME "REDACTED"
#define BLYNK_AUTH_TOKEN "REDACTED"

#define BLYNK_PRINT Serial
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
#include <WiFi.h>
#include <IOXhop_FirebaseESP32.h>
#include <SPI.h>
#include <RFID.h>
#include <Keypad.h>
#include <Password.h>
#include <ESP32_Servo.h>

char auth[] = BLYNK_AUTH_TOKEN;
#define FIREBASE_HOST "REDACTED"
#define FIREBASE_AUTH "REDACTED"
#define WIFI_SSID "REDACTED"
#define WIFI_PASSWORD "REDACTED"

#define SS_PIN 2
#define RST_PIN 4
#define relay 15
#define buzzer 5
#define ledR 22
#define ledG 21
#define echoPin 12
#define trigPin 13

long duration;
int range; 

RFID rfid(SS_PIN, RST_PIN);
Password password = Password("REDACTED");
Servo myservo;
int servoPin = 15;
int serNum[5];
String card = "";
String cardID = "REDACTED";
int stepp = 0;
int btt = 32;
int bt = 1;

int j = 0;
int con1 = 0;

const byte ROWS = 4; // Four rows
const byte COLS = 3; // Four columns
char keys[ROWS][COLS] = {
  {'1', '2', '3', },
  {'4', '5', '6', },
  {'7', '8', '9', },
  {'*', '0', '#', }
};

byte rowPins[ROWS] = {14, 27};
byte colPins[COLS] = {26, 25, 33,};
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
BlynkTimer timer;

BLYNK_WRITE(V0)
{
  int pinValue = param.asInt();
  Serial.print("V1 Slider value is: ");
  Serial.println(pinValue);
  if (pinValue == 1) {
    myservo.write(180);
    delay(3000);
    myservo.write(0);
  }
}

void ultra()
{
    digitalWrite(echoPin, LOW);
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);
    range = duration/58.2; //formula to calculate the distance for ultrasonic sensor
    Serial.print("Distance: ");
    Serial.println(range);
    Blynk.virtualWrite(V8, range);
}

BLYNK_READ(V8)
{
  Blynk.virtualWrite(8, range);
}

void setup() {
  Serial.begin(115200);
  pinMode(34, INPUT);
  pinMode(trigPin, OUTPUT); 
  pinMode(echoPin, INPUT);
  pinMode(relay, OUTPUT);
  pinMode(buzzer, OUTPUT);
  pinMode(ledR, OUTPUT);
  pinMode(ledG, OUTPUT);
  pinMode(btt, INPUT_PULLUP);
  digitalWrite(buzzer, LOW);
  digitalWrite(ledR, LOW);
  digitalWrite(ledG, LOW);
  timer.setInterval(1000, ultra); 
  myservo.attach(servoPin);
  myservo.write(0);
  SPI.begin();
  rfid.init();
  keypad.setDebounceTime(50);
  keypad.addEventListener(keypadEvent);
  delay(5);
  // connect to wifi.
  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
  Blynk.begin(auth, WIFI_SSID, WIFI_PASSWORD);
  timer.setInterval(200L, myTimerEvent);
  timer.setInterval(1000L, cam);
  Firebase.setInt("con", 0);
}

void loop()
{
  Blynk.run();
  timer.run(); // Initiates BlynkTimer
}

void cam() {
  bt = digitalRead(btt);
  Serial.println(bt);
  if (bt == 0) {
    if (stepp == 0) {
      int statee = Firebase.getInt("con");
      Serial.println(statee);
      if (statee == 1) {
        digitalWrite(ledR, LOW);
        digitalWrite(ledG, HIGH);
        Serial.println("    WELCOME     ");
        Firebase.setInt("con", 0);
        stepp = 1;
        digitalWrite(ledR, LOW);
        digitalWrite(ledG, HIGH);
        //delay(1500);
      }
      else if (statee == 2) {
        Blynk.logEvent("intruder");
        digitalWrite(ledR, HIGH);
        digitalWrite(ledG, LOW);
        digitalWrite(buzzer, HIGH);
        Firebase.setInt("con", 0);
        delay(3000);
        digitalWrite(buzzer, LOW);
        digitalWrite(ledR, LOW);
        digitalWrite(ledG, LOW);
      }
      else {
        Serial.println("ok");
        //      stepp = 0;
      }
    }
  }
}

void myTimerEvent() {
  if (bt == 0) {
    if (stepp == 0) {
      if (rfid.isCard()) {
        if (rfid.readCardSerial()) {
          card += rfid.serNum[0]; card += rfid.serNum[1]; card += rfid.serNum[2]; card += rfid.serNum[3]; card += rfid.serNum[4];
          digitalWrite(buzzer, HIGH);
          delay(200);
          digitalWrite(buzzer, LOW);
          Serial.println(card);
          if (card == cardID) {
            Serial.println("    WELCOME     ");
            stepp = 1;
            digitalWrite(ledR, LOW);
            digitalWrite(ledG, HIGH);
            delay(1500);
          }
          else {
            Blynk.logEvent("intruder");
            digitalWrite(ledR, HIGH);
            digitalWrite(ledG, LOW);
            digitalWrite(buzzer, HIGH);
            delay(3000);
            digitalWrite(ledR, LOW);
            digitalWrite(ledG, LOW);
            digitalWrite(buzzer, LOW);
            stepp = 0;
          }
        }
      }
    }
    else {
      keypad.getKey();
    }
    card = "";
    rfid.halt();
  }
}
//
void keypadEvent(KeypadEvent eKey) {
  switch (keypad.getState()) {
    case PRESSED:
      digitalWrite(buzzer, HIGH);
      delay(150);
      digitalWrite(buzzer, LOW);
      Serial.print(eKey);
      switch (eKey) {
        case '#':
          checkPassword();
          break;
        default:
          password.append(eKey);
      }
  }
}

void checkPassword() {
  if (password.evaluate()) {
    Blynk.logEvent("unlock");
    Serial.println("granted");
    digitalWrite(ledR, LOW);
    digitalWrite(ledG, HIGH);
    password.reset();
    stepp = 0;
    myservo.write(180);
    delay(3000);
    digitalWrite(ledR, LOW);
    digitalWrite(ledG, LOW);
    myservo.write(0);
  }
  else {
    Blynk.logEvent("intruder");
    digitalWrite(ledR, HIGH);
    digitalWrite(ledG, LOW);
    digitalWrite(buzzer, HIGH);
    delay(2000);
    digitalWrite(ledR, LOW);
    digitalWrite(ledG, LOW);
    digitalWrite(buzzer, LOW);
    Serial.println("denied");
    password.reset();
    stepp = 0;
  }
}

I purposedly remove the first and second row pin for the keypad to make room for the ultrasonic sensor. Thank you!

Please edit your post, and add triple backticks ``` before and after your whole sketch.

2 Likes

@O_Neil Please edit your post, using the pencil icon at the bottom, and add triple backticks at the beginning and end of your code so that it displays correctly.
Triple backticks look like this:
```

Copy and paste these if you can’t find the correct symbol on your keyboard.

Pete.

1 Like

Have you omitted some of your code at the beginning? If so then you need to include it, but remove sensitive detains, preferably by replacing them with the word “REDACTED”

Pete.

1 Like

Yes. Thank you for the information.

Thank you for the info.

So you don’t have the firmware configuration code from the Blynk Device Info tab in your sketch?

Pete.

I have but I removed it before posting.

Pete.

Done. Thank you.

What does this mean?

Pete.

I don’t see any call to ultra function :thinking:

It is in there, but in a weird place in void setup…

Pete.

1 Like