1. 程式人生 > >軟體工程師樹莓派獲取室內溫溼度的坎坷之旅

軟體工程師樹莓派獲取室內溫溼度的坎坷之旅

背景

前幾天公司接受到了一份來自阿里飛天園區,IOT部門的小禮物。由於上司比較忙,無暇去顧及。

當時尚未開封,我好奇是什麼,於是就急忙忙的拆開,發現是Raspberry Pi 3(樹莓派3)。我覺得挺好玩的,就接過來了,於是上司就興起,就讓我拿這個小玩意去驗證阿里物聯網平臺上的相關元件。於是,就有了這個軟體工程師樹莓派實現室內溫溼度坎坷之旅!

以下是開箱的東西:

  1. 樹莓派3(Raspberry Pi 3 Model B+)
  2. 創客社群控制器(DFROBOT)
    • 數根樹莓派排線
    • DHT11模組(溫溼度感測器)
    • LED模組

裝機

下載官網映象

樹莓派官網,點選Downloads,在所列映象的最上面,

其中Raspbian是Raspberry Pi所有型號的官方作業系統。

下面映象有以下2種:

  1. NOOBS:適合初學者的簡易作業系統安裝程式
  2. RASPBIAN:官方支援Raspberry Pi作業系統---基於Debian

我選擇點選下載第二種的系統。點選完之後,你會發現,RASPBIAN有2種類型讓你選擇

  • 帶有操作介面,Raspbian預裝了大量用於教育,程式設計和一般用途的軟體。它有Python,Scratch,Sonic Pi,Java等。
  • 不帶有操作介面的LITE版本

對於我這種初次接觸樹莓派的人,我選擇下載帶有操作介面的RASPBIAN系統。

SD卡格式化

目的: 把SD卡放到TF讀卡器中,插入你的電腦中,把SD卡格式化為FAT32格式。

:checkered_flag: 滑鼠右鍵SD卡的碟符,點選格式化。在格式化視窗檔案系統中選擇“[FAT32]”,然後選擇在格式化選項中選擇“[快速格式化]”,開點開始,等到完成即可。

:penguin: 安裝GParted,右鍵SD卡的碟符,右鍵格式化,並選擇FAT32,選擇格式化即可。

映象的燒寫

:checkered_flag: ​ 你需要下載一個Win32diskimager程式,然後把SD卡插入讀卡器中,將上面下載的映象拷入SD卡,完成之後,把SD卡從讀卡器取下來,插入樹莓派。

:penguin:

  • 下載好了之後開啟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伺服器。

版權宣告:

作者:穆書偉

部落格園出處:www.cnblogs.com/sanshengshu…

github出處:github.com/sanshengshu…    

個人部落格出處:sanshengshui.github.io/