Introduction: An Automatic Phone Charger
"This instructable was created in fulfillment of the project requirement of the Makecourse at the University of South Florida (www.makecourse.com)"
The idea behind this project was to create a device that could charge a phone, and then unplug it when the phone reaches 100%. This would stop issues of over charging.
Step 1: Plastic Components
There were some components that were used that were 3D printed. These components comprised a base, a holder for the charger, a rack and pinion gear set (a normal gear and a linear piece that changes the rotation to linear movement), and a base for everything to operate on. These components will be explained in the following paragraphs. In order of appearence
Charger Holder
The purpose of this is to hold the phone charger, or at least give it a better and level base to be upon.
Base
The base has rings for the phone holder as well as a track for the gear set.
Phone Holder
Holds the phone, obviously
Phone Arm
Moves and holds the phone
Rack and Pinion Gear Set
Used to move the phone charger back and forth
Step 2: Break Down of Non 3D Printed Components
These are the components that were either purchased for the project or already owned. For some of the parts I linked to them/similar items on amazon, but feel free to acquire them anywhere.
Micro Servo:https://www.amazon.com/J-Deal-Micro-Helicopter-Air...
Standard 0-180 Servo:https://www.amazon.com/Futaba-FUTM0031-S3003-Stand...
HC-05 Bluetooth Serial Module:https://www.amazon.com/HC-05-Bluetooth-Pass-throug...
Phone and Phone Charger
Arduino
Breadboard
Box or bin for base
Touch Sensor:https://www.amazon.com/Digital-Sensor-capacitive-s...
Step 3: Electronics
The circuit for this project may require some though, mainly because of the HC-05 module. Many of the modules of this type are rate for roughly 3.3V to 6V, which is with in the operating range of the Arduino. But, for serial communication the Rx pin sometimes works better with only 3.3V. As seen in the above diagram the two servos are hooked up to the Vin pin on the Arduino. This extra voltage can be supplied by anything, I used a 9 volt battery. The touch sensor was plugged into the 5V on the Arduino. This was because all of the components had trouble running off of the same voltage. The touch sensor is attached to pin 2 so it can be used as a pin interrupt. Then the bluetooth module is connected to the the Rx and Tx pins for serial communication. Between the Rx pin on the module and Tx on the Arduino is a 2 kilo ohm resistor with a 1 kilo ohm connecting to ground. This helps to regulate the voltage going in.
Step 4: Assembly
The assembly is quite simple.
- with some super glue mount your servos in their positions, one for the gear by the cutout on the base and one near where the base of the phone is.
- Attach the touch sensor to the phone holder, so it can know when the phone is there.
- Then attach the gear and arm to their respective servos
- Make sure wires do not interfere with other components as you fill your electronics in
Step 5: Code
There are three sets of code that will be presented, one code for the Arduino, that was created in the Arduino IDE and two codes that were made in Android Studio. The Android apps are the same except for one is the full app that tracks battery life and one does not. The second one is for testing purposes.
Arduino Code
The main point of this code is to operate the touch sensor and motors, it receives a command from the phone and acts upon it.
#include //calls the servo library so we can control the two servos<br>Servo servo1; Servo servo2;//creates two servo objects for each servo motor int a=0;//tracking variable for testing int q=0;//a variable that allows there to be a delay before to pluggin process begins char c;//variable that contains the serial message from the phone void setup() { attachInterrupt(digitalPinToInterrupt(2), AH, FALLING);// attaches a falling interrupt to know exactly when the touch sensor sees when the phone is being out on servo1.attach(10); servo2.attach(9);// initializes the two servos Serial.begin(9600);// begins the serial communication at a rate similar to that of the bluetooth module servo2.write(20);//auto sets the servos to a starting position servo1.write(180); }
void loop() { if (Serial.available()){// this checks if there is anything coming in from the phone over the serial pins Tx and Rx c=Serial.read();//reads what is coming in from if (c=='t'){//if the serial device reads a t then that means that the phone is fully charged, the unplugging process begins servo2.write(120);//unplugs the charger delay(5000);//waits to make sure there is time for the removal servo1.write(110);//moves the phone into an upright position to signal //Serial.println("here"); attachInterrupt(digitalPinToInterrupt(2), AH, FALLING);//reattaches the interrupt } } if (q==1){//if the condition for pluggin in is ture then commence with attaching the charger delay(10000); servo2.write(0);//moves servo into position q=0;//resets condition } }
void AH(){ //Serial.println("in"); servo1.write(180);// drops the phone platform into the charging position q=1;//starts the condtition to continue the process //a=1; detachInterrupt (digitalPinToInterrupt(2));//detaches the interrupt, so that there wont be any issues with the interrupt starting when it shouldn't }
Android App
Here I will only display the proper app but the test code file will also be given, the only difference will be the removal of the runnable and getBattery class. The serial code mentioned is the one that is standard for phones connecting to devices like the module.
package com.example.daniel.make;<br> import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothSocket; import android.os.Handler; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.content.Intent; import android.content.IntentFilter; import android.os.BatteryManager; import java.io.IOException; import java.io.OutputStream; import java.util.Set; import java.util.UUID;
public class MainActivity extends AppCompatActivity { // creating necessary objects Handler handler;//helps with the loop Runnable runnable;//runs continuously BluetoothAdapter mBluetoothAdapter; BluetoothSocket mmSocket; BluetoothDevice mmDevice; OutputStream mmOutputStream; volatile boolean stopWorker; private OutputStream outputStream; private final String DEVICE_NAME="HC-05"; private final UUID PORT_UUID=UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); private BluetoothAdapter device; private BluetoothSocket socket; @Override protected void onCreate(Bundle savedInstanceState) {//is a set of instructions that run when the app is created super.onCreate(savedInstanceState);//displya creation setContentView(R.layout.activity_main); runnable = new Runnable() { @Override public void run() {//runs repeatedly int level = (int) getBattery();// gets the current battery level if (level==100){//if the battery level reaches 100% try { getBT();//connects to the bluetooth module openBT();//opens it sendData();//sends the necessary data closeBT();//closes the object } catch (IOException ex) { } } handler.postDelayed(runnable, 5000);//a delay } }; handler = new Handler(); handler.postDelayed(runnable,0); }
public float getBattery() { Intent batteryIntent= registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));// creates the action that connects to the battery int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1);//gets the bettery level int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1);//gets the scale of the battery if (level == -1 || scale == -1) {//in case of misstep return 50.0f; } float batt = (level/(float)scale)*100.0f;//gets the proper scale return batt;//returns the level }
void getBT(){//gets the possible bluetooth connections mBluetoothAdapter = BluetoothAdapter.getDefaultAdapter();//gets the adapter if(!mBluetoothAdapter.isEnabled()) {//makes sure the phone ahs blue tooth on Intent enableBluetooth = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);//requests it to be turned on if not startActivityForResult(enableBluetooth, 0); } Set pairedDevices = mBluetoothAdapter.getBondedDevices();//gets the list of bonded bluetooth if(pairedDevices.size() > 0) {//makes sure there are some devices for(BluetoothDevice device : pairedDevices) {//loops through the devices if(device.getName().equals("HC-05")) {//checks if its the proper one mmDevice = device;//saves it break; } } } }
void openBT() throws IOException { UUID uuid = UUID.fromString("00001101-0000-1000-8000-00805f9b34fb"); //Standard //SerialPortService ID mmSocket = mmDevice.createRfcommSocketToServiceRecord(uuid);//connects to the device with the proper id mmSocket.connect();//connects mmOutputStream = mmSocket.getOutputStream();//starts the ability to send data to the arduino module }
void sendData() throws IOException {//class that sends the t to the arduino mmOutputStream.write('t'); }
void closeBT() throws IOException {//closes all of the connections to the arduino stopWorker = true; mmOutputStream.close(); mmSocket.close(); } }
Step 6: Files
Thank you for reading, attached are the files that were used in this project
Comments