This is a project to control a entrance gate with the help of android app without any physical work. I have created some simple steps to achieve this goal please take a look.

Step 1:

Creating server on ESP32 to get input from App

#include “WiFi.h”

const char* ssid = “Gate”;

const char* password =  “vigyanashram”;

WiFiServer server(80);

const int relay_1 = 2;

const int relay_2 = 4;

void processReceivedValue(char command){

  if(command == ‘1’){ digitalWrite(relay_1, LOW); }

  else if(command == ‘2’){ digitalWrite(relay_2, LOW);}

  else if(command == ‘0’) {digitalWrite(relay_1, HIGH); digitalWrite(relay_2, HIGH);}

   return;

}

void setup() {

  Serial.begin(115200);

  delay(1000);

  WiFi.softAP(ssid, password);

//  while (WiFi.status() != WL_CONNECTED) {

//    delay(1000);

//    Serial.println(“Connecting to WiFi..”);

//  }

  Serial.println(“Connecte to IP”);

  Serial.println(WiFi.softAPIP());

  server.begin();

  pinMode(relay_1, OUTPUT);

  digitalWrite(relay_1, HIGH);

  pinMode(relay_2, OUTPUT);

  digitalWrite(relay_2, HIGH);

}

void loop() {

  WiFiClient client = server.available();

  if (client) {

    Serial.write(“Client connected”);

    while (client.connected()) {

      while (client.available()>0) {

        char c = client.read();

        processReceivedValue(c);

        Serial.write(c);

      }

      delay(10);

    }

    client.stop();

    Serial.println(“Client disconnected”);

  }

}

Step 2:

App code in android Studio

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    btn = (Button) findViewById(R.id.button);
    btn2 = (Button) findViewById(R.id.button2);
    btn3 = (Button) findViewById(R.id.button3);
    ssid = (EditText) findViewById(R.id.edittext_ssid);
    pass = (EditText) findViewById(R.id.edittext_pass);
    ip_address = (EditText) findViewById(R.id.edittext_pass);
    String SSID = ssid.getText().toString();
    String PASS = pass.getText().toString();
    WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
    WifiConfiguration wifiConfiguration = new WifiConfiguration();
    Toast.makeText(getApplicationContext(), "Please Turn OFF Mobile Data", Toast.LENGTH_LONG);


    wifiManager.setWifiEnabled(true);
    wifiConfiguration.SSID = String.format("\"%s\"", SSID);
    wifiConfiguration.preSharedKey = String.format("\"%s\"", PASS);

    int netId = wifiManager.addNetwork(wifiConfiguration);
    wifiManager.disconnect();
    wifiManager.enableNetwork(netId, true);
    wifiManager.reconnect();



    btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new UPThread()).start();
            btn2.setVisibility(View.INVISIBLE);

        }
    });

    btn3.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new STOPThread()).start();
            btn.setVisibility(View.VISIBLE);
            btn2.setVisibility(View.VISIBLE);
        }
    });

    btn2.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            new Thread(new DOWNThread()).start();
            btn.setVisibility(View.INVISIBLE);
        }
    });

}


private PrintWriter output;
private BufferedReader input;
class UPThread implements Runnable{
    @Override
    public void run() {
        String ipAdress = "192.168.4.1";
        try {
            socket = new Socket(ipAdress, 80);
            output = new PrintWriter(socket.getOutputStream());
            output.write("1");
            output.flush();
            socket.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
class DOWNThread implements Runnable{
    @Override
    public void run() {
        String ipAdress = "192.168.4.1";
        try{
            socket = new Socket(ipAdress, 80);
            output = new PrintWriter(socket.getOutputStream());
            output.write("2");
            output.flush();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}
class STOPThread implements Runnable{
    @Override
    public void run() {
        String ipAdress = "192.168.4.1";
        try{
            socket = new Socket(ipAdress, 80);
            output = new PrintWriter(socket.getOutputStream());
            output.write("0");
            output.flush();
            socket.close();
        }catch (IOException e){
            e.printStackTrace();
        }
    }
}

App Interface:-

Step 3:

Circuit Diagram:

Circuit Diagram

Motor Connections:-

Casing:-

Difficulties:-

  1. Difficulties occur in app development. The app world automatically on android version lower than 10.
  2. Creating a socket client in android app is a difficult part which I have cleared.
  3. Motor connections are complex to connect push buttons and IOT setup parallelly.

Sources:-

https://github.com/Himanshu495-rada/Automatic_Gate/blob/main/app-release.apk