Here we describe a prototype light control, or any other load using Android device, be it a tablet, smart phone, clock, etc. Communication is performed via Bluetooth link.
As a Bluetooth module uses cheap Chinese module HC-06, which has been described in this article.
The controller is used with .NET Micro Framework: FEZ Panda II, but any controller works with .NET Micro Framework core. Also, I would like to give an example of the transfer of entire rows instead of one character in both directions.
For this, we take the real task - control of two light bulbs in the apartment. As the bulbs I use halogen LED bulbs G4. Power of light bulbs is 12 volts and they will be powered by a separate power supply.
Parts:
Android device
Bluetooth module
.NET Micro Framework controller (FEZ Panda II or other)
Relay module
Wiring diagram:
Source code for .NET Micro Framework in a Visual C # Express
using System; using System.Threading; using System.IO.Ports; using System.Text; using Microsoft.SPOT; using Microsoft.SPOT.Hardware; using GHIElectronics.NETMF.FEZ; // library for FEZ namespace CxemCAR { public class Program { public static void Main() { byte[] My_Data = new byte[20]; // array to store a string int My_index = 0; // array index byte[] rx_data = new byte[1]; // array UART data OutputPort relay1 = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di8, false); OutputPort relay2 = new OutputPort((Cpu.Pin)FEZ_Pin.Digital.Di9, false); SerialPort UART1 = new SerialPort("COM1", 9600); // new object UART1 (COM1) UART1.Open(); UART1.Flush(); while (true) { int read_count = UART1.Read(rx_data, 0, 1); // read data if (read_count > 0) // received data? { My_Data[My_index] = rx_data[0]; // write the byte to our array if (rx_data[0] == '\r') // if, at the end of line { My_Data[My_index] = 0; // remove the last element, in this case it "\r" string strMy_Data = new string(Encoding.UTF8.GetChars(My_Data)); // create a string from a byte array if (strMy_Data != null && strMy_Data.Equals("Start1")) // crafted string compare with our string { byte[] buffer = Encoding.UTF8.GetBytes("LED 1 On\r\n"); // prepare a byte array "Led On" for output in UART UART1.Write(buffer, 0, buffer.Length); // write in UART1 a byte array relay1.Write(true); // turn on relay 1 } else if (strMy_Data != null && strMy_Data.Equals("Stop1")) { byte[] buffer = Encoding.UTF8.GetBytes("LED 1 Off\r\n"); // prepare a byte array "Led Off" for output in UART UART1.Write(buffer, 0, buffer.Length); // write in UART1 a byte array relay1.Write(false); // turn off relay 1 } else if (strMy_Data != null && strMy_Data.Equals("Start2")) { byte[] buffer = Encoding.UTF8.GetBytes("LED 2 On\r\n"); // prepare a byte array "Led On" for output in UART UART1.Write(buffer, 0, buffer.Length); // write in UART1 a byte array relay2.Write(true); // turn on relay 2 } else if (strMy_Data != null && strMy_Data.Equals("Stop2")) { byte[] buffer = Encoding.UTF8.GetBytes("LED 2 Off\r\n"); // prepare a byte array "Led Off" for output in UART UART1.Write(buffer, 0, buffer.Length); // write in UART1 a byte array relay2.Write(false); // turn off relay 2 } else { byte[] buffer = Encoding.UTF8.GetBytes("Command Error!\r\n"); UART1.Write(buffer, 0, buffer.Length); // write in UART1 a byte array } Array.Clear(My_Data, 0, My_Data.Length - 1); // clear array My_index = -1; // clear array index Thread.Sleep(100); } if (My_index < 19) My_index++; // increment array index } } } } }
In the program, the end of the line (command) is defined by line feed character "\r"
I defined four commands:
Start1 - turn on relay 1
Stop1 - turn off relay 1
Start2 - turn on relay 2
Stop2 - turn off relay 2
After the successfully receiving the command, Android device sent the relevant status messages: LED 1 On, LED 1 Off, etc. If the command is not recognized, an error message is transmitted "Command Error!"
Program for Android written in Java in Eclipse IDE. To work with the Bluetooth uses a class: Bluetooth.java. Receiving data from Bluetooth carried out a separate asynchronous thread. Received data and system messages are transmitted to the main activity through class Handler. To format a string from the controller uses the class StringBuilder.
Piece of code that is responsible for the formation of the string:
case cBluetooth.RECIEVE_MESSAGE: byte[] readBuf = (byte[]) msg.obj; String strIncom = new String(readBuf, 0, msg.arg1); sb.append(strIncom); // add new string to sb int endOfLineIndex = sb.indexOf("\r\n"); // define the end of the line if (endOfLineIndex > 0) { // if the end of the line String sbprint = sb.substring(0, endOfLineIndex); sb.delete(0, sb.length()); // clear sb text_answer_txt.setText("Answer: " + sbprint); // update TextView } break;
In Android-application, you can write a command from the keyboard (you is provided the input field and a submit button) and you can control relays with two ToggleButton. Below is a text field that displays the text recieved from FEZ Panda II.
Download APK application for Android
Download full project with source codes for Eclipse IDE and Visual C# 2010 Express
Author: Koltykov A.V.