开发者社区> 问答> 正文

请问,有使用 AliOS Things 快速构建温度计应用的案例吗?

请问,有使用 AliOS Things 快速构建温度计应用的案例吗?

展开
收起
1358896759097293 2021-04-01 11:05:40 1174 0
来自:阿里开源
2 条回答
写回答
取消 提交回答
  • 下一站是幸福

    使用AliOS Things快速构建温度计应用

    本文是基于AliOS Things 3.1快速构建温度计的应用场景。涉及AliOS Things组件开发,构建AliOS Things用户项目,AliOS Things HAL API使用,向AliOS Things中添加并使用组件。用到的硬件设备有半导体开发板、温度传感器、数码管显示器。 背景信息

    AliOS Things HAL API
    

    AliOS Things向用户提供的统一硬件抽象API,为用户提供标准的对MCU片上硬件操作的能力。使得用户应用在多个不同平台之间迁移时,可以无需考虑硬件平台本身的区别,同时也使外设驱动类组件可以快速地在适配过AliOS Things的不同硬件之间复用,提高开发效率。

    AliOS Things 组件
    

    AliOS Things提供的功能扩展能力。通过将外设驱动,通信协议,控制算法,数据算法等通用能力封装为符合AliOS Things标准的组件,是各种附加能力可以快速被用户复用于自己的应用中。同时,组件与OS分离设计,按需安装使用,可以有效地控制资源占用。

    I2C总线
    

    I2C总线用于总线上的器件之间传送信息,是一种简单、双向二线制同步串行总线。发送数据一方称为主器件,被寻址的器件称为从器件,由主器件负责产生定时时钟和终止数据传送。

    TM1637芯片
    

    TM1637 是一种带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于电磁炉、微波炉及小家电产品的显示屏驱动。 整体流程图如下: image.png

    物联网系统使用AliOS Things 3.1版本作为基础软件平台。
    设备端开发使用AliOS Things的HAL(硬件抽象层) API及组件,实现片上外设的使用及外部传感器的数据采集。
    开发板采用意法半导体NUCLEO-F103RB开发板,主控芯片为stm32f103RBT6。AliOS Things已完成对该主板的适配。
    温度传感器采用LM75A数字温度传感器,该传感器通过I2C总线与主控MCU通信,可以提供0.125℃精度的温度输出。
    数码管采用由TM1637驱动的6位数码管进行显示。
    

    硬件连接图如下: image.png 步骤一:创建AliOS Things用户项目

    1.单击左下角+按钮。在弹窗的选项框中选择project。 image.png 2.选择helloworld_demo作为工程构建模板。 image.png 3.选择stm32f103rb-nucleo作为开发板。 image.png 4.输入应用名,按enter键,例如:myapp_wdj。 image.png 5.选择工程存储目录,按enter键生成项目工程。 image.png 6.开发工具Visual Studio Code自动打开生成的用户应用。 用户应用主入口位于appdemo.c文件中。 image.png 7.单击下面的编译图标image.png进行编译。 在控制台中看到编译结果。 image.png 8.单击下面的烧录image.png图标,将编译好的固件烧写到开发板中。 9.单击插头图标,可以打开串口调试工具进行观察。 开发板已在按照模板程序打印hello world字符及打印计数。 image.png 至此,用户应用工程建立完毕。 步骤二:加入温度采集

    1.在工程appdemo.c文件中加入如下代码。

    #include <aos/hal/i2c.h> // 包含需要用到的I2C HAL驱动 #define I2C1_PORT_NUM PORT_I2C_1 // 使用开发板的第一路I2C通道 #define I2C_RX_TIMEOUT 10 // 定义接收超时时间宏 i2c_dev_t i2c1; // 定义一个I2C设备结构体,用户后续操作具体的I2C接口

    /* i2c初始化函数 */

    void i2c1_init(void) { int ret = -1; /* i2c attr config / i2c1.port = PORT_I2C_1; i2c1.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT; i2c1.config.freq = I2C_BUS_BIT_RATES_400K; i2c1.config.mode = I2C_MODE_MASTER; / init i2c1 with the given settings */ ret = hal_i2c_init(&i2c1); }

    HAL的其他参数细节请参考文档。

    2.在方法application_start中加入I2C初始化。

    int application_start(int argc, char *argv[]) {

    int count = 0;
    
    printf("nano entry here!\r\n");
    //fd = board_lcd_create("name");  
    //board_lcd_write(fd,buffer,len);
    
    i2c1_init();                    // 调用I2C初始化
    
    while(1) {
        printf("hello world! count %d \r\n", count++);
        aos_msleep(1000);
    };
    

    }

    3.加入温度采集及相关数据处理部分到主循环中。

    int application_start(int argc, char *argv[])

    {

    int count = 0;
    
    int ret = -1;
    
    float temp;
    
    unsigned char
    i2c_data_buf[10];
    
    uint16_t TempAll;
    int sig = 1;
    
    int temp_int;
    
    printf("nano entry here!\r\n");
    
    i2c1_init();                    // 调用I2C初始化
    
    while(1) {
    
        // printf("hello world! count %d \r\n", count++);
    
        /*通过HAL读取 0x90地址设备的0x00寄存器,读取长度为2字节,返回数据放入i2c_data_buf中*/
    
        ret = hal_i2c_mem_read(&i2c1, 0x90, 0x00, I2C_MEMADD_SIZE_8BIT,i2c_data_buf,2,I2C_RX_TIMEOUT);
    
        if(ret != 0)
    
        {
    
            printf("read fail!\r\n");
            // return;
        }
    
        TempAll = ((i2c_data_buf[0] << 8) + i2c_data_buf[1]);   // 根据LM75自身特性拼接温度数据
    
       
        printf("middle=%d\r\n",TempAll);
    
        if ((i2c_data_buf[0] & 0x80) != 0)                      // 判断数据的符号
    
        {
    
            TempAll = ~(TempAll) + 1;
    
            sig = -1;
    
        }
    
        TempAll >>=5;      // 低5位无效数据除
    
       
        printf("middle=%d\r\n",TempAll);    // 打印中间数据用于调试
    
        temp = TempAll * 0.125* sig;       // 计算最终数据
    
        printf("temp = %.2f\n",temp);       // 打印最终数据
    
        aos_msleep(1000);
    
    };
    

    }

    4.再次编译、烧录、串口监控。 在串口调试框中看到数据已完成采集。至此,温度采集部分完成。 步骤三:加入本地显示

    1.组件包安装。 在组件包所在目录,输入如下安装命令。

    aos install comp -L aos_TM1637-1.0.3.zip

    aos-cube工具会把组件安装到AliOS Things源码目录。 输入以下命令查看安装的组件。

    aos list comp

    image.png 2.在应用中加入组件。

    在应用中进行组件的头文件引用。
    

    加入的代码如下:

    #include <aos_TM1637.h> // 包含组件头文件

    在应用中加入组件提供的相关API,完成显示设备驱动输出。
    

    加入的代码如下:

    aos_drv_TM1637_init(1,0); // 组件初始化,PA1=clk;PA0=data aos_drv_TM1637_SetBrightness(3); // 通过组件设置数码管亮度 temp_int = temp * 100; // 数码管不支持小数显示,先将温度转为整数 aos_drv_TM1637_DisplayDecimal(temp_int,2); // 通过组件API使数码管显示,并将小数点定到第二位以匹配真实数据

    3.再次编译、烧录、进行串口监控。 看到温度数据显示到了数码管上,和串口输出一致。 image.png appdemo.c文件的完整代码如下:

    /* * Copyright (C) 2015-2020 Alibaba Group Holding Limited */

    #include <stdio.h> #include <stdlib.h> #include <aos/kernel.h> #include "aos/init.h" #include "board.h" #include <k_api.h>

    #include <aos/hal/i2c.h> // 包含需要用到的I2C HAL驱动

    #include <aos_TM1637.h> // 包含组件头文件

    #define I2C1_PORT_NUM PORT_I2C_1 // 使用开发板的第一路I2C通道 #define I2C_RX_TIMEOUT 10 // 定义接收超时时间宏

    i2c_dev_t i2c1; // 定义一个I2C设备结构体,用户后续操作具体的I2C接口

    /* i2c初始化函数 */ void i2c1_init(void) { int ret = -1;

    /* i2c attr config */
    i2c1.port                 = PORT_I2C_1;
    i2c1.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
    i2c1.config.freq          = I2C_BUS_BIT_RATES_400K;
    i2c1.config.mode          = I2C_MODE_MASTER;
    /* init i2c1 with the given settings */
    ret = hal_i2c_init(&i2c1);
    

    }

    int application_start(int argc, char *argv[]) { int count = 0; int ret = -1; float temp; unsigned char i2c_data_buf[10]; uint16_t TempAll; int sig = 1; int temp_int; printf("nano entry here!\r\n");

    i2c1_init();                    // 调用I2C初始化
    aos_drv_TM1637_init(1,0);       // 组件初始化,PA1=clk;PA0=data
    aos_drv_TM1637_SetBrightness(3);    // 通过组件设置数码管亮度
    while(1) {
        // printf("hello world! count %d \r\n", count++);
        /*通过HAL读取 0x90地址设备的0x00寄存器,读取长度为2字节,返回数据放入i2c_data_buf中*/
        ret = hal_i2c_mem_read(&i2c1, 0x90, 0x00, I2C_MEMADD_SIZE_8BIT,i2c_data_buf,2, I2C_RX_TIMEOUT);
        if(ret != 0)
        {
            printf("read fail!\r\n");
            // return;
        }
        TempAll = ((i2c_data_buf[0] << 8) + i2c_data_buf[1]);   // 根据LM75自身特性拼接温度数据
        printf("middle=%d\r\n",TempAll);
        if ((i2c_data_buf[0] & 0x80) != 0)                      // 判断数据的符号
        {
            TempAll = ~(TempAll) + 1;
            sig = -1;
        }
        TempAll >>= 5;      // 低5位无效数据除
        printf("middle=%d\r\n",TempAll);    // 打印中间数据用于调试
        temp = TempAll * 0.125 * sig;       // 计算最终数据
        printf("temp = %.2f\n",temp);       // 打印最终数据
        temp_int = temp * 100;              // 数码管不支持小数显示,先将温度转为整数
        aos_drv_TM1637_DisplayDecimal(temp_int,2);  // 通过组件API使数码管显示,并将小数点定到第二位以匹配真实数据
        aos_msleep(1000);
    };
    

    }

    2021-04-02 21:55:01
    赞同 展开评论 打赏
  • 45271990@qq.com

    使用 AliOS Things 快速构建温度计应用 本文是基于 AliOS Things 3.1 快速构建温度计的应用场景。涉及 AliOS Things 组件开发,构建 AliOS Things 用户项目,AliOS Things HAL API 使用,向 AliOS Things 中添加并使用组件。用到的硬件设备有半 导体开发板、温度传感器、数码管显示器。 一、背景信息  AliOS Things HAL API AliOS Things 向用户提供的统一硬件抽象 API,为用户提供标准的对 MCU 片上硬件操作的能力。 使得用户应用在多个不同平台之间迁移时,可以无需考虑硬件平台本身的区别,同时也使外设驱动类 组件可以快速地在适配过 AliOS Things 的不同硬件之间复用,提高开发效率。  AliOS Things 组件 AliOS Things 提供的功能扩展能力。通过将外设驱动,通信协议,控制算法,数据算法等通用能 力封装为符合 AliOS Things 标准的组件,是各种附加能力可以快速被用户复用于自己的应用中。同时, 组件与 OS 分离设计,按需安装使用,可以有效地控制资源占用。  I2C 总线 I2C 总线用于总线上的器件之间传送信息,是一种简单、双向二线制同步串行总线。发送数据一 方称为主器件,被寻址的器件称为从器件,由主器件负责产生定时时钟和终止数据传送。  TM1637 芯片 TM1637 是一种带键盘扫描接口的 LED(发光二极管显示器)驱动控制专用电路,内部集成有 MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。主要应用于电磁炉、微波炉及小家 电产品的显示屏驱动。 物联网系统使用 AliOS Things 3.1 版本作为基础软件平台。  设备端开发使用 AliOS Things 的 HAL(硬件抽象层) API 及组件,实现片上外设的使用及外部传 感器的数据采集。  开发板采用意法半导体 NUCLEO-F103RB 开发板,主控芯片为 stm32f103RBT6。AliOS Things 已完 成对该主板的适配。  温度传感器采用 LM75A 数字温度传感器,该传感器通过 I2C 总线与主控 MCU 通信,可以提供 0.125℃精度的温度输出。  数码管采用由 TM1637 驱动的 6 位数码管进行显示。步骤一:创建 AliOS Things 用户项目 1. 单击左下角+按钮。在弹窗的选项框中选择 project。 2. 选择 helloworld_demo 作为工程构建模板。 3. 选择 stm32f103rb-nucleo 作为开发板。 4. 输入应用名,按 enter 键,例如:myapp_wdj。 5. 选择工程存储目录,按 enter 键生成项目工程。 6. 开发工具 Visual Studio Code 自动打开生成的用户应用。 用户应用主入口位于 appdemo.c 文件中。 7. 单击下面的编译图标 进行编译。 在控制台中看到编译结果。 8. 单击下面的烧录 图标,将编译好的固件烧写到开发板中。 9. 单击插头图标,可以打开串口调试工具进行观察。 开发板已在按照模板程序打印 hello world 字符及打印计数。 至此,用户应用工程建立完毕。 步骤二:加入温度采集 1. 在工程 appdemo.c 文件中加入代码。

    #include <aos/hal/i2c.h> // 包含需要用到的 I2C HAL 驱动 
    #define I2C1_PORT_NUM PORT_I2C_1 // 使用开发板的第一路 I2C 通道 
    #define I2C_RX_TIMEOUT 10 // 定义接收超时时间宏 
    i2c_dev_t i2c1; // 定义一个 I2C 设备结构体,用户后续操作具体的 I2C 接口 
    /* i2c 初始化函数 */ 
    void i2c1_init(void) 
    {
     int ret = -1; 
    /* i2c attr config */
     i2c1.port = PORT_I2C_1;
    i2c1.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;
     i2c1.config.freq = I2C_BUS_BIT_RATES_400K;
     i2c1.config.mode = I2C_MODE_MASTER;
     /* init i2c1 with the given settings *
    / ret = hal_i2c_init(&i2c1); }
    
    
    1. 在方法 application_start 中加入 I2C 初始化。

    2. 加入温度采集及相关数据处理部分到主循环中。

    3. 再次编译、烧录、串口监控。 在串口调试框中看到数据已完成采集。至此,温度采集部分完成。 步骤三:加入本地显示 1. 组件包安装。
    在组件包所在目录,输入如下安装命令。 
    aos install comp -L aos_TM1637-1.0.3.zip
    
    

    aos-cube 工具会把组件安装到 AliOS Things 源码目录。 输入以下命令查看安装的组件。 ```js aos list comp

    2. 在应用中加入组件。 a. 在应用中进行组件的头文件引用。 加入的代码如下: #include <aos_TM1637.h> // 包含组件头文件 b. 在应用中加入组件提供的相关 API,完成显示设备驱动输出。 加入的代码如下: 
    ```js
    ```js
    aos_drv_TM1637_init(1,0); // 组件初始化,PA1=clk;PA0=data
    
    

    aos_drv_TM1637_SetBrightness(3); // 通过组件设置数码管亮度 temp_int = temp * 100; // 数码管不支持小数显示,先将温度转为整数 aos_drv_TM1637_DisplayDecimal(temp_int,2); // 通过组件 API 使数码管显示,并将小数点定到第二 位以匹配真实数据

    3. 再次编译、烧录、进行串口监控。 看到温度数据显示到了数码管上,和串口输出一致。
    2021-04-02 21:46:33
    赞同 展开评论 打赏
问答分类:
问答地址:
来源圈子
更多
收录在圈子:
+ 订阅
阿里巴巴相信开源的世界里人人贡献代码,人人获得收益,共同创造一个互帮互利的社区,促进技术进步和发展。
问答排行榜
最热
最新

相关电子书

更多
AliOS Things 电源管理框架 立即下载
AliOS Things快速开发指南 立即下载
AliOS Things集成开发环境降低开发门槛 立即下载