cyfMood

背景故事

快放假了,紧张刺激的课程设计又要开始了,每到这个时候,笔者都在想自己是不是又要开始咸鱼了(哭.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之后的便是一串乱码

分类:

技术点:

相关文章: