前言

🔥 你是否遇到过这些问题?

手动记录温湿度数据耗时费力,还容易出错?
想用树莓派做物联网监控,却被MQTT配置、平台对接搞到崩溃?
花了半天时间上传数据,却只能在本地查看,无法远程实时监控?
👉 今天这篇教程,让你彻底告别这些烦恼!
✅ 10分钟搞定硬件连接:树莓派+DHT11传感器即插即用
✅ 傻瓜式云平台配置:OneNET平台创建产品/设备,自动生成SDK接入代码
✅ 数据实时查看:网页同步显示温湿度曲线,历史数据自由导出

场景介绍

树莓派连接温湿度传感器,采集数据,使用OneNET平台创建产品和设备,并通过SDK实现数据上传,云平台实时监测查看数据。

准备工作

. 硬件选型
● 主控单元:树莓派4B
● 传感器:温湿度传感器(如DHT11)
● 配件: 杜邦线、面包板、T型扩展
● 其他模块:Wi-Fi和蓝牙模块(树莓派4B内置)

一、注册AlOT物联网平台账号

浏览器输入OneNET平台网址:https://open.iot.10086.cn
在这里插入图片描述
在这里插入图片描述

二、创建产品

1、登录AlOT平台,点击产品开发

在这里插入图片描述

2、创建产品
(1)下拉选择智慧生活——家居安防——温湿度传感器(免)
在这里插入图片描述

(2)选择智能化方式,设备接入
在这里插入图片描述

(3)填写产品相关信息,产品名称,所属地市,节点类型,接入协议,数据协议,联网方式,开发方案(这里选择自定义方案)
在这里插入图片描述

(4)点击确定,产品创建成功
在这里插入图片描述

三、添加设备

(1)点击设备管理-添加设备
在这里插入图片描述
在这里插入图片描述
(2)点击确定后,设备添加完成
在这里插入图片描述

四、设置物模型

(1)产品开发——点击设置物模型
在这里插入图片描述
(2)添加自定义功能点
在这里插入图片描述
(3)自定义温度模型,填写功能名称,标识符,数据类型,取值范围,单位,读取类型
在这里插入图片描述

(4)自定义湿度模型,填写功能名称,标识符,数据类型,取值范围,单位,读取类型

在这里插入图片描述
(5)保存物模型定义数据
在这里插入图片描述
在这里插入图片描述

五、下载SDK用于设备接入开发

(1)保存成功后,点击前往设备开发,选择设备开发方式——基于SDK开发
在这里插入图片描述

(2)下一步,嵌入式开发找到平台自动生成功能接口SDK代码——点击功能接口SDK获取,将自动生成并下载SDK
在这里插入图片描述
用户在平台端获取的设备SDK中,已包括平台根据设备所属产品的物模型自动生成的tm_user.c和tm_user.h文件

注:修改物模型后,会重新生成tm_user文件,需要重新获取新的SDK。

六、上传SDK文件到树莓派

下载好SDK后,将SDK文件传到树莓派上,这里我们使用filezilla工具进行文件传输,当然也可以使用winscp
在这里插入图片描述
VNC远程桌面连接树莓派,查看文件传输已经完成
在这里插入图片描述

七、修改SDK文件

(1)OneNET平台找到设备管理->设备详情中可以查看设备名称、产品ID、设备密钥三个关键信息
在这里插入图片描述

(2)Genay工具打开main.c文件,配置产品id:TM_PRODUCT_ID、设备名称:TM_DEVICE_NAME、设备密钥“TM_ACCESS_KEY
在这里插入图片描述

八、编写DTH11温湿度传感器核心代码

(1)编写代码:DTH11.c
#编写DTH11温湿度传感器代码

#include <wiringPi.h>
#include <stdio.h>
#include <stdlib.h>
#include "DHT11.h"
#include <stdint.h>

typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef unsigned long uint32;

#define HIGH_TIME 32

int pinNumber = 0;  //gpio17
uint32 databuf;
uint64_t humi, temp;

void updateTemperatureAndHumidity() {
    if (readSensorData()) {
        humi= (databuf >> 24) & 0xff;
        temp= (databuf >> 8) & 0xff;
        printf("humi=%lld\n",humi);
        printf("temp=%lld\n",temp);
    } else {
        humi = 0;
        temp = 0;
        printf("humi=%lld\n",humi);
        printf("temp=%lld\n",temp);
    }
}

uint8 readSensorData(void)
{
    uint8 crc;
    uint8 i;

    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, 0);
    delay(25);
    digitalWrite(pinNumber, 1);
    pinMode(pinNumber, INPUT);
    pullUpDnControl(pinNumber, PUD_UP);

    delayMicroseconds(27);
    if (digitalRead(pinNumber) == 0)
    {
        while (!digitalRead(pinNumber));

        for (i = 0; i < 32; i++)
        {
            while (digitalRead(pinNumber));
            while (!digitalRead(pinNumber));
            delayMicroseconds(HIGH_TIME);
            databuf *= 2;
            if (digitalRead(pinNumber) == 1)
            {
                databuf++;
            }
        }

        for (i = 0; i < 8; i++)
        {
            while (digitalRead(pinNumber));
            while (!digitalRead(pinNumber));
            delayMicroseconds(HIGH_TIME);
            crc *= 2;
            if (digitalRead(pinNumber) == 1)
            {
                crc++;
            }
        }
        return 1;
    }
    else
    {
        return 0;
    }
}

void cgq()
{
    printf("Use GPIO17接口 to read data!\n");

    if (-1 == wiringPiSetup()) {
        printf("Setup wiringPi failed!");
        exit(1);
    }

    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, 1);

    printf("Enter OS-------\n");
    pinMode(pinNumber, OUTPUT);
    digitalWrite(pinNumber, 1);
    delay(3000);
    updateTemperatureAndHumidity();
}

(2)编写代码:DTH11.h

#ifndef DHT11_H
#define DHT11_H
#include <stdint.h>

typedef unsigned char uint8;
typedef unsigned long uint32;

extern int pinNumber;
extern uint32 databuf;
extern uint64_t humi, temp;

void updateTemperatureAndHumidity();
void cgq();
uint8 readSensorData(void);

#endif // DHT11_H

(3)在CMakeLists.txt文件中添加路径examples/things_model、examples/things_model/DHT11.c

cmake_minimum_required(VERSION 3.9)
project(mqtts_onejson_soc)

# 设置CXX编译选项
set(WORK_DIR ${CMAKE_CURRENT_SOURCE_DIR})

include_directories(
    ./
    common
    onenet/platforms/include
    onenet/tm
    onenet/utils
    onenet/protocols/mqtt/
    onenet/protocols/mqtt/paho-mqtt
    onenet/protocols/http
    tools/cJSON
    tools/wolfssl/port
    tools/wolfssl/wolfssl-3.15.3
    services/ota
    onenet/security/tls
    examples/things_model   
)
file(GLOB src
    common/log.c
    common/slist.c
    common/utils.c
    onenet/security/tls/tls.c
    onenet/tm/tm_api.c
    onenet/tm/tm_data.c
    onenet/tm/tm_onejson.c
    onenet/tm/tm_mqtt.c
    onenet/tm/tm_subdev.c
    onenet/tm/dev_discov.c
    onenet/utils/dev_token.c
    onenet/platforms/linux/osl_linux.c
    onenet/platforms/linux/tcp_linux.c
    onenet/platforms/linux/time_linux.c
    onenet/platforms/linux/udp_linux.c
    onenet/protocols/mqtt/paho-mqtt/MQTTConnectClient.c
    onenet/protocols/mqtt/paho-mqtt/MQTTSubscribeClient.c
    onenet/protocols/mqtt/paho-mqtt/MQTTConnectServer.c
    onenet/protocols/mqtt/paho-mqtt/MQTTSubscribeServer.c
    onenet/protocols/mqtt/paho-mqtt/MQTTDeserializePublish.c
    onenet/protocols/mqtt/paho-mqtt/MQTTUnsubscribeClient.c
    onenet/protocols/mqtt/paho-mqtt/MQTTFormat.c
    onenet/protocols/mqtt/paho-mqtt/MQTTUnsubscribeServer.c
    onenet/protocols/mqtt/paho-mqtt/MQTTPacket.c
    onenet/protocols/mqtt/paho-mqtt/mqtt_client.c
    onenet/protocols/mqtt/paho-mqtt/MQTTSerializePublish.c
    onenet/protocols/http/http_api.c
    tools/cJSON/cJSON.c
    tools/wolfssl/wolfssl-3.15.3/src/internal.c
    tools/wolfssl/wolfssl-3.15.3/src/keys.c
    tools/wolfssl/wolfssl-3.15.3/src/ssl.c
    tools/wolfssl/wolfssl-3.15.3/src/tls.c
    tools/wolfssl/wolfssl-3.15.3/src/wolfio.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/aes.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/asn.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/coding.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/hash.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/hmac.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/integer.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/md5.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/misc.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/random.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/rsa.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/sha.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/sha256.c
    tools/wolfssl/wolfssl-3.15.3/wolfcrypt/src/wc_port.c
    examples/things_model/main.c
    examples/things_model/tm_user.c
    examples/things_model/DHT11.c
    
)
add_definitions(
    -g
    -DCONFIG_ACCESS_LIFE_TIME=60
    -DCONFIG_SEND_BUF_LEN_MAX=1024
    -DCONFIG_RECV_BUF_LEN_MAX=1024
    -DCONFIG_TM_MQTT
    -DCONFIG_PLAT_ARCH_64BIT=1
    -DCONFIG_TM=1
    -DCONFIG_TM_GATEWAY=1
    -DCONFIG_TM_VERSION="1.0"
    -DCONFIG_DEFAULT_REQUEST_TIMEOUT=1000
    -DCONFIG_PACKET_PAYLOAD_LEN_MAX=2048
    -DCONFIG_HAVE_STDINT=1
    -DCONFIG_NETWORK_TLS=1
)

add_executable(${CMAKE_PROJECT_NAME} ${src})
target_link_libraries(${CMAKE_PROJECT_NAME} pthread)
target_link_libraries(${CMAKE_PROJECT_NAME} wiringPi)

在这里插入图片描述
在这里插入图片描述

九、安装cmake

(1)树莓派更新软件包:

sudo apt-get update

安装cmake:

sudo apt-get install cmake

在这里插入图片描述
(2)在CMakeLists.txt文件夹的最后一行添加:
target_link_libraries(${CMAKE_PROJECT_NAME} wiringPi)
在这里插入图片描述

(3)在编译器里设置生成指令
在这里插入图片描述

在Complie、build、Lint 三个框后面加上 空格-|wiringPi
在这里插入图片描述

十、传感器数据上传

打开tm_user.h文件,可以看到运用了三种函数,读取温度和湿度的回调函数,下发函数,上报函数
在这里插入图片描述

这里我们数据上传云平台只需要在主函数main.c中调用上报函数
将设置个定值测试是否联通(设置温度定值temp:“38.6”,湿度度定值humi:50

while (1) 
    {
     if (0 != (ret = tm_step(200))) 
        {
           logi("ThingModel tm_step failed,ret is %d", ret);
            break;
        }
        if(0==j++%20)//222
        {
        cgq();
        tm_prop_humi_notify(NULL,50,0,3000);//上传湿度数据
        tm_prop_temp_notify(NULL,38.6,0,3000);//上传温度数据
        time_delay_ms(50);
        }
    }

十一、树莓派连接传感器

所需硬件

(1)树莓派4b
(2)杜邦线
(3)DTH11传感器

接线

VCC(或正极) — 树莓派的3v电源
GND (地线或者负极)— 树莓派的gnd接口
DATA (D或者out) —树莓派的GPIO引脚 这里链接gpio17接口

连接示意图:

在这里插入图片描述

十二、编译SDK文件包

在这里插入图片描述

进行make编译,输入以下指令:
1、 创建build文件夹

mkdir build        

2、进入build文件夹

cd build           

3、以…/目录下的CMakeLists.txt生成makefile

cmake .. 

4、编译

make       

5、执行(MQTT协议)

./mqtts_onejson_soc     

在这里插入图片描述

十三、AloT云平台查看数据

上传数据成功显示在后台
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

十四、实时监测数据

在主函数main.c中调用上报函数,修改代码,将定值改为对应的标识
在这里插入图片描述

重新进行make编译运行

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐