art-pi dht11温湿度上云阿里云

这里使用的是RT-Thread studio中的mqtt连接阿里云和dht11自带的例程进行修改融合完成的

1.dht11例程:

依赖包:

使能dht11例程:

本人外接的dht11模块,数据引脚用的GPIOH_2 所以例程中初始化引脚改为H,2

#include <rtthread.h>
#include <rtdevice.h>
#include "sensor.h"
#include "sensor_dallas_dht11.h"
#include "drv_gpio.h"

/* Modify this pin according to the actual wiring situation */
#define DHT11_DATA_PIN    GET_PIN(H, 2)

 

具体参照自己实际情况:

 

2.Ali例程参照本人另一篇文章:

art-pi 上阿里云_CYF9984的博客-CSDN博客

3.代码整合:

简单粗暴的将两个例程的代码合并到一个里面,然后再慢慢修改代码位置。(直接合并起来也能跑,但是都是各跑各的,所以需要修改一下逻辑,达到将温湿度数据传输上云的目的)

首先就是获取温湿度数据,本人通过定义全局变量然后再通过赋值的方式获取的。(全局变量相信都会,就不做解释)

例程中 获取温湿度函数

static void read_temp_entry(void *parameter)
{
    rt_device_t dev = RT_NULL;
    struct rt_sensor_data sensor_data;
    rt_size_t res;
    rt_uint8_t get_data_freq = 1; /* 1Hz */

    dev = rt_device_find("temp_dht11");
    if (dev == RT_NULL)
    {
        return;
    }

    if (rt_device_open(dev, RT_DEVICE_FLAG_RDWR) != RT_EOK)
    {
        rt_kprintf("open device failed!\n");
        return;
    }

    rt_device_control(dev, RT_SENSOR_CTRL_SET_ODR, (void *)(&get_data_freq));
    while(1)
    {

        res = rt_device_read(dev, 0, &sensor_data, 1);
        if (res != 1)
        {
            rt_kprintf("read data failed! result is %d\n", res);
            rt_device_close(dev);
            return;
        }
        else
        {
            if (sensor_data.data.temp >= 0)
            {
                uint8_t temp = (sensor_data.data.temp & 0xffff) >> 0;      // get temp
                uint8_t humi = (sensor_data.data.temp & 0xffff0000) >> 16; // get humi
                tempT=temp;
                humiT=humi;
                //rt_kprintf("temp:%d, humi:%d\n" ,temp, humi);
            }

        }

        rt_thread_delay(3000);
    }
}

在该函数中本人就只添加了两行代码,并将窗口打印温湿度的代码注释掉,rt_thread_delay();函数的参数例程中给的是1000也就是延时1s 我改成了3s。其他的没动。

tempT=temp;
humiT=humi;
//rt_kprintf("temp:%d, humi:%d\n" ,temp, humi);

其中 tempT和humiT就是我定义的全局变量。 

然后就是修改消息发布的函数了

static int example_publish(void *handle)
{
    int             res = 0;
    const char     *fmt = "/%s/%s/user/temperature";    //订阅消息
    char           *topic = NULL;
    int             topic_len = 0;

    char           *payload="";

    char           *Str1="{\"data\":{\"temperature\":\"";
    char           *Str2="\",\"humidity\":\"";
    char           *Str3="\",\"alarm\":\"0\"}}";
    char *Str01 = (char *) malloc(strlen(Str1) + strlen(tempT));
    sprintf(Str01, "%s%d", Str1, tempT);
    char *Str02 = (char *) malloc(strlen(Str2) + strlen(humiT));
    sprintf(Str02, "%s%d", Str2, humiT);
    char *Str0102 = (char *) malloc(strlen(Str01) + strlen(Str02));
    sprintf(Str0102, "%s%s", Str01, Str02);
    char *StrNum = (char *) malloc(strlen(Str0102) + strlen(Str3));
    sprintf(StrNum, "%s%s", Str0102, Str3);
    payload=StrNum;
    rt_kprintf("%s\n" ,payload);



    topic_len = strlen(fmt) + strlen(DEMO_PRODUCT_KEY) + strlen(DEMO_DEVICE_NAME) + 1;
    topic = HAL_Malloc(topic_len);
    if (topic == NULL) {
        EXAMPLE_TRACE("memory not enough");
        return -1;
    }
    memset(topic, 0, topic_len);
    HAL_Snprintf(topic, topic_len, fmt, DEMO_PRODUCT_KEY, DEMO_DEVICE_NAME);

    res = IOT_MQTT_Publish_Simple(0, topic, IOTX_MQTT_QOS0, payload, strlen(payload));
    if (res < 0) {
        EXAMPLE_TRACE("publish failed, res = %d", res);
        HAL_Free(topic);
        return -1;
    }

    HAL_Free(topic);
    return 0;
}

订阅消息要和自己的topic一致:

 const char     *fmt = "/%s/%s/user/temperature";    //订阅消息

修改例程中的payload值

因为阿里云收的数据是JSON格式的所以需要按照格式修改。

本人添加的代码:

    char           *payload="";

    char           *Str1="{\"data\":{\"temperature\":\"";
    char           *Str2="\",\"humidity\":\"";
    char           *Str3="\",\"alarm\":\"0\"}}";
    char *Str01 = (char *) malloc(strlen(Str1) + strlen(tempT));
    sprintf(Str01, "%s%d", Str1, tempT);
    char *Str02 = (char *) malloc(strlen(Str2) + strlen(humiT));
    sprintf(Str02, "%s%d", Str2, humiT);
    char *Str0102 = (char *) malloc(strlen(Str01) + strlen(Str02));
    sprintf(Str0102, "%s%s", Str01, Str02);
    char *StrNum = (char *) malloc(strlen(Str0102) + strlen(Str3));
    sprintf(StrNum, "%s%s", Str0102, Str3);
    payload=StrNum;
    rt_kprintf("%s\n" ,payload);

将自己想要的字符串使用sprintf函数进行拼接。其中的温适度数据(tempT,humiT),之前使用strcat和strcpy函数,但是拼接后会乱码,因为tempT和humiT本质上还是uint_8类型的数据。所以使用sprintf进行拼接时需要用%d而不是%s,其他的根据自己需求改写就行。

最后编译下载 运行阿里例程就大功告成啦。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作者:王志青 概述近年来,随着社会的发展,生产力水平的提高以及人们物质生活的日益丰富,生活方式发生了很大变化,人们更加注重健康的生活态度,户外运动已逐渐渗透到日常生活中,为追求健康,时尚和自然的生活,伴随着高科技的迅猛发展,移动互联技术日趋成熟,人们开始向智能设备进军,骑行运动作为一种健康自然的运动方式越来越受到许多人的喜欢,骑行运动中的环境及健康监测需求对于骑行运动者越来越重要。环境及健康监测是在骑行运动的环境中,通过对随时间及空间改变的周围环境和身体健康指标进行的生理监控。对运动者身体的生理监控应该是多指标,多层次,多因素的整体,随时随地的监测能够及时发现身体不适,预防或降低运动风险的发生。 开发环境硬件:ART-PI开发板+L610 4G模块+LPS22HH气压传感器模块+ LSM6DSOX六轴传感器模块 RT-Thread版本:RT-Thread 4.0.3 开发工具及版本:RT-Thread Studio 2.0.0 RT-Thread使用情况概述内核部分:调度器 调试器:创建应用主线程,读取传感器数据,发送至阿里。 组件部分:I2C框架,Sensor框架 I2C框架:使用I2C来驱动LSM6DSOX和LPS22HH传感器模块,获取传感器数据为上层代码提供数据。 Sensor框架:方便上层访问LSM6DSOX和LPS22HH传感器模块。 软件包部分: Ali-iokit-v3.0.1:用于和阿里物联网平台通信。 at_device-latest:用于L610-CN-00模块的命令执行。 cJSON-v1.0.2:用于解析和组装Json格式数据。x lps22hb-lastest:用于驱动LPS22HH传感器模块。 lsm6dlsd:用于驱动LSM6DSOX传感器模块。 硬件框架图表1硬件方案图 硬件部分由ART-PI开发板作为主控,采集LSM6DSOX传感器加速度,陀螺仪数据,和LPS22HH气压温度数据,通过L610-CN-00 Cat1模块传送的阿里物联网平台,后台服务器实时接收阿里物联网平台上的数据并进行处理。最后发送到移动端展示。 软件框架说明软件模块说明app_thread_entry:应用主线程,读取传感器数据并通过Mqtt发送至阿里平台。 演示效果比赛感悟 通过本次比赛让我从只知道RT-Thread名称到能够使用RT-Thread系统,RT-Thread提供的众多的组件,使开发一款新产品变得更方便,更容易,更快速,使开发人员更专注于业务功能的开发。刚开始使用时不熟悉整个RT-Thread系统的架构,在移植驱动时不知从何处下手,好在RT-Thread提供了详细的中文文档,很快就学会了RT-Thread驱动的架构。在当今国外对中国的严苛的封锁下,能有一款中国人自己的嵌入式操作系统,确实是一件好事,我们要大力支持国产软件,硬件。外国人对我们封锁越严苛,我们越要做出一翻成绩。
一.概览 本人虽然是电子信息技术专业出身,在毕业后从事的是偏软件的工作,大多数是PC软件的开发,但一直以来,闲暇时间会利用STM32做些小的作品。对于RT-Thread这国内的物联网操作系统,其实早有耳闻,期间也参加过深圳的一次RT-Thread线下交流活动,所以对于RT-Thread是有所了解而未实际应用的程度。 借着此次RT-Thread大赛的机会,我想将PC的一些图像处理和图像识别算法放到art-pi试跑一下看看效果如何,所以本次参赛将会使用art-pi获取OV7670的图像来做像处理和图像识别。 二.开发环境 硬件:PC、ART-PI、OV7670、RGB_LCD RT-Thread版本:rt-thread4 .0.3,art-pi adk 1.1.0 开发工具及版本:立创EDA,RT-Studio,SecureCRT 三.RT-Thread使用情况概述 线程:创建图像处理线程用于通过DCMI获取OV7670的图像,图像处理后完显示在LCD上 信号量:用于DCMI图像获取,当捕捉完一帧图像后,释放信号量给图像处理线程。 驱动:使用了drv_dcmi驱动并参考drv_ov2640移植drv_ov7670驱动 四.实现功能展示 通过摄像头采集图像进行图像识别,然后将结果显示在LCD屏幕上。 五.硬件框架 本次的硬件核心由ART-PI、OV7670、LCD三部分组成: ART-PI:stm32H750作为控制核心部分,采集图像源数据、处理图像源生成处理结果、将处理结果送到LCD显示 OV7670:作为图像源,提供320*240的RGB565图像 LCD:实时显示图像源图像和显示处理结果 六.软件流程图 1. 硬件初始化:时钟、I2C、DCMI、SDRAM、LTDC 2. 进入图像处理线程,启动拍照并等待拍照完成信号量 3. 完成拍照释放拍照完成信号量 4. 得到图像后,进行图像处理与图像识别 5. 将图像识别结果在LCD上显示 6. 回到步骤2 七.图像识别功能介绍 通过DCMI驱动获取OV7670的分辨率为320*240的RGB565原始图像。RGB565每个像素使用用下图的方式存储,每个像素占用2个字节。所以每帧320*240的图像所需内存为320*240*2=153600字节。 实际上,我们在这次项目中并不需要使用到彩色特征,所以先将RGB565转换为灰色度。灰度图其实就是每个像素占用一字节,用0-255值来形容一个像素的灰度值。因此320*240所占用的内存为76800字节。 RGB565转灰度图公式如下:Gray = R*0.299 + G*0.587 + B*0.114 提取的灰度图后,我们还需要再进行一次二值化处理,因此设定一个阈值,当灰色像素大于这个阈值我们将它改为255,低于这个值变成0。这样就得到一帧只有0和225值的图像。 得到二值化图像后,我们便可以寻找要识别物体了。在此使用九宫格的方式提取连通分量,原理其实很简单,就是在九宫格里寻找连在一起的像素,如果能找到便将该像素便将该像素的坐标(位于X行,y列)写入到链表里。如此循环,直到找完所有像素。 完成连通分量的提取后便是特征提取了,我们还是采用九宫格分割法,将取得的图像平均分割为9个区域,再计算9个区域中值为255像素的个数。通过这一步算法,我们得到了9组特征数据。 本次用了两种特征提取方式: 1.通过水平与垂直方向的穿越数找出部分数字 以数字0和7为例,在1/2宽度处,0和7稳定的得到垂直穿越数是2.而在1/2高度,0的水平穿越数是2,7的水平穿越数是1. 2.在图像的水平和垂直的中间切分成四块,根据四个部分不同像素比例找出其他数字。以2和3为例 ,在右下角部分,3的每一行都会有像素点,而2会缺几行。因此2的像素更少从而区分2和3。 最终检测效果如下图: 八.比赛感悟 虽然标题是比赛感悟,实际上比赛并不是我的目的。RT-Thread我知道它更久了,但是一直没有去更进一步使用RT-Thread。这次比赛让我深入了解了RT-Thread的生态系统,给我的感觉真的太惊喜了。RT-Thread平台拥有丰富的组件,完善的各种外设驱动,通过官方的RT-Studio基本上做到入手即用了。 当时拿到ART-PI,通过RT-Thread SETTING进行勾选,再使用CubeMX选择外设,生成引脚初始化代码后。我本次项目的软件基本平台已经完成了,我只需要专注于我的应用层开发便可以了,这真的是太便利了。 通过本次比赛,让我对RT-Thread获得相当大的好感,我想未来硬件项目当中,我会毫不犹豫的选择RT-Thread代替其他实时操作系统。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值