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!