- 關於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模塊。採用的是以下方案:
- 將Arduino開發板與PC機用USB線連接,PC機監聽端口輸出。
- PC機將監聽到的數據,通過socket通信發出去
- 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方向的通信