David Smerkous
Published © Apache-2.0

IoT arduino ESP Garage Door opener (UD)

Use your android smartphone to open and close your garage door reliably (Under Development)

IntermediateWork in progress20,496
IoT arduino ESP Garage Door opener (UD)

Things used in this project

Hardware components

Arduino Nano R3
Arduino Nano R3
×1
ESP8266 ESP-01
Espressif ESP8266 ESP-01
×1
10 uf Capacitor
×1
0.1uf Capacitor
×1
Breadboard (generic)
Breadboard (generic)
×1
Jumper wires (generic)
Jumper wires (generic)
×1

Software apps and online services

Arduino IDE
Arduino IDE

Hand tools and fabrication machines

Computer
Soldering iron (generic)
Soldering iron (generic)

Story

Read more

Schematics

Schematic

Here is the Wiring for the Garage Door

Code

GarageUnfinished

C/C++
Upload this to your Arduino
void(* resetFunc) (void) = 0;
#include <ESP8266.h>
#include <SoftwareSerial.h>
#include <EEPROM.h>

//Values most likely needed to be edited//
#define SSID        "SSID"       //Your router SSID
#define PASSWORD    "PASSWORD"    //Your router Password
#define serverIP    "IP" //Your modules IP
#define gateWay     "IP"  //Gateway
#define PORT        8080          //The port that your using(Make sure your router is port forwarded for your phone)
#define debug       true          //Put false if youre arduino is not connected to your computer
#define COMBaud     115200        //Put the computer baudrate(make sure in Serial monitor it's also 115200)
#define ESPBaud     9600          //Don't mess with this unless either switching to hardware serial or ESP only supports 115200
#define RGBs        true          //If you have RGB LED connected   //MAKE SURE YOUR ESP AND ARDUINO HAVE THE SAME BAUDRATE!(Check first)
#define RedGB       3             //Pin for red LED
#define RGreenB     5             //Pin for Green LED
#define RGBlue      4             //Pin for Blue LED
#define Solenoid    11            //The solenoid pin
#define GarageOCT   8000          //The time in Ms for the garage open and close time (Usually 8 seconds)
#define defaultState false        //Once powered up what state will the garage be...(false=Open, true=Close)
#define ServerTimeout  13         //The time it takes for 
//End of most likely

SoftwareSerial ESPSerial(10, 11); //Arduino Rx to Tx on ESP, ESP Rx to Resistors to Arduino Tx

ESP8266 wifi(ESPSerial, ESPBaud); //This library was modified so just use the one I am using to make it work

bool state; //Set value above to global non static value
int first = 0;
int baudaddr = 1;
int states = 2; //Make sure your EEPROM IS CLEAR FOR THIS TO WORK or phone will get weird answers!!!!
byte firstes;
byte baudaddres;
byte stateses;

void setup()
{
    firstes = EEPROM.read(first);
    baudaddres = EEPROM.read(baudaddr); //Read the EEPROM values for index of 0, 1, 2
    stateses = EEPROM.read(states);
    if(RGBs) //If RGBs are enabled open the pins
    {
      pinMode(RedGB, OUTPUT);
      pinMode(RGreenB, OUTPUT); //Start RGBs
      pinMode(RGBlue, OUTPUT);
      off(); //Turn them all off
    }
    if(debug) //Option above for computer debugging
    {
    Serial.begin(COMBaud); //Start at Buadrate above
    while(!Serial);
    delay(500); //Since Serial is Asyncronous sometimes you might get some jumbled unwanted crap from the arduino
    Serial.println("Started Garage System\nGoing Station mode");
    Serial.println("Current Version: " + (String) wifi.getVersion().c_str()); //Get all the board info such as manufacturer 
    }
    else
    {
      wifi.getVersion().c_str(); //This has to be runned anyway
    }
    if (wifi.setOprToStation()) { //Make sure when switching modes everything goes right
        if(debug)
        {
        Serial.println("Station Mode okay");
        }
    } else {
        if(debug)
        Serial.println("Station Mode Not okay");
        error();
    }
    if(firstes != 5) //If any value but 5
    {
      if(baudaddres != ESPBaud) // and the current ESP baud is not the same
    {
      if(wifi.setUart(ESPBaud, 2)) //Tell the device to change the baud
      {
        if(debug)
        Serial.println("Welcome first I automatically changed the baud for you");
        
      }
      else
      {
        if(debug)
        Serial.println("Sorry first timer, there was an error changing the baud");
        error();
      }
      EEPROM.write(baudaddr, ESPBaud); //EEPROM the new baud(Optional) 
    }
    if(stateses != 1 || stateses != 2) //Set default state if there already isn't one
    {
      if(!defaultState)
      {
        EEPROM.write(states, 1);
        states = false;
      }
      else
      {
        EEPROM.write(states, 2);
        states = true;
      }
    }
    EEPROM.write(first, 5); //Make the first time finished
    }
    else //Call this if it isn't the first time
    {
      if(stateses == 1) //Remember false is open so 1 is open
      {
        states = false;
      }
      else //Remember that true is closed so 2 is closed
      {
        states = true;
      }
    }
    if(debug)
       Serial.println("Attempting to connect to router");
    if (wifi.joinAP(SSID, PASSWORD)) { //Connect to a router with specified SSID and PASSWORD
        if(debug)
        {
        Serial.println("Connection succesful\nIp Address");
        Serial.println(wifi.getLocalIP().c_str()); //Print current address for easier use
        }
        else
        {
          wifi.getLocalIP().c_str(); //Just to be safe call this command even when debug isn't on
        }
    } else {
        if(debug)
        Serial.println("Connection failed");
        error();
    }
    if(debug)
    Serial.println("Setting mode to static");
    if(wifi.setStationIp(serverIP, gateWay, "255.255.255.0")) //Go from DHCP to Static
    {
      if(debug)
      Serial.println("Success to moving into static");
    }
    else
    {
      if(debug)
      Serial.println("Error going into static mode");
      error();
    }
    if(debug)
       Serial.println("Trying to allow multiple clients");
    if (wifi.enableMUX()) { //AT+MUX= 0 or 1, 0 meaning only one client 1 meaning multiple
        if(debug)
        Serial.println("Multiple activated");
    } else {
        if(debug)
        Serial.println("Multiple activation error");
        error();
    }
    
    if (wifi.startTCPServer(PORT)) { //Start a TCP server the AT command for this is AT+CIPSTART="TCP", PORT
        if(debug)
        Serial.println("Started TCP server on port: " + (String) PORT);
    } else {
        if(debug)
        Serial.println("Failed to start on port: " + (String) PORT);
        error();
    }
    
    if (wifi.setTCPServerTimeout(ServerTimeout)) { //Set a timeout for a packet so it doens't just sit there stupidly
        //if(debug)
        //Serial.println("Set timeout for: " + (String) ServerTimeout);
    } else {
        if(debug)
        Serial.println("Couldn't set up timeout");
        error();
    }
    if(debug)
    Serial.println("Setup complete READY for input\n\n\nThe Current garage State is " + (String) state);
    start();
}
 
void loop()
{
    uint8_t buffer[128] = {0}; //The buffer (Array) to insert from TCP packet
    uint8_t Client_ID;         //Init var for the Client ID
    String packet = "";        //The final outcome of the packet
    uint32_t lengths = wifi.recv(&Client_ID, buffer, sizeof(buffer), 100); //Return the length of the packet
    if (lengths > 0) { //If larger than zero than move along
        if(debug) 
        Serial.println("Status" + (String) wifi.getIPStatus().c_str() +"\nFrom Client #: " + Client_ID); //Send current connection status
        for(uint32_t i = 0; i < lengths; i++) {
            packet += ((char)buffer[i]); //Place the lengths into a buffer
        }
        recP(); //Indicate with RGBs
        if(debug)
         Serial.println("The Packet info was: " + (String) packet);
         int ifNum = atoi(packet.c_str()); //Look at method below
        if(ifNum == 5)
        {
          //Open packet
          if(debug)
          Serial.println("Got open/close packet\nStarted timer for " + (String)GarageOCT + " Ms");
                    digitalWrite(Solenoid, LOW);
          delay(1200);
          digitalWrite(Solenoid, HIGH);
          for(int a = 0; a < GarageOCT - 1200; a++) //Wait for garage to change state
            delay(1);
          if(debug)
          Serial.println("Finished timer the state has now changed");
          state = !state; //Make the state not the state
          int eep = 1; //Write open
          if(state)//If closed
          {
            eep = 2; //Write closed
          }
          EEPROM.update(states, eep); //Write to EEPROM the state just incase the device shuts off
        }
        else if(ifNum == 1)
        {
         //GetState packet
         if(debug)
         Serial.println("Got getstate packet, state is: " + (String) state);
         int sends = 2; //Opened
          if(state) //If closed
          {
            sends = 3; //Closed
          }
          sendPacket(sends, Client_ID); //Send back the current state 3 open 3 closed
          pass();
        }
        else if(ifNum == 2)
        {
          pass();
          if(debug)
          Serial.println("Device received correct packet");//Device got the packet
        }
        else if(ifNum == 7)
        {
          Serial.println("RESETING");
          delay(500);
          resetFunc();
        }
        else
        {
          if(debug)
          Serial.println("Got error packet"); //Don't read an odd number to me!!
          sendPacket(0, Client_ID); //The phone waits for a recall so send 0 which means error
          error();
        }
        if(debug)
        {
        Serial.print("Status:[");
        Serial.print(wifi.getIPStatus().c_str()); //Print current status
        Serial.println("]");
        }
    }
}

bool sendPacket(int num, uint8_t Client_ID){  //A Function where you can integers back
      sendP();
      bool pass = false; 
      uint8_t buffer[1] = {0}; //Stick in a buffer that is only the size of 1;
      if(num == 0)
      {
      buffer[0] = (char)'0';
      }
      else if(num == 1)
      {
        buffer[0] = (char)'1';   //Putting directly got sometimes buggy so i did some if statements
      }
      else if(num == 2)
      {
        buffer[0] = (char)'2';
      }
      else if(num == 3)
      {
        buffer[0] = (char)'3';
      }
      
        if(wifi.send(Client_ID, buffer, 1)) { //wifi.send(<Id>,<buffer>,<size>)
         if(debug)
         Serial.println("Sent Back okay");
         pass = true;
        } else {
            if(debug)
            Serial.println("There was an error sending the packet");
            pass = false;
        }
        
        if (wifi.releaseTCP(Client_ID)) { //If using Java this is needed because stream reader has to get closed to actually finish reading if you modified this for the computer (Python, etc...) remove it because it will show an error
            if(debug)
            Serial.println("Realeased Client " + (String) Client_ID + "Success");
            pass = true;
        } else {
            if(debug)
            Serial.print("There was an Error trying to release Client " + Client_ID);
            pass = false;
        }
        stopP();
        return pass;
}

//Below are all the RGBs for "light" debugging
void error() {
  if(RGBs)
  {
  digitalWrite(RGBlue, HIGH);
  digitalWrite(RedGB, LOW);
  delay(900);
  digitalWrite(RedGB, HIGH);
  digitalWrite(RGBlue, LOW);
  }
}

void pass() {
  if(RGBs)
  {
  digitalWrite(RGBlue, HIGH);
  digitalWrite(RGreenB, LOW);
  delay(900);
  digitalWrite(RGreenB, HIGH);
  digitalWrite(RGBlue, LOW);
  }
}

void sendP() {
  if(RGBs)
  {
  digitalWrite(RedGB, LOW);
  }
}

void stopP() {
  if(RGBs)
  {
  digitalWrite(RedGB, HIGH);
  }
}

void recP() {
  if(RGBs)
  {
  digitalWrite(RGreenB, LOW);
  delay(500);
  digitalWrite(RGreenB, HIGH);
  }
}

void start() {
  if(RGBs)
  {
  digitalWrite(RGBlue, LOW);
  }
}

void off() {
  digitalWrite(RedGB, HIGH);
  digitalWrite(RGreenB, HIGH);
  digitalWrite(RGBlue, HIGH);
}

Java MainActivity

XML
The activity for the app
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/get"
        android:id="@+id/sendbutton"
        android:layout_marginBottom="74dp"
        android:layout_alignParentBottom="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:textStyle="bold|italic" />

    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/imageView"
        android:src="@drawable/opened"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_above="@+id/sendbutton"
        android:layout_below="@+id/space"
        android:contentDescription="@string/desc" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/getstate"
        android:id="@+id/update"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />

    <Space
        android:layout_width="20dp"
        android:layout_height="80dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:id="@+id/space"
        android:focusableInTouchMode="true"
        android:layout_toLeftOf="@+id/settings"
        android:layout_toStartOf="@+id/settings" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="@string/getting"
        android:id="@+id/infoss"
        android:layout_above="@+id/sendbutton"
        android:layout_centerHorizontal="true" />

    <Button
        style="?android:attr/buttonStyleSmall"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/set"
        android:id="@+id/settings"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

Java Settings Activity

XML
Java XML file for settings activity
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context="com.studyarduino.garagedoor.SettingsActivity"
    android:id="@+id/d">

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/privateIp"
        android:layout_alignParentTop="true"
        android:layout_marginTop="42dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:hint="@string/priv" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/publicIp"
        android:layout_below="@+id/privateIp"
        android:layout_marginTop="42dp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignRight="@+id/privateIp"
        android:layout_alignEnd="@+id/privateIp"
        android:hint="@string/pub" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/garageoct"
        android:layout_marginTop="42dp"
        android:layout_below="@+id/publicIp"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:hint="@string/gar" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/save"
        android:id="@+id/save"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/refresh"
        android:hint="@string/ref"
        android:layout_marginTop="42dp"
        android:layout_below="@+id/garageoct"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/need"
        android:id="@+id/needhelp"
        android:layout_below="@+id/Port"
        android:layout_alignRight="@+id/save"
        android:layout_alignEnd="@+id/save" />

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceMedium"
        android:text="@string/contact"
        android:id="@+id/contactme"
        android:layout_below="@+id/needhelp"
        android:layout_centerHorizontal="true" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/Port"
        android:layout_below="@+id/refresh"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="42dp"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:hint="@string/port" />

</RelativeLayout>

Java MainActivity (Java not XML)

Java
The java code for the activity
package com.studyarduino.garagedoor;

import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.AsyncTask;
import android.os.Build;
import android.os.Environment;
import android.os.Looper;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Properties;

import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;


public class MainActivity extends ActionBarActivity {

    public static Properties props;
    public static boolean pass = false;
    public static volatile Button button;
    public static volatile ImageView states;
    public static volatile TextView info;
    public static InetAddress Addr;
    public static int PORT = 8080, Refresh = 20, garageopenclosetime = 8000;
    public static String IP = "PUT PRIV IP", path, state = "", PubIP = "PUT PUB IP";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState); //Return to previous state
        setContentView(R.layout.activity_main); //Set the view

        //Map the Gui to the backend
        states = (ImageView) findViewById(R.id.imageView);
        info = (TextView) findViewById(R.id.infoss);
        button = (Button) findViewById(R.id.sendbutton);
        Button SETTINGS = (Button) findViewById(R.id.settings);
        //End of Mapping

        //Almost the Same as the Settings Activity
        props = new Properties();
        directory();
        if(!(new File(path).exists()))
            try{
                String[] starting = {"", "", "", "", ""};
                write(starting);
            } catch (Exception ignored) {}

        String[] data = read();
        if(data[0].length() > 2 && data[0] != null)
            IP = data[0];

        if(data[1].length() > 2 && data[1] != null)
            PubIP = data[1];

        if(data[2].length() > 2 && data[2] != null)
            garageopenclosetime = Integer.parseInt(data[2]);

        if(data[3].length() > 1 && data[3] != null)
            Refresh = Integer.parseInt(data[3]);

        if(data[4].length() > 1 && data[4] != null)
            PORT = Integer.parseInt(data[4]);

        //End of Properties


        Log.d("Properties", "The path to the Properties is " + path); //Log the path
        Log.d("Properties", "The values are IP: " + IP + " PORT: " + PORT + " GarageOCT: " + garageopenclosetime + " Refresh: " + Refresh); //Log the Values


        (new connect()).start(); //Get the address, if Local or public
        try {
            new getState().execute(""); //Get the current state
            Thread.sleep(500);
        } catch (NullPointerException ignored) {
            new getState().execute(""); //If there was a problem retry
        } catch (InterruptedException ignored) {}

        //Set on click lisenter for the MAIN button
        button.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                new send().execute("");
            }
        });

        SETTINGS.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, SettingsActivity.class);
                startActivity(i);
            }
        });

        Button updatestate = (Button) findViewById(R.id.update); //Update state manually
        //Set on click listener for the update button
        updatestate.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                new getState().execute("");
            }
        });
    }

    public void ButtonText(Button but, String text) {
        but.setText(text);
    }

    public void toast(CharSequence text) {
        Context context = getApplicationContext();
        int dur = Toast.LENGTH_SHORT;

        Toast.makeText(context, text, dur).show();
    }

    public boolean WifiState() {
        ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mWifi = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return mWifi.isConnected();
    }

    public boolean DataState() {
        ConnectivityManager connManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobileInfo = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        return (mobileInfo.getState() == NetworkInfo.State.CONNECTED);
    }

    private class getState extends AsyncTask<String, CharSequence, String> {

        private String rec;

        protected String doInBackground(String... param) {
            try {
                publishProgress();
                Socket sock = new Socket(Addr, PORT);
                DataOutputStream out = new DataOutputStream(sock.getOutputStream());
                BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
                out.writeBytes("1");
                rec = in.readLine();
                if (rec.equals("2")) {
                    rec = "Open";
                } else if (rec.equals("3")) {
                    rec = "Close";
                }
                pass = true;
                state = rec;
                sock.close();
            } catch (IOException e) {
                pass = false;
            } catch (NullPointerException ignored) {
            }
            return rec;
        }

        protected void onProgressUpdate(CharSequence... progress) {
            info.setText("Getting state");
        }

        protected void onPostExecute(String result) {
            try {
                if (result.equals("Open")) {
                    states.setImageResource(R.drawable.closed);
                    info.setText("Got Closed");
                } else if (result.equals("Close")) {
                    states.setImageResource(R.drawable.opened);
                    info.setText("Got Opened");
                }
                ButtonText(button, result);
                toast("Succesful connection");
            } catch (NullPointerException ee)
            {
                toast("There was an Error");
                info.setText("There was an Error");
            }
        }
    }

    private class connect extends Thread
    {
        public void run()
        {
            try {
                if(WifiState())
                {
                    Log.d("Connection", "Connecting with Wifi");
                    Addr = InetAddress.getByName(IP);
                }
                else if(DataState())
                {
                    Log.d("Connection", "Connecting with Data");
                    java.net.InetAddress[] x=  java.net.InetAddress.getAllByName(PubIP) ;
                    Addr = InetAddress.getByName(x[0].getHostAddress());
                    Log.d("Connection", "Host address " + Addr.getHostAddress());
                }
                else
                {
                    toast("No Internet Connection");
                    Log.d("Connection", "There is no Connection");
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    private class send extends AsyncTask<String, Integer, String> {

        protected String doInBackground(String... param) {
            try {
                Socket sock = new Socket(Addr, PORT);
                DataOutputStream out = new DataOutputStream(sock.getOutputStream());
                out.writeBytes("5");
                publishProgress();
                sock.close();
                Thread.sleep(garageopenclosetime + 1000);
                (new getState()).execute("");
            } catch (Exception e) {
                toast("There was an error sending new state");
            }
            return "None";
        }

        protected void onProgressUpdate(Integer... progress) {
            if (state.equals("Close")) {
                ButtonText(button, "Closing....");
                states.setImageResource(R.drawable.closing);
                info.setText("Sending Close");
            } else {
                ButtonText(button, "Opening....");
                states.setImageResource(R.drawable.opening);
                info.setText("Sending Open");
            }
        }

        protected void onPostExecute(String result) {
        }
    }

    private class reset extends AsyncTask<String, Integer, String> {

        protected String doInBackground(String... param) {
            try {
                Socket sock = new Socket(MainActivity.Addr, MainActivity.PORT);
                DataOutputStream out = new DataOutputStream(sock.getOutputStream());
                out.writeBytes("7");
                publishProgress();
                sock.close();
            } catch (Exception ignored) {
            }
            return "None";
        }

        protected void onProgressUpdate(Integer... progress) {
            MainActivity.info.setText("RESETTING DEVICE please restart app");
        }

        protected void onPostExecute(String result) {
        }
    }

    public static void directory()
    {
        if(Build.VERSION.SDK_INT >= 19)
        {
            path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath() + "/GarageDoor.properties";
        }
        else
        {
            path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/GarageDoor.properties";
        }
    }

    public static String[] read()
    {
        String[] data = {"0", "0", "0", "0", "0"};
        try {
            //load a properties file
            FileInputStream file = new FileInputStream(path);
            props.load(file);

            //get the property value and print it out
            data[0] = props.getProperty("priv", IP);
            data[1] = props.getProperty("pub", PubIP);
            data[2] = props.getProperty("gar", String.valueOf(garageopenclosetime));
            data[3] = props.getProperty("ref", String.valueOf(Refresh));
            data[4] = props.getProperty("port", String.valueOf(PORT));
            file.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return data;
    }

    public static void write(String[] data)
    {
        try {
            //set the properties value
            props.setProperty("priv", data[0]);
            props.setProperty("pub", data[1]);
            props.setProperty("gar", data[2]);
            props.setProperty("ref", data[3]);
            props.setProperty("port", data[4]);

            //save properties to project root folder
            FileOutputStream file = new FileOutputStream(path);
            props.store(file, null);
            file.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

Java SettingsActivity (Java not XML)

Java
Use this to control the Settings activity
package com.studyarduino.garagedoor;

import android.app.Activity;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays;
import java.util.Properties;


public class SettingsActivity extends Activity {

    private static EditText IP, PUBIP, GARAGEOCT, REFRESH, PORT; //These have to be declared here
    private static Properties props; //Access the Properties file (Init)
    private static String path; //The path to the Properties

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState); //Once created get the last state
        setContentView(R.layout.activity_settings); //Set the layout file to use

        //Mapping of the Buttons
        IP = (EditText) findViewById(R.id.privateIp);
        PUBIP = (EditText) findViewById(R.id.publicIp);
        GARAGEOCT = (EditText) findViewById(R.id.garageoct);
        REFRESH = (EditText) findViewById(R.id.refresh);
        PORT = (EditText) findViewById(R.id.Port);

        Button SAVE = (Button) findViewById(R.id.save); //This can be local
        //End of mapping

        //Reading/Writing to the Properties file
        props = new Properties(); //Init the Properties class

        directory(); //Get directory according to the API

        if(!(new File(path).exists())) //If no file exist create a blank one
            try{
                String[] starting = {"", "", "", ""};
                write(starting);
            } catch (Exception ignored) {}

        Log.d("Properties", "The path to the Properties is " + path); //Log the path

        //Show current values in the file currently and display them
        try {
            String[] makevis = read();
            Log.d("Values", Arrays.toString(makevis));
            IP.setText(makevis[0]);
            PUBIP.setText(makevis[1]);
            GARAGEOCT.setText(makevis[2]);
            REFRESH.setText(makevis[3]);
            PORT.setText(makevis[4]);
        } catch (Exception ignored) {}
        //End File to Gui

        //Save button pressed write to the Properties file
        SAVE.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {

            String[] data = {IP.getText().toString(), PUBIP.getText().toString(), GARAGEOCT.getText().toString(), REFRESH.getText().toString(), PORT.getText().toString()};

                try {
                    write(data);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    public static void directory()
    {
        if(Build.VERSION.SDK_INT >= 19) //The documents folder can only be accessed by api 19 and above
        {
            path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS).getPath() + "/GarageDoor.properties";
        }
        else
        {
            path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM).getPath() + "/GarageDoor.properties";
        }
    }

    //Return a String array from each line from the properties file
    public static String[] read()
    {
        String[] data = {"0", "0", "0", "0", "0"};
        try {
            //load a properties file
            FileInputStream file = new FileInputStream(path);
            props.load(file);

            //get the property value and print it out
            data[0] = props.getProperty("priv");
            data[1] = props.getProperty("pub");
            data[2] = props.getProperty("gar");
            data[3] = props.getProperty("ref");
            data[4] = props.getProperty("port");

            file.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        return data;
    }
    //End of loading

    //Write lines to the properties file with a String array
    public static void write(String[] data)
    {
        try {
            //set the properties value
            props.setProperty("priv", data[0]);
            props.setProperty("pub", data[1]);
            props.setProperty("gar", data[2]);
            props.setProperty("ref", data[3]);
            props.setProperty("port", data[4]);

            //save properties to project root folder
            FileOutputStream file = new FileOutputStream(path);
            props.store(file, null);
            file.close();

        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
    //End write lines

}

Java Manifest XML

XML
The required permissions for the App
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.studyarduino.garagedoor" >

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SettingsActivity"
            android:label="@string/title_activity_settings" >
        </activity>
    </application>

</manifest>

Drawable images

Plain text
The media fire link to the images to put in the drawable folder
Here is the Link: https://www.mediafire.com/folder/c783gk5vjyjtb//Pictures

Credits

David Smerkous

David Smerkous

8 projects • 87 followers
Currently an Artificial Intelligence Ph.D. student at Oregon State University. Long-time hardware enthusiast. Profile is old.
Thanks to shennongmin .

Comments