背景
前幾天公司接受到了一份來自阿里飛天園區,IOT部門的小禮物。由於上司比較忙,無暇去顧及。
當時尚未開封,我好奇是什么,於是就急忙忙的拆開,發現是Raspberry Pi 3(樹莓派3)。我覺得挺好玩的,就接過來了,於是上司就興起,就讓我拿這個小玩意去驗證阿里物聯網平台上的相關組件。於是,就有了這個軟件工程師樹莓派實現室內溫濕度坎坷之旅!
以下是開箱的東西:
-
樹莓派3(Raspberry Pi 3 Model B+)
-
樹莓派3代B+板
-
樹莓派USB電源適配器5V@2.5A
-
-
創客社區控制器(DFROBOT)
-
數根樹莓派排線
-
DHT11模塊(溫濕度傳感器)
-
LED模塊
-
裝機
下載官網鏡像
樹莓派官網,點擊Downloads,在所列鏡像的最上面,
其中Raspbian是Raspberry Pi所有型號的官方操作系統。
下面鏡像有以下2種:
-
NOOBS:適合初學者的簡易操作系統安裝程序
-
RASPBIAN:官方支持Raspberry Pi操作系統---基於Debian
我選擇點擊下載第二種的系統。點擊完之后,你會發現,RASPBIAN有2種類型讓你選擇
-
帶有操作界面,Raspbian預裝了大量用於教育,編程和一般用途的軟件。它有Python,Scratch,Sonic Pi,Java等。
-
不帶有操作界面的LITE版本
對於我這種初次接觸樹莓派的人,我選擇下載帶有操作界面的RASPBIAN系統。
SD卡格式化
目的: 把SD卡放到TF讀卡器中,插入你的電腦中,把SD卡格式化為FAT32格式。
🏁 鼠標右鍵SD卡的盤符,點擊格式化。在格式化窗口文件系統中選擇“[FAT32]”,然后選擇在格式化選項中選擇“[快速格式化]”,開點開始,等到完成即可。
🐧 安裝GParted,右鍵SD卡的盤符,右鍵格式化,並選擇FAT32,選擇格式化即可。
鏡像的燒寫
🏁 你需要下載一個Win32diskimager程序,然后把SD卡插入讀卡器中,將上面下載的鏡像拷入SD卡,完成之后,把SD卡從讀卡器取下來,插入樹莓派。
🐧
-
下載好了之后打開zip文件所在文件夾,輸入以下命令,進行解壓。
unzip 2018-10-09-raspbian-stretch.zip
替換上自己下好的zip文件名稱 得到2018-10-09-raspbian-stretch.img文件,此文件就是我們要的鏡像。
-
得到鏡像文件后,我們要將此鏡像文件寫入事先准備的TF卡內。將TF卡放入讀卡器,然后接入電腦。使用
sudo fdisk -l
命令查看此設備的名稱,在我的電腦上是/dev/sdb。
-
知道讀卡器的設備路徑后,我們用dd命令來將鏡像文件寫入到TF卡內。命令如下:
sudo dd if=2018-10-09-raspbian-stretch.img of=/dev/sdc bs=2M
其中if=后面的是鏡像文件名;of=后面是讀卡器的設備路徑。回車,執行命令等它執行完畢。
刻錄過程是需要一段時間的,刻錄完成了之后終端是會有顯示的。
鏡像刻錄完成之后把tf卡放入卡槽內,把電源線插入后會看到小紅燈旁邊的小綠燈會閃爍,沒有插卡的時候只會亮紅燈,表示電源接通。綠燈閃爍表示鏡像燒寫是正確的,樹莓派已經成功的打開。現在可以接上顯示屏和鍵盤。
如下圖所看到的樣子
樹莓派與溫濕度采集模塊連接
樹莓派3b引腳圖
先貼一張樹莓派3b的引腳圖:
在連線的時候注意編碼方式,注意樹莓派引腳圖的方向,如上圖所示。
DHT11
DHT11是一款有已校准數字信號輸出的溫濕度傳感器。 其精度濕度+-5%RH, 溫度+-2℃,量程濕度20-90%RH, 溫度0~50℃。分為3個接口,分別為:VCC
, DATA
, GND
。
引腳號 | 名稱 | 類型 | 說明 |
---|---|---|---|
1 | VCC | 電源 | +級,輸入3V-5.5V |
2 | DATA | 數據輸出 | 輸出引腳 |
3 | GND | 接地 | 接地引腳 |
引腳鏈接
我用的是三個頭的dht11傳感器,因此連線方式是:
VCC(或正極) --- 樹莓派的3v電源
GND (地線或者負極)--- 樹莓派的gnd接口
DATA (D或者out) ---樹莓派的GPIO引腳
1.VCC
接上3V
,可以選擇1
口或者17
口
2.DATA
接上GPIO
口,我選的是GPIO4
,第7
口
3.GND
接上接地口
,我選的是第14
口
Python獲取室內溫濕度
安裝Python3
首先測試一下樹莓派3安裝的python版本。
sudo apt-get install python3
因為Ubuntu很多底層采用的是Python2.*,Python3和Python2是互相不兼容的,所以此時不能卸載Python2,需要將默認Python的指向Python3。
首先,刪除usr/bin/目錄下的默認python link文件。
sudo rm -rf /usr/bin/python
然后打開終端輸入如下命令行,建立新的連接關系
sudo ln -s /usr/bin/python3.5 /usr/bim/python
然后測試一下python版本是否正確,命令行輸入python即可。
編寫Python代碼
#!/usr/bin/python import RPi.GPIO as GPIO import time channel =4 data = [] j = 0 GPIO.setmode(GPIO.BCM) time.sleep(1) GPIO.setup(channel, GPIO.OUT) GPIO.output(channel, GPIO.LOW) time.sleep(0.02) GPIO.output(channel, GPIO.HIGH) GPIO.setup(channel, GPIO.IN) while GPIO.input(channel) == GPIO.LOW: continue while GPIO.input(channel) == GPIO.HIGH: continue while j < 40: k = 0 while GPIO.input(channel) == GPIO.LOW: continue while GPIO.input(channel) == GPIO.HIGH: k += 1 if k > 100: break if k < 8: data.append(0) else: data.append(1) j += 1 print("sensor is working.") print(data) humidity_bit = data[0:8] humidity_point_bit = data[8:16] temperature_bit = data[16:24] temperature_point_bit = data[24:32] check_bit = data[32:40] humidity = 0 humidity_point = 0 temperature = 0 temperature_point = 0 check = 0 for i in range(8): humidity += humidity_bit[i] * 2 ** (7-i) humidity_point += humidity_point_bit[i] * 2 ** (7-i) temperature += temperature_bit[i] * 2 ** (7-i) temperature_point += temperature_point_bit[i] * 2 ** (7-i) check += check_bit[i] * 2 ** (7-i) tmp = humidity + humidity_point + temperature + temperature_point if check == tmp: print("temperature :", temperature, "*C, humidity :", humidity, "%") else: print("wrong") print("temperature :", temperature, "*C, humidity :", humidity, "% check :", check, ", tmp :", tmp) GPIO.cleanup()
展示結果
為了測試結果是否准確,我把手指放到傳感器上,測試的數據為:
測試無誤~~~.
MQTT發布消息到代理服務器
安裝paho-mqtt
使用pip工具安裝paho-mqtt,輸入以下指令即可:
sudo pip install paho-mqtt
Python發布消息Demo
import paho.mqtt.client as mqtt import time import json #當代理響應連接請求時調用。 #rc的值決定了連接成功或者不成功 def on_connect(client, userdata, flags, rc): print("Connected with result code " + str(rc)) #當收到關於客戶訂閱的主題的消息時調用 def on_message(client, userdata, msg): print(msg.topic + " " + str(msg.payload)) client = mqtt.Client() #客戶端初始化,設置客戶端id等信息 client.reinitialise(client_id="test01",clean_session=True,userdata=None) #客戶端設置用戶名,密碼信息 client.username_pw_set(username="123456",password="2236FDE7A9744017E25C95B333E5D546AF354F74463EF6FDABA09AC20C19306979DA982C9659877D4896336A7E3484F12B1BAFF773B8343A2AA75CC9EC8B51B2") client.on_connect = on_connect client.on_message = on_message #組裝json數據 s = {'name':'mushuwei','age':24} jo = json.dumps(s) try: #connect()函數將客戶端連接到代理。 這是一個阻塞函數。 client.connect("127.0.0.1", 1883, 600) while True: #從客戶端發送消息給代理。 publish(topic, payload=None, qos=0, retain=False) client.publish('test', payload=jo, qos=0) time.sleep(1) client.loop_forever(timeout=1.0,max_packets=1,retry_first_connection=False) except KeyboardInterrupt: client.disconnect()
將上面獲取到的溫濕度數據放在一個函數里,組裝成json數據,放到負載里,發布消息給代理。即可!
訂閱test主題的客戶端數據展示如下:
至於MQTT代理服務器代碼的編寫,可以參考我之前寫的文章:
其他
關於IOT市場與技術模擬詳解到這里就結束了。
原創不易,如果感覺不錯,希望給個推薦!您的支持是我寫作的最大動力!
下文會大家逐步用Netty實現MQTT協議的IOT服務器。
版權聲明:
作者:穆書偉
博客園出處:https://www.cnblogs.com/sanshengshui
github出處:https://github.com/sanshengshui
個人博客出處: