背景故事
快放假了,紧张刺激的课程设计又要开始了,每到这个时候,笔者都在想自己是不是又要开始咸鱼了(哭.jpg)。
OK!本次课设的题目比较自由,老师说可以结合生活自定义功能,但要以arduino为下位机,树莓派为上位机,且要用到云。
因为之前的半年时间一直在搞语言考试,很多专业知识都忘掉了,更不要说从来没接触过的arduino和树莓派了,刚开始是有一些蒙的,但不要紧,问题肯定可以解决,只不过是方法不对,一切只是时间问题。
既然要与生活相关,不如设计一款测温湿度的小机器好了。
所需设备
1.arduino:DHT11温湿度传感器,小风扇 *1,LED *1
2.树莓派2 *1
3.PC一台 + 一台显示器
功能分析
1.可以实时测得环境的温湿度
2.温湿度可以通过树莓派上传到OneNet(HTTP协议)
3.当温湿度超过预设值时用户会收到警告
代码实现
Arduino
#include <dht11.h> #define DHT11_PIN 4 #define LED_PIN 13 #define FAN_PIN 8 dht11 DHT; void setup(){ Serial.begin(9600); //设置波特率9600 pinMode(LED_PIN,OUTPUT); pinMode(DHT11_PIN,OUTPUT); pinMode(FAN_PIN,OUTPUT); } void loop(){ int chk; chk = DHT.read(DHT11_PIN); delay(2000); if(chk== DHTLIB_OK){ Serial.print("humidity:"); Serial.print(DHT.humidity); Serial.print("% "); Serial.print("temperature:"); Serial.print(DHT.temperature); Serial.println("*C"); } if(DHT.humidity>=50||DHT.temperature>=28){ digitalWrite(LED_PIN,HIGH); delay(1000); digitalWrite(LED_PIN,LOW); delay(1000); digitalWrite(FAN_PIN,HIGH); } else digitalWrite(FAN_PIN,LOW); delay(1000); }
树莓派
# coding:UTF-8 """ author:AFei data:2020.01.02 version:1.0 function:以arduino为下位机,对温湿度进行监控,并将相关数据上传到OneNet 使用HTTP协议,HTTP协议是无法实现客户端和服务器双向通信的,因此它只能限制在客户端给服务器发送数据 improve:使用MQTT协议,服务器端也可以向客户端发送数据 attention:此代码是以树莓派为平台的 """ # ====import==== import serial import requests import json import time APIKEY = \'8=Bz1JrjznaKeK8EADOVqSvx0dk=\' # API地址(私有) apiheaders = {\'api-key\': APIKEY, \'Content-Length\': \'120\'} # HTTP的header部分 url = \'http://api.heclouds.com/devices/579381146/datapoints\' # 设备的url port = "/dev/ttyACM0" #树莓派上的arduino端口号 SerialFromArduino = serial.Serial(port, 9600, timeout=1) # 连接arduino,波特率为9600,延时为1s,超过1s则断开 SerialFromArduino.flushInput() # 清空flash def data_post(): response = str(SerialFromArduino.readline()) # 读取aruduino发送过来的数据 humidity = response[9:11] # 取湿度 print(humidity) temperature = response[26:28] #取温度 print(temperature) # 将温湿度两个数据加入到json报文中,注意拼写,否则云平台上会出现乱码 PayLoad = ({"datastreams":[{"id":"humidity", "datapoints":[{"value":humidity}]}, {"id":"temperature", "datapoints":[{"value":temperature}]}]}) jdate = json.dumps(PayLoad) # 使用dumps函数,不能使用dump函数,因为dump是将转换完的json数据放入到某一文件中 r = requests.post(url, headers=apiheaders, data=json.dumps(PayLoad)) # 使用post命令,要严格遵守OneNet的开发文档要求 return r while True: time.sleep(2) data_post()
运行结果
树莓派端接收到的串口数据
OneNet平台的设备数据流
所遇问题
1.由于作者使用的时树莓派2,设备性能比较差,因此每次通过USB连接的时候需要等一会儿在运行python脚本,因为树莓派识别arduino的速度比较慢
2.树莓派通过网线连接用户PC之后,树莓派无法上网问题,可以先打开网络和共享中心---->选择以太网----->查看属性------>查看共享中是否勾选了允许其他用户通过此计算机的Internet连接网络,若勾选后树莓派依旧不能上网,看看是否关闭了网络防火墙,因为防火墙会组织未知网络的访问,随后树莓派就可以上网了
3.由于笔者对python也是处于起步阶段,刚开始使用的是json.dump()函数,debug的时候编译器总是报错,说我缺少一个位置参数“fp”,通过百度,了解到dump函数是将数据转换成json格式之后要存在某一个文档中,而想要转为单独的一个个字符串,需要使用dumps()函数
4.对于PayLoad部分,一定要严格遵守json格式,否则上传到OneNet之后的便是一串乱码