基于阿里云平台的智能环境监测系统(树莓派4B)

发布时间:2024年01月12日

目录

1. 系统的设计背景. 1

1.1 设计背景. 1

2. 系统的设计方案. 2

2.1 设计方案. 2

2.2 硬件的设计. 2

2.3 阿里云物联网平台的配置. 4

3. 总结与分析. 5

参考文献. 6

代码附录. 7

????????????????? ????????

基于阿里云平台的智能环境监测系统

1. 系统的设计背景

1.1 设计背景

在当今世界,人们花费大部分时间在室内,无论是在家中、办公室、学校还是商店。因此,室内环境[1]的质量对人们的生活质量和健康产生了深远影响。空气质量、温度、湿度、光照等因素都可以影响舒适度和工作效率。因此,设计一个基于阿里云平台和树莓派的室内智能环境监测系统至关重要,以满足人们对室内环境质量的需求。

首先,室内空气质量对人体健康至关重要。室内可能存在的空气污染物质,如二氧化碳、甲醛、挥发性有机化合物和颗粒物,对呼吸系统和整体健康产生负面影响。室内智能环境监测系统可以实时监测这些污染物质的浓度,提供警报或建议,帮助人们采取行动,改善室内空气质量。其次,温度和湿度是另一个重要的因素,它们会影响人们的舒适度和健康。过高或过低的温度以及干燥或潮湿的环境都可能导致不适感,影响工作效率和生活品质。这个系统将监测室内温度和湿度,并根据当前的环境情况做出调整,如开启、关闭风扇等。此外,室内光照也是关键因素。足够的光照对于提高警觉性和情绪状态非常重要。系统将包括光感应器,用于监测室内光照水平,并能够智能调整照明,以改善室内的视觉环境。

阿里云平台[2]作为强大的云计算和数据存储解决方案,将为这个系统提供数据存储、分析和远程访问的能力。树莓派将作为数据采集和传输的核心,负责实时收集各种环境数据并将其上传到云端。用户可以通过Web界面轻松访问实时环境数据,获得室内环境的综合视图,并根据需要进行调整。

这个室内智能环境监测系统将不仅适用于个人家庭,还可以用于办公室、学校、医院和商店等室内场所。它将有助于改善室内环境质量,提高生活品质,促进健康和工作效率。此外,系统还可以节约能源,减少资源浪费,对可持续发展目标做出贡献。

综上所述,基于阿里云平台和树莓派[3]的室内智能环境监测系统将成为一个创新的、可定制的解决方案,有助于满足人们对室内环境质量的需求,提高生活质量,保障健康,同时也对可持续性和节能目标产生积极影响。

2. 系统的设计方案

2.1 设计方案

B站视频链接: 不知道这个视频能收到多少点赞_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1u84y127LV/?share_source=copy_web&vd_source=05015ee1ef592cf60bd4691d62be503f

B站视频链接:不知道这个视频能收到多少点赞_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1u84y127LV/?share_source=copy_web&vd_source=05015ee1ef592cf60bd4691d62be503f

B站视频链接:不知道这个视频能收到多少点赞_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV1u84y127LV/?share_source=copy_web&vd_source=05015ee1ef592cf60bd4691d62be503f

??????? 如图1所示,树莓派连接各个外部硬件传感器模块,将测到的数据通过上传到阿里云,经过阿里云分析后下发命令控制蜂鸣器和照明模块工作。

(图1 系统结构图)

2.2 硬件的设计

(1)系统的主控

(图2 树莓派4B实物图)

树莓派4 Model B是一款强大、多功能的单板计算机,搭载四核CPU[4]、多种连接选项、丰富的内存配置和GPIO引脚,适用于各种应用,从教育到物联网和嵌入式开发,价格亲民且低功耗,是广泛用于创造、学习和实验的理想工具。基于以上特点,选用树莓派4 Model B作为该系统的主控。

(2)温湿度传感器

DHT11温湿度传感器[5]以其低成本、简单易用、数字输出、同时测量温湿度、可用性广泛和低功耗的特点而脱颖而出,适合本系统需要的基本温湿度数据。

(3)光照传感器

光敏电阻传感器[6]是一种感光元件,其电阻值随光照强度的变化而变化,光敏电阻传感器通常用于检测环境光照水平的变化,可用于亮度控制、光敏报警和光敏开关等应用,它们对光敏感、价格适中,适用于多种光敏感测量和控制任务。

(4)空气质量传感器

空气质量传感器[7]的优点包括实时监测环境中的污染物浓度,提供及时警报,帮助改善室内和室外空气质量,以及在健康和环境保护领域具有广泛的应用潜力。其高精度、可靠性和可编程性也使其成为科研、工业控制和物联网应用的重要工具。

(5)LED灯

RGB三原色的LED灯通过混合红、绿和蓝三种基本颜色的光以不同的亮度和比例,能够产生广泛的颜色和色彩效果,适用于照明、娱乐、装饰以及指示等多种应用,其可调节的亮度和色彩控制能力使其成为创意灯光设计和智能家居系统中不可或缺的组成部分。

(6)直流电机

直流电机模块可通过外部信号控制电机的转速和方向。它简化了直流电机的驱动过程。这种模块常用于机器人、小型车辆、家用电器和自动化系统等应用。在本系统中,只需提供高低电平即可控制风扇的正反转,非常方便。

(7)无源蜂鸣器

无源蜂鸣器是一种电子音响设备,不内置振荡器或驱动电路,其发声依赖外部交流电源或脉冲信号的输入,通过在合适的频率和时序下工作,能够产生声音或警报,常用于警报系统、计时器和各种提醒应用,因其简单、稳定和经济的特点而广泛应用。

(8)系统实物图

(图3 系统实物图)

2.3 阿里云物联网平台的配置

阿里云平台在物联网应用[8]开发中发挥着重要的作用。首先,它提供了高度可扩展的云计算基础设施,允许开发者轻松管理和存储来自大规模物联网设备的数据。其次,阿里云平台为设备连接和通信提供了安全性和可靠性,保护数据隐私和确保实时互联。此外,它支持各种传感器和协议,使开发者能够集成多样化的物联网设备。最重要的是,阿里云提供了丰富的工具和服务,如数据分析、人工智能、大数据处理等,以帮助开发者从物联网数据中提取有价值的信息,实现更智能的应用和决策。因此,阿里云平台为物联网应用提供了强大的基础设施和工具,加速了物联网技术的发展和创新,对于构建智能、高效、安全的物联网解决方案至关重要。

  1. 创建产品与设备

要想把各个硬件与阿里云物联网平台建立联系,第一步需要再阿里云物联网平台上创建一产品与设备,这里我把它命名为raspberry1,设备所属产品命名为树莓派测试,因为这个设备是我刚学习树莓派时创建的,这里我就直接使用了。

(图4 创建的产品与设备)

(2)为产品定义物理模型

接下来需要为所创建的产品定义物理模型,这一步也是相当关键的,在本系统中,主要用到了三个物理模型:光照强度、温度、湿度。这三个物理模型都有各自的标识符和取值范围,定义好物理模型之后,确定无误点击发布。

(图5 为产品定义物理模型)

(3)建立设备与平台的连接

最后一步是非常重要的,也是最有挑战性的。就是把实物与阿里云连接起来,这里需要用到阿里云物联网与实物之间的通信协议。经过我查阅资料后,发现两者之间是通过HTTP协议进行连接的,而且阿里云平台已经给出了相关的代码例程,需要我修改的是所创建产品的三元素,以及相应逻辑代码的编写。下图为连接成功后上传数据的截图,可以看出,各个传感器将实时检测数据并上传到了阿里云后台,与我在之前创建的三个物理模型相互对应,而且数据准确,约3秒上传更新一次数据。

(图6 数据上传至阿里云平台)

3. 总结与分析

这个智能环境监测系统为用户提供了多种重要的功能,旨在提高生活质量和安全性。首先,系统的烟雾报警功能是关键的生命安全特性,能够在检测到烟雾时立即触发警报,提醒居民采取适当的安全措施,减少火灾风险[9]。其次,智能照明功能为用户提供了便捷性和能源效益,自动调整照明强度和开关状态,改善室内环境,同时减少能源浪费。最重要的是,系统将传感器数据上传到阿里云平台,允许用户随时远程监测室内环境,提供了额外的便利性。另外,系统的云集成是一个显著特点,它为数据存储、访问和分析提供了可靠的平台。这不仅有助于用户监测实时数据,还可以为将来的数据分析和趋势识别提供关键支持。而且,用户可以轻松地通过Web界面进行远程控制和监测,增加了系统的用户友好性和可用性。

通过实地测试,该系统数据监测相对精准,数据上传至阿里云时速度快,实时性高,效果良好;当空气质量传感器检测到室内有可燃性气体[10]时,会立即驱动无源蜂鸣器报警;当光照强度低于某一阈值时,系统会自动打开灯光,当光照强度高于某一阈值时,灯光会自动熄灭,并将实时的光照强度值上传至阿里云平台,并储存,方便用户查看。

最后,感谢老师在课堂的辛勤付出和对同学们的严格要求,让我学到了有关物联网和各种传感器的很多知识。在以后得学习生涯和职业生涯中,我将会牢记老师的教导,对待学习一丝不苟,对待同学真诚善良,对待老师礼貌尊重。在以后我也会多多关注有关物联网方面的知识,不断学习,做一个有知识有文化的新青年。

参考文献

代码附录

在树莓派上运行Run.py

Run.py? # 2107130403 蔡强 21电信2班
#?-*-?coding:?utf-8?-*-??
import?paho.mqtt.client?as?mqtt??
import?RPi.GPIO?as?GPIO??
import?Adafruit_DHT??
import?time??
import?hashlib??
import?hmac??
import?random??
import?json??
import?PCF8591??
import?MQ_2??
#?指定传感器型号和引脚号??
sensor?=?Adafruit_DHT.DHT11??
pin?=?21??#?根据实际连接调整引脚号??
#?这个就是我们在阿里云注册产品和设备时的三元组啦??
#?把我们自己对应的三元组填进去即可??
options?=?{??
????'productKey':?'k07x5a31RzY',??
????'deviceName':?'raspberry1',??
????'deviceSecret':?'7ae2b6130b4348f4158f8db6745527b6',??
????'regionId':?'cn-shanghai'??
}??
HOST?=?options['productKey']?+?'.iot-as-mqtt.'?+?options['regionId']?+?'.aliyuncs.com'??
PORT?=?1883??
PUB_TOPIC?=?"/sys/"?+?options['productKey']?+?"/"?+?options['deviceName']?+?"/thing/event/property/post";??
#?The?callback?for?when?the?client?receives?a?CONNACK?response?from?the?server.??
def?on_connect(client,?userdata,?flags,?rc):??
????print("Connected?with?result?code?"?+?str(rc))??
#?client.subscribe("the/topic")?
#?The?callback?for?when?a?PUBLISH?message?is?received?from?the?server.??
def?on_message(client,?userdata,?msg):??
????print(msg.topic?+?"?"?+?str(msg.payload))??
def?hmacsha1(key,?msg):??
????return?hmac.new(key.encode(),?msg.encode(),?hashlib.sha1).hexdigest()???
def?getAliyunIoTClient():??
????timestamp?=?str(int(time.time()))??
????CLIENT_ID?=?"paho.py|securemode=3,signmethod=hmacsha1,timestamp="?+?timestamp?+?"|"??
????CONTENT_STR_FORMAT?=?"clientIdpaho.pydeviceName"?+?options['deviceName']?+?"productKey"?+?options[??
????????'productKey']?+?"timestamp"?+?timestamp??
????#?set?username/password.??
????USER_NAME?=?options['deviceName']?+?"&"?+?options['productKey']??
????PWD?=?hmacsha1(options['deviceSecret'],?CONTENT_STR_FORMAT)??
????client?=?mqtt.Client(client_id=CLIENT_ID,?clean_session=False)??
????client.username_pw_set(USER_NAME,?PWD)??
????return?client?
#Humidity,?temperature?=?Adafruit_DHT.read_retry(sensor,?pin)??
def?get_sensor_data():??
????Humidity,?temperature?=?Adafruit_DHT.read_retry(sensor,?pin)??
????return?Humidity,?temperature??
if?__name__?==?'__main__':??
????client?=?getAliyunIoTClient()??
????client.on_connect?=?on_connect??
????client.on_message?=?on_message??
????client.connect(HOST,?1883,?300)??
????PCF8591.setup(0x48)??
????while?True:??#?无限循环??
????????Humidity,?temperature?=?get_sensor_data()??
????????tmp?=?(255?-?PCF8591.read(1))??
????????tmp?=?int(tmp?*?(255?-?125)?/?255?+?125)??
????????MQ=20??
????????status?=?GPIO.input(MQ)??
????????PCF8591.PCF()??
????????MQ_2.MQ_2()??
????????payload_json?=?{??
????????????'id':?int(time.time()),??
????????????'params':?{??
????????????????'temperature':?temperature,??
????????????????'Humidity':?Humidity,??
????????????????'tmp':tmp??
????????????},??
????????????'method':?"thing.event.property.post"??
????????}??
????????print('-----------------------')??
????????print("湿度:",?Humidity)??
????????print("温度:",?temperature)??
????????print("光照强度:",?tmp)??
????????print('风扇状态:',status)??
????????print('-----------------------')??
????????client.publish(PUB_TOPIC,?payload=str(payload_json),?qos=1)??
????????time.sleep(3)??#?每隔3秒钟获取一次传感器数据?

下面是aliLink.py

import time, json, random
import hmac, hashlib


def linkiot(DeviceName, ProductKey, DeviceSecret, server='iot-as-mqtt.cn-shanghai.aliyuncs.com'):
    serverUrl = server
    ClientIdSuffix = "|securemode=3,signmethod=hmacsha256,timestamp="

    # 拼合
    Times = str(int(time.time()))  # 获取登录时间戳
    Server = ProductKey + '.' + serverUrl  # 服务器地址
    ClientId = DeviceName + ClientIdSuffix + Times + '|'  # ClientId
    userNmae = DeviceName + "&" + ProductKey
    PasswdClear = "clientId" + DeviceName + "deviceName" + DeviceName + "productKey" + ProductKey + "timestamp" + Times  # 明文密码

    # 加密
    h = hmac.new(bytes(DeviceSecret, encoding='UTF-8'), digestmod=hashlib.sha256)  # 使用密钥
    h.update(bytes(PasswdClear, encoding='UTF-8'))
    Passwd = h.hexdigest()
    return Server, ClientId, userNmae, Passwd


# 阿里Alink协议实现(字典传入,json str返回)
def Alink(params):
    AlinkJson = {}
    AlinkJson["id"] = random.randint(0, 999999)
    AlinkJson["version"] = "1.0"
    AlinkJson["params"] = params
    AlinkJson["method"] = "thing.event.property.post"
    return json.dumps(AlinkJson)


if __name__ == "__main__":
    pass

下面是风扇Fan.py

import RPi.GPIO as GPIO
import time

# 设置GPIO模式为BCM模式
GPIO.setmode(GPIO.BCM)

Fan = 6
# 设置引脚为输出模式
GPIO.setup(Fan, GPIO.OUT)

# 正转函数
def forward():
    GPIO.output(Fan, GPIO.HIGH)

# 停止函数
def stop():
    GPIO.output(Fan, GPIO.LOW)

下面是灯光Light.py

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

LED_R = 13
LED_G = 16
LED_B = 17

GPIO.setup(LED_R,GPIO.OUT)
GPIO.setup(LED_G,GPIO.OUT)
GPIO.setup(LED_B,GPIO.OUT)

GPIO.output(LED_R,GPIO.LOW)
GPIO.output(LED_G,GPIO.LOW)
GPIO.output(LED_B,GPIO.LOW)

def LED_ON():
    GPIO.output(LED_R,GPIO.HIGH)
    GPIO.output(LED_G,GPIO.HIGH)
    GPIO.output(LED_B,GPIO.HIGH)

def LED_OFF():
    GPIO.output(LED_R,GPIO.LOW)
    GPIO.output(LED_G,GPIO.LOW)
    GPIO.output(LED_B,GPIO.LOW)

下面是MQ_2.py

import RPi.GPIO as GPIO
import time
import Fan
import Light

MQ=20

GPIO.setmode(GPIO.BCM)
GPIO.setup(MQ, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)

def MQ_2():
    status = GPIO.input(MQ)
    if status == 1:
        #print('风扇状态:',status)
        Fan.stop()
    else:
        #print('风扇状态:',status)
        Fan.forward()

下面是协议mqttd.py

#!/usr/bin/python3

# pip install paho-mqtt
import paho.mqtt.client


# =====初始化======
class MQTT:
    def __init__(self, host, CcientID, username=None, password=None, port=1883, timeOut=60):
        self.Host = host
        self.Port = port
        self.timeOut = timeOut
        self.username = username
        self.password = password
        self.CcientID = CcientID

        self.mqttc = paho.mqtt.client.Client(self.CcientID)  # 配置ID
        if self.username is not None:  # 判断用户名密码是否为空
            self.mqttc.username_pw_set(self.username, self.password)  # 不为空则配置账号密码

        self.mqttc.connect(self.Host, self.Port, self.timeOut)  # 初始化服务器  IP  端口  超时时间

    # 初始化
    def begin(self, message, connect):
        self.mqttc.on_connect = connect
        self.mqttc.on_message = message
        self.mqttc.loop_start()  # 后台新进程循环监听

    # =====发送消息==========
    def push(self, tag, date, _Qos=0):
        self.mqttc.publish(tag, date, _Qos)
        # print('OK',date)

    # =======订阅tips=====
    def subscribe(self, _tag):
        self.mqttc.subscribe(_tag)  # 监听标签

下面是PCF8591.py

import smbus  # 在程序中导入“smbus”模块
import RPi.GPIO as GPIO
import time
import Light

bus = smbus.SMBus(1)  # 创建一个smbus实例
GPIO.setmode(GPIO.BCM)
GPIO.setup(17,GPIO.OUT)

# 在树莓派上查询PCF8591的地址:“sudo i2cdetect -y 1”
def setup(Addr):
    global address
    address = Addr


def read(chn):  # channel
    if chn == 0:
        bus.write_byte(address, 0x40)  # 发送一个控制字节到设备
    if chn == 1:
        bus.write_byte(address, 0x41)
    if chn == 2:
        bus.write_byte(address, 0x42)
    if chn == 3:
        bus.write_byte(address, 0x43)
    bus.read_byte(address)  # 从设备读取单个字节,而不指定设备寄存器。
    return bus.read_byte(address)  # 返回某通道输入的模拟值A/D转换后的数字值


def write(val):
    temp = val  # 将字符串值移动到temp
    temp = int(temp)  # 将字符串改为整数类型
    # print temp to see on terminal else comment out
    bus.write_byte_data(address, 0x40, temp)


# 写入字节数据,将数字值转化成模拟值从AOUT输出

def PCF():
    tmp = (255 - read(1))
    tmp = int(tmp * (255 - 125) / 255 + 125)
    #print('光照强度为', tmp)  # 光敏电阻模拟信号转化的数字
    if tmp<185:
        Light.LED_ON()
    else:
        Light.LED_OFF()
    # 125以下LED不会亮,所以将“0-255”转换为“125-255”,调节亮度时灯不会熄灭
    write(tmp)
    time.sleep(0.5)
文章来源:https://blog.csdn.net/m0_61925899/article/details/135532573
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。