Hardware components

Software apps and online services

Story

The idea of this project is to be able to turn on/off lights (or any electrical component) of a car without being inside the car, or physically pressing dashboard buttons/switches.

Since I have a Pebble watch (as an extension of my Android phone), it makes sense to use it as a controller. However, even without the watch, I can still simulate the same remote functions using the phone itself.

The following parts are used in this project. I chose shield-based components to make the device profile less complicated (no jumper wires):

Pebble Steel (optional, but much more practical and impressive to demo!)

Arduino components

On the phone (Tasker), I created four similar tasks for each input pin (via the 1Sheeld plugin), each to trigger: HIGH > WAIT 100ms > LOW.

I used PebbleTasker to create the menus on the Pebble.

The next step is to find out which wire in your car does what. Now this is completely dependent on the car that you have, as every car would have a different circuit. Mine is a 2013 Honda CR-Z.

The test bed

I used a multimeter and the help of the car's service manual to find out which wires/relays conduct electricity when a switch/button is pressed. This tells me which wire/circuit I'm looking for. Then, I tapped relay wires into that circuit to simulate a 'button press'. This is not intrusive as I do not go into ECU, OBDII or CAN bus hacking. I merely simulated a 'button press'.

Schematics

Basic diagram of an LED circuit

The black diagram is a simplified version of a circuit for each individual component in your car.

You would usually access the individual buttons/switches from the dashboard, e.g. headlights/turn signals.

By pressing a button/switch, you simply complete the circuit and turn on the lights. The arduino+relay aims to complete the circuit without having to physically press the actual button, yet it doesn't interfere with the original function.

Code

Tasker task

XML

Create one for each separate relay/pin, and remember to change the input pin that you are triggering. It is simply doing: HIGH > WAIT(100ms) > LOW

<TaskerDatasr=""dvi="1"tv="4.7u3m"><Tasksr="task62"><cdate>1436544359424</cdate><edate>1440646568135</edate><id>62</id><nme>Relay 1</nme><pri>100</pri><Actionsr="act1"ve="7"><code>3138</code><Bundlesr="arg0"><Valssr="val"><com.integreight.onesheeld.extra.OUTPUT>true</com.integreight.onesheeld.extra.OUTPUT><com.integreight.onesheeld.extra.OUTPUT-type>java.lang.Boolean</com.integreight.onesheeld.extra.OUTPUT-type><com.integreight.onesheeld.extra.PIN_NUMBER>14</com.integreight.onesheeld.extra.PIN_NUMBER><com.integreight.onesheeld.extra.PIN_NUMBER-type>java.lang.Integer</com.integreight.onesheeld.extra.PIN_NUMBER-type><com.twofortyfouram.locale.intent.extra.BLURB>Pin 14 set to High</com.twofortyfouram.locale.intent.extra.BLURB><com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type><net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled><net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type></Vals></Bundle><Strsr="arg1"ve="3">com.integreight.onesheeld</Str><Strsr="arg2"ve="3">1Sheeld</Str><Intsr="arg3"val="0"/></Action><Actionsr="act2"ve="7"><code>30</code><Intsr="arg0"><var>100</var></Int><Intsr="arg1"val="0"/><Intsr="arg2"val="0"/><Intsr="arg3"val="0"/><Intsr="arg4"val="0"/></Action><Actionsr="act3"ve="7"><code>3138</code><Bundlesr="arg0"><Valssr="val"><com.integreight.onesheeld.extra.OUTPUT>false</com.integreight.onesheeld.extra.OUTPUT><com.integreight.onesheeld.extra.OUTPUT-type>java.lang.Boolean</com.integreight.onesheeld.extra.OUTPUT-type><com.integreight.onesheeld.extra.PIN_NUMBER>14</com.integreight.onesheeld.extra.PIN_NUMBER><com.integreight.onesheeld.extra.PIN_NUMBER-type>java.lang.Integer</com.integreight.onesheeld.extra.PIN_NUMBER-type><com.twofortyfouram.locale.intent.extra.BLURB>Pin 14 set to Low</com.twofortyfouram.locale.intent.extra.BLURB><com.twofortyfouram.locale.intent.extra.BLURB-type>java.lang.String</com.twofortyfouram.locale.intent.extra.BLURB-type><net.dinglisch.android.tasker.subbundled>true</net.dinglisch.android.tasker.subbundled><net.dinglisch.android.tasker.subbundled-type>java.lang.Boolean</net.dinglisch.android.tasker.subbundled-type></Vals></Bundle><Strsr="arg1"ve="3">com.integreight.onesheeld</Str><Strsr="arg2"ve="3">1Sheeld</Str><Intsr="arg3"val="0"/></Action></Task></TaskerData>

Codebender

The Arduino code is a simple toggle high/low function for each pin per-relay. Relays 1-4 is controlled by pin 4-7 respectively, and I used the analog pins as input. (NOTE: delay(200) assumes that you don't trigger pins too fast!)