软件工程师树莓派获取室内温湿度的坎坷之旅

背景 前几天公司接受到了一份来自阿里飞天园区,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实现高性能IOT服务器(Groza)之手撕MQTT协议篇上 Netty实现高性能IOT服务器(Groza)之精尽代码篇中 其他 关于IOT市场与技术模拟详解到这里就结束了。 原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力! 下文会大家逐步用Netty实现MQTT协议的IOT服务器。 版权声明: 作者:穆书伟 博客园出处:https://www.cnblogs.com/sanshengshui github出处:https://github.com/sanshengshui     个人博客出处:https://sanshengshui.github.io/https://www.cnblogs.com/sanshengshui/p/9942963.html
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信