surya ramadhan
Published © GPL3+

Distance Detector & Touchless Door for Infection Prevention

This device will measure distace and gives feedback if it's too close to another device. it also work as your house key.

BeginnerFull instructions provided24 hours3,867
Distance Detector & Touchless Door for Infection Prevention

Things used in this project

Hardware components

Rechargeable Battery, Lithium Ion
Rechargeable Battery, Lithium Ion
×1
Pushbutton Switch, Momentary
Pushbutton Switch, Momentary
×1
Plastic Enclosure, Hand-Held Plastic Box Style 1
Plastic Enclosure, Hand-Held Plastic Box Style 1
×1
Buzzer
Buzzer
×1
Switch Actuator, Head for spring return push-button
Switch Actuator, Head for spring return push-button
×1
NodeMCU ESP8266 Breakout Board
NodeMCU ESP8266 Breakout Board
×1
WEMOS R1 D32
×1
Wemos D1 Mini
Espressif Wemos D1 Mini
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Cable Stripping Tool for BNC Connector Cables, Three Step
Cable Stripping Tool for BNC Connector Cables, Three Step
Soldering iron (generic)
Soldering iron (generic)
Solder Wire, Lead Free
Solder Wire, Lead Free

Story

Read more

Schematics

Board Sch

Schematics

Code

Custom Access Point

C/C++
Customized Access Point
Device: ESP8266
#include <ESP8266WiFi.h>
#include <WiFiClient.h>

// SSID & PASS
const char *ssid = "hackster";
const char *password = "hackster123";
void client_scan(void);
// Register your device MAC here
char my_phone[18] = "E0:1F:88:66:4E:2E";
char my_device[18] = "BC:DD:C2:DF:8A:38";

void setup() 
{
  delay(1000);
  Serial.begin(115200);
  WiFi.softAP(ssid, password);
}

void loop() 
{
  // Do network scan
  client_scan();
  delay(2000);
}

void client_scan(void) 
{
  unsigned char number_client;
  struct station_info *stat_info;
  String result;
  char wifiClientMac[18];
  int i=1;
  int door = -1;
  
  number_client= wifi_softap_get_station_num();
  stat_info = wifi_softap_get_station_info();
  Serial.print(" Total Connected Clients are = ");
  Serial.println(number_client);
  while (stat_info != NULL) 
  {
    result += "Client ";
    result += String(i);
    result += " = ";
    result += IPAddress(stat_info->ip).toString();
    result += " - ";
    sprintf(wifiClientMac, "%02X:%02X:%02X:%02X:%02X:%02X", MAC2STR(stat_info->bssid));
    result += wifiClientMac;
    stat_info = STAILQ_NEXT(stat_info, next);
    i++;
    Serial.println(result);
    Serial.println();
    // do unlock by compare the MAC client 
    door = strcmp(wifiClientMac,my_phone)*strcmp(wifiClientMac,my_device);
    if (door == 0)
    {
      // Open the door
      Serial.println("the door is opened");
      // Then use GPIO to drive your Door Opener, drive a motor, ETC
    }
    else
    {
      // unidentified device
      Serial.println("Unregistered Device");
    }
    //Serial.printf("%i",door);
    wifi_softap_free_station_info();
  }
  delay(500);
}

Main Code

C/C++
Main code of this project
Device: ESP32
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>
#include <BLEScan.h>
#include <BLEAdvertisedDevice.h>
#include <WiFi.h>
#include <Arduino.h>

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

//#define SERVICE_UUID        "34221389-d113-480a-b34f-a7aa3c5a7513"
//#define CHARACTERISTIC_UUID "672c6e72-b0b1-43f9-87ec-4be40f8af113"
#define SERVICE_UUID        "d218b592-3b8c-471f-bedb-ee5943dcb1b9"
#define CHARACTERISTIC_UUID "e0df84b6-0257-4feb-abda-6b87f54b7f06"


int scanTime = 2; //In seconds
BLEScan* pBLEScan;
void set_as_broadcaster(void);
void set_as_observer(void);
void rrsi_calculation(void);
void warning_alarm(void);
void open_door(void);

////// RSSI Calculation constants /////
float A = 55; 
float NLog = 0.72;
float Dist = 0.0; // distance
int8_t RSSI_Val = 0;
bool interrupt = false;
const char * ssid = "hackster";
const char * password = "hackster123";

class MyAdvertisedDeviceCallbacks: public BLEAdvertisedDeviceCallbacks 
{
    void onResult(BLEAdvertisedDevice advertisedDevice) 
    {
      Serial.println(advertisedDevice.toString().c_str());
      Serial.print("RSSI: ");
      RSSI_Val = advertisedDevice.getRSSI();
      Serial.println(RSSI_Val);
      Serial.print("TX Power: ");
      Serial.println(advertisedDevice.getTXPower());
      // doing detection
      rrsi_calculation();
    }
};

void IRAM_ATTR isr() 
{
    interrupt = true;
}

void setup() 
{
  pinMode(4, OUTPUT);
  pinMode(0, INPUT_PULLUP);
  digitalWrite(4, LOW);
  attachInterrupt(0, isr, FALLING);
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
}

void loop() 
{
  // put your main code here, to run repeatedly:
  set_as_broadcaster();
  set_as_observer();
  if (interrupt){open_door();} // open the door
}

void set_as_broadcaster(void)
{
  BLEDevice::init("ble broadcaster");
  //BLEDevice::setPower(ESP_PWR_LVL_P4);
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("This is Broadcaster");
  pService->start();
  // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("BLE Broadcaster RUN");
  delay(10000);
  BLEDevice::deinit(0);
}

void set_as_observer(void)
{
    BLEDevice::init("");
    //BLEDevice::setPower(ESP_PWR_LVL_P4);
    pBLEScan = BLEDevice::getScan(); //create new scan
    pBLEScan->setAdvertisedDeviceCallbacks(new MyAdvertisedDeviceCallbacks());
    pBLEScan->setActiveScan(true); //active scan uses more power, but get results faster
    pBLEScan->setInterval(100);
    pBLEScan->setWindow(99);  // less or equal setInterval value
    for (int i=0;i<10;i++)
    {
      pBLEScan->start(scanTime, false);
      pBLEScan->clearResults();   // delete results fromBLEScan buffer to release memory
      delay(1000);
    }
    BLEDevice::deinit(0);
}

void rrsi_calculation(void)
{
  // formula. RSSI = (-1)*(10*Nlog10*Dist+A)
  // for distance then, Dist = RSSI-A/(10*Nlog10)
  Dist = abs(abs((float)RSSI_Val)-A)/7.2;
  Serial.println(Dist);
  if (Dist<3.0)
  {
    // doing alarm
    digitalWrite(4, HIGH);   
    delay(300);                        
    digitalWrite(4, LOW);    
    Serial.println("your distance is : ");
    Serial.println(Dist);
    Serial.println("Move to safe distance!");
  }
}

void open_door(void)
{
  // when interrupt happens, -> open the door
  // steps: 1. wake the wifi up,connect to ssid 
  // 2. connect to udp server
  // when everythings ok, then open the door
  // to avoid crashing, deinit ble first
  interrupt = false;
  BLEDevice::deinit(0);
  btStop();
  delay(1000);
  Serial.println("Hoodooor");
  WiFi.begin(ssid, password);
  delay(1000);
  while (WiFi.status() != WL_CONNECTED) 
  {
    Serial.println("WiFi Failed to connect");
    Serial.println("Check yout SSID and Password");
    delay(2000);
  }
  delay(5000);
  // turn off wifi
  WiFi.disconnect();
  WiFi.mode(WIFI_OFF);

  delay(1000);
  btStart();
  set_as_observer();
}

BLE Broadcaster

C/C++
Device: ESP32
#include <BLEDevice.h>
#include <BLEUtils.h>
#include <BLEServer.h>

// See the following for generating UUIDs:
// https://www.uuidgenerator.net/

#define SERVICE_UUID        "4fafc201-1fb5-459e-8fcc-c5c9c331914b"
#define CHARACTERISTIC_UUID "beb5483e-36e1-4688-b7f5-ea07361b26a8"

void set_as_broadcaster(void);

void setup() 
{
  Serial.begin(115200);
  Serial.println("Starting BLE work!");
  set_as_broadcaster();
}

void loop() {
  // put your main code here, to run repeatedly:
  delay(1000);
}

void set_as_broadcaster(void)
{
  BLEDevice::init("ble server");
  //BLEDevice::setPower(ESP_PWR_LVL_P7);
  BLEServer *pServer = BLEDevice::createServer();
  BLEService *pService = pServer->createService(SERVICE_UUID);
  BLECharacteristic *pCharacteristic = pService->createCharacteristic(
                                         CHARACTERISTIC_UUID,
                                         BLECharacteristic::PROPERTY_READ |
                                         BLECharacteristic::PROPERTY_WRITE
                                       );

  pCharacteristic->setValue("Hello World");
  pService->start();
  // BLEAdvertising *pAdvertising = pServer->getAdvertising();  // this still is working for backward compatibility
  BLEAdvertising *pAdvertising = BLEDevice::getAdvertising();
  pAdvertising->addServiceUUID(SERVICE_UUID);
  pAdvertising->setScanResponse(true);
  pAdvertising->setMinPreferred(0x06);  // functions that help with iPhone connections issue
  pAdvertising->setMinPreferred(0x12);
  BLEDevice::startAdvertising();
  Serial.println("Characteristic defined! Now you can read it in your phone!");
}

Repository

Credits

surya ramadhan

surya ramadhan

10 projects • 12 followers
Embedded System Enthusiast
Thanks to Neil Kolban and Evandro Copercini & chegewara.

Comments