【安卓與物聯網】Arduino開發板與Android之間通信

  • 關於Arduino開發板

Arduino是一款開源電子原型平臺,硬件部分是可以用來做電路連接的Arduino電路板。可以通過編寫程序,最後燒寫入開發板,配合上一些傳感器,以及富有創造力的設計可以創造出很多神奇的東西。
這裏寫圖片描述


在大三的時候,對物聯網的感興趣,讓我直接省吃儉用在網絡買了個Arduino開發板(Arduino入門套裝160),然後個人在寢室瞎折騰~
就像大多數人說的那樣,物聯網會在將來掀起大浪潮,本人也是這麼認爲,開始在寢室折騰,然後就有了這篇博客的內容。


這裏我們將Arduino開發板讀取到的溫度傳輸到Android端,這樣的設計類似與智能手錶(吐槽一句,這樣的技術並不高明,手錶賣那麼貴,實在坑人),如果我們將溫度傳感器綁在身上,那麼我們這樣就可以實時的看到自己的體溫,想必這樣的東西會有很大的用途吧。
大致上我們可以分以下幾步:
* Arduino開發板與溫度傳感器連接(這裏選擇的傳感器是LM35)
* Arduino開發板通過Wifi或藍牙連接Android

1.對接LM35溫度傳感器

這裏寫圖片描述
LM35溫度傳感器的特點:
1、有較好的線性度和較高的靈敏度。
2、傳感器的輸出電壓與攝氏溫度呈線性關係,0℃時輸出爲0V,每升高1℃,輸出電壓增加10mv。
3、與Arduino專用傳感器擴展板結合使用,可以非常容易地實現與環境溫度感知相關的互動效果。
所以選擇LM35是比較正確的。
對接方式如下:
這裏寫圖片描述
接着是燒寫代碼

int potPin = 4;                     //設置模擬口4爲LM35的信號輸入端口
float temperature = 0;                //設置temperature爲浮點變量
long val=0;                       //設置val爲長整數變量

void setup()
{
Serial.begin(9600);//設置波特率
}

void loop ()                     
{
   val=analogRead(potPin);//溫度傳感器LM35接到模擬PIN4上;val變量爲從LM35信號口讀取到的數值
  temperature = (val*0.0048828125*100);   //把讀取到的val轉換爲溫度數值,係數一:0.00488125=5/1024,0~5V對應模擬口讀數1~1024,係數二:100=1000/10,1000是毫伏與伏的轉換;10是每10毫伏對應一度溫升。
   Serial.print("Tep=  ");
   Serial.print(temperature);
   Serial.println(" C");
    delay(500);//延時500毫秒,這裏也就是刷新速度。

}

完成以上,溫度基本可以成功獲取到。
下一步,連接Android手機。
按照原本的設定,我們需要再買個Wifi模塊,將Wifi模塊連在Arduino開發板上,這樣就具備了WIFI通信的資本,但是當時比較窮,沒有去買WIFI模塊。採用的是以下方案:

  1. 將Arduino開發板與PC機用USB線連接,PC機監聽端口輸出。
  2. PC機將監聽到的數據,通過socket通信發出去
  3. Android端通過socket接收數據
    這裏寫圖片描述
    這樣Android就可以獲取到傳感器的溫度了,那麼接下來的要做的是,PC監聽端口。

2.PC機監聽固定串口

這裏我用的是C#編寫的程序。
參考博客:
http://www.cnblogs.com/sunxiaonan/archive/2010/10/23/1609449.html
這裏寫圖片描述
如圖,我們對端口號和波特率進行設置(要和Arduino開發板燒寫的一致),然後就可以得到監聽到的數據

3.PC機利用C#實現Socket通信

主要實現Service端,如下代碼:

namespace SocketServer  
{  
    class Program  
    {  
        private static byte[] result = new byte[1024];  
        private static int myProt = 8885;   //端口  
        static Socket serverSocket;  
        static void Main(string[] args)  
        {  
            //服務器IP地址  
            IPAddress ip = IPAddress.Parse("127.0.0.1");  
            serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);  
            serverSocket.Bind(new IPEndPoint(ip, myProt));  //綁定IP地址:端口  
            serverSocket.Listen(10);    //設定最多10個排隊連接請求  
            Console.WriteLine("啓動監聽{0}成功", serverSocket.LocalEndPoint.ToString());  
            //通過Clientsoket發送數據  
            Thread myThread = new Thread(ListenClientConnect);  
            myThread.Start();  
            Console.ReadLine();  
        }  

        /// <summary>  
        /// 監聽客戶端連接  
        /// </summary>  
        private static void ListenClientConnect()  
        {  
            while (true)  
            {  
                Socket clientSocket = serverSocket.Accept();  
                clientSocket.Send(Encoding.ASCII.GetBytes("Server Say Hello"));  
                Thread receiveThread = new Thread(ReceiveMessage);  
                receiveThread.Start(clientSocket);  
            }  
        }  

        /// <summary>  
        /// 接收消息  
        /// </summary>  
        /// <param name="clientSocket"></param>  
        private static void ReceiveMessage(object clientSocket)  
        {  
            Socket myClientSocket = (Socket)clientSocket;  
            while (true)  
            {  
                try  
                {  
                    //通過clientSocket接收數據  
                    int receiveNumber = myClientSocket.Receive(result);  
                    Console.WriteLine("接收客戶端{0}消息{1}", myClientSocket.RemoteEndPoint.ToString(), Encoding.ASCII.GetString(result, 0, receiveNumber));  
                }  
                catch(Exception ex)  
                {  
                    Console.WriteLine(ex.Message);  
                    myClientSocket.Shutdown(SocketShutdown.Both);  
                    myClientSocket.Close();  
                    break;  
                }  
            }  
        }  
    }  
}  

這樣Service這端就準備好了,接下來就剩Android端了。

4.安卓端實現Socket通信

這裏Android端只需要充當客戶端就可以了。部分實現代碼如下:

public void run() {
try {
while (true) {
if (!socket.isClosed()) {
if (socket.isConnected()) {
if (!socket.isInputShutdown()) {
if ((content = in.readLine()) != null) {
content += “\n”;
mHandler.sendMessage(mHandler.obtainMessage());
} else {

                        }
                    }
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

參考博客:
http://www.cnblogs.com/devinzhang/archive/2012/10/04/2711763.html

利用以上方法就實現了Arduino開發板到Android方向的通信

發佈了70 篇原創文章 · 獲贊 196 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章