阿里云物联网平台体验(树莓派+Python篇)

简介: 阿里云物联网平台体验(树莓派+Python篇) 虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作。

虽然对阿里云物联网平台比较熟悉了,从一开始就有幸参与了飞凤平台(Link Develop 一站式开发平台的前身)的一些偏硬件接入的工作。但是同时也见证了阿里云物联网团队从几十人到数百人的迅速扩张,其物联网平台所承载的内容也急速膨胀,物联网开发套件基础版、飞凤、Link Develop一站式开发平台、物联网开发平台高级版、飞燕、飞象、城市大脑、农业大脑和工业互联平台不一而足……,很难有精力真正熟悉和了解阿里云的每一款物联网产品。

这次有幸成为物联网平台的阿里云MVP体验官,可以从另外一个角度来体验阿里云物联网平台了。最早我们都是基于MCU单片+.NET MF平台,直接采用MQTT协议实现相关的代码对接阿里云平台,虽然也可以基于组态配置很灵活地接入物联网平台,但是对一些WEBAI和云端开发的人来说还是有些陌生。正是因为这些需求,JSJavaPython这些高级语言已经走入了硬件开发,可以直接在MCU芯片上运行,大大提速了物联网云和端的连接工作。

本篇文章就是采用高级语言Python基于树莓派进行物联网云端对接的(后续篇幅会介绍nodejs的云端对接)。

下面是阿里云团队快递过来的相关测试硬件:

904625c55030b9923fc58bd846b7477b548c4731

1、 树莓派3B+  自带wifi和蓝牙

2、 DHT11温湿度模块

3、 LED灯模块

第一步:我们需要为树莓派安装操作系统

我们安装的是Raspbian固件,可以按如下链接介绍的步骤进行安装:https://www.yuque.com/cloud-dev/iot-tech/ig269q

第二步:安装阿里云平台的Python SDK

执行如下指令:$ pip install aliyun-python-sdk-iot-client

第三步:代码编写

在阿里云平台的说明文档:https://www.yuque.com/cloud-dev/iot-tech/rz6fpl 中已经提供了一个示例代码,不过功能相对简单,就是把两个随机数送到云端。

我们设计一个相对复杂的场景,我们首先要实现双向通信,不仅仅把传感器数据送到云端,我们还要让云端下发一个指令,控制相关的设备。

上传数据我们选择一个真实的传感器 DHT11,可以获取温度和湿度值。另外还有一个LED灯模块,通过云端下达的指令,控制灯亮和灯灭。

树莓派的管脚定义图如下:

682de0e98d5333dee50d66c1f79e833a77a05224

DHT11模块共3根线,属于单总线通信,电源线我们接入5V-4pin,地线我们接入GND-6pin,通信pin我们接入GPIO16-36pinLED模块也是3根线,我们电源线接入3V3-1pin,地线接入GND-9pin,控制线接入GPIO4-7pin

554c26e55946ca0354c108d90b8b5180bf86ec9e

LED的控制相对容易,就是控制管脚的高低电平即可。

led_pin = 4                       //GPIO4

GPIO.setmode(GPIO.BCM)            //BCMGPIO定义

GPIO.setup(led_pin, GPIO.OUT)     //设置为输出模式

 

点亮灯:

GPIO.output(led_pin, GPIO.HIGH)

 
GPIO.output(led_pin, GPIO.LOW)

DHT11相对比较复杂,我2010年曾经写过一篇博文,想了解比较深入的可以参考一下(相关链接:https://blog.csdn.net/yfiot/article/details/5996524)。

5e4f6e5acb209b7a38c1fe6b66cac8a3ceba0c5e

 

由于代码比较多,所以我们封装为一个函数,并且可以同时返回两个值,一个是温度T,一个是湿度H

网上大部分Python的实例都是读一次温湿度的,如果要连续读,必须间隔3秒左右,否则很容易失败。由于linux不是实时系统,我们发现即使间隔3秒,无法正确获取温湿度值的现象也时有发生,并且有时候居然也有通过校验的错误值出现。

DHT11的数据Pin接入的是 GPIO16,所以我们定义pin的代码如下:

dht_pin =16

封装函数的代码如下:


def GetDTH():  
        data = []
        j = 0 
        GPIO.setup(dht_pin, GPIO.OUT)
        GPIO.output(dht_pin, GPIO.LOW)
        time.sleep(0.02)
        GPIO.output(dht_pin, GPIO.HIGH)
        GPIO.setup(dht_pin, GPIO.IN)
         
        while GPIO.input(dht_pin) == GPIO.LOW:
          continue
        while GPIO.input(dht_pin) == GPIO.HIGH:
          continue
         
        while j < 40:
          k = 0
          while GPIO.input(dht_pin) == GPIO.LOW:
            continue
          while GPIO.input(dht_pin) == GPIO.HIGH:
            k += 1
            if k > 100:
              break
          if k < 8:
            data.append(0)
          else:
            data.append(1)     
          j += 1
         
        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:
          return temperature,humidity
        else:
          print "wrong"
          return 0,0   


这些准备工作做好后,我们要在云端定义相关产品和设备了。和阿里云官方示例不一样的是,我们额外增加了一个属性LED,具备读写能力,枚举型变量,0-表示关灯,1-表示开灯

9ff0273b9f4e6dbe2f869286c5ec28ecbb0cc389

这个定义好后,我们创建设备,并且获取设备的三元组。由于官方提供的示例仅仅是模拟数据,并且是单向上传,我们需要改造一下。

 

main函数里,增加这句代码:


client.on_message = on_message

表示我们可以获取云端推送的信息。

 

我们云端推送的信息内容如下:


{"method":"thing.service.property.set","id":"169885527","params":{"LED":1},"version":"1.0.0"}

我们需要获取LED的值,所以on_message函数我们要增加一些内容:

   

setjson = json.loads(msg.payload)
    led = setjson['params']['LED']
GPIO.output(led_pin,(GPIO.HIGH if led==1 else GPIO.LOW ))

根据led的值,我们开灯或者关灯。

 

相关代码修改好后,我们就可以上传到树莓派设备,开始运行了,如下图所示:

8e18c40abc796a30175a382b4fe48cb6aa3afebc

这个时候我们查看云端设备的状态,会发现数据已经正常上传到云端了。

2b6143dc908d627c10ee5b94421e1577205c344b

我们在云端产品的在线调试面板进行数据下发测试

3b97d1f9bc4a7702a653908b7612a3ff8710b33a

我们发送01,会发现LED灭或亮了。

以上,我们会发现通过我们所熟悉的Python语言,就可以轻松编写物联网代码了。

本文相关的代码文件:alios_ht_all.py

 

阿里云物联网平台链接:https://dev.iot.aliyun.com/sale?source=deveco_partner_yefan

 

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
3月前
|
传感器 JavaScript 物联网
盘点30个Python树莓派源码Python爱好者不容错过
盘点30个Python树莓派源码Python爱好者不容错过
45 1
盘点30个Python树莓派源码Python爱好者不容错过
|
6月前
|
传感器 存储 机器学习/深度学习
Python树莓派开发
Python树莓派开发
209 0
Python树莓派开发
|
Linux 测试技术 API
树莓派4B:1gRAM安装Python GUI库Kivy教程
树莓派4B:1gRAM安装Python GUI库Kivy教程
444 0
树莓派4B:1gRAM安装Python GUI库Kivy教程
|
JavaScript Python
简单WiFi控制小车系统(树莓派+python+web控制界面)
好丑😂 对不对 ,不过反正可以蛇皮走位就行。 蛇皮走位演示视频: 只需要 一个 index.html 和Index.py 就可以实现 简单WiFi 控制小车。 你需要准备的有
279 1
简单WiFi控制小车系统(树莓派+python+web控制界面)
|
计算机视觉 Python
树莓派/PC实现实时摄像头数据共享(Python—picamera)
树莓派/PC实现实时摄像头数据共享(Python—picamera)
树莓派/PC实现实时摄像头数据共享(Python—picamera)
|
计算机视觉 Python
树莓派/PC实现实时摄像头数据共享(Python—OpenCV)
树莓派/PC实现实时摄像头数据共享(Python—OpenCV)
树莓派/PC实现实时摄像头数据共享(Python—OpenCV)
|
传感器 Python
树莓派读取DHT11温湿度数据 Python
树莓派4使用Python通过GPIO从DHT11温湿度传感器读取数据
628 0
|
物联网 Python
阿里云物联网平台体验(树莓派+Python篇)
采用高级语言Python基于树莓派进行物联网云端对接
3897 0
|
人工智能 测试技术 Python
书籍:树莓派家庭自动化 Home Automation(python) with Raspberry Pi - 2019.pdf
简介 本实践指南一步一步地展示了如何使用功能强大的Raspberry Pi进行家庭自动化。 本书以易于理解的方式编写,包含适用于Amazon Echo,Google Home,智能灯泡和恒温器等的DIY项目。
|
Python
树莓派pca9685舵机驱动板python驱动
#以下为python源程序 #输入通道与角度。即可选通并使该通道的舵机转动到相应的角度 from __future__ import division #导入 __future__ 文件的 division 功能函数(模块、变量名.
2910 0

相关产品

  • 物联网平台