基于AliO Things和阿里云的智能环境监控系统。

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、实习内容
  • 二、实习方法
    • 2.1搭建开发环境并完成编译
      • 2.1.1 正常完成编译的标志
      • 2.1.2 编写实例烧录程序,并完成烧录
    • 2.2按键实现流水灯
      • 2.2.1 HaaS EDU K1开发版原理图。如图2- 2- 1。
      • 2.2.2 GPIO中各个接口函数的作用,如图2- 2- 2。
      • 2.2.3 led初始化函数的结构体
      • 2.2.4 流水灯具体实现流程
    • 2.3按键控制led闪烁代码
      • 2.3.1 按键分类
      • 2.3.2 按键原理图
      • 2.3.3按键消抖原理图
      • 2.3.4 按键对应的CPU引脚
      • 2.3.5实现按键控制led灯亮灭代码及思路如下图。
    • 2.4 使用PWM控制蜂鸣器
      • 2.4.1蜂鸣器分类
      • 2.4.2 PWM
      • 2.4.3分析hal库接口函数
      • 2.4.4蜂鸣器报警
    • 2.5 OLED屏幕打印图形
      • 2.5.1 OLED屏幕概述
      • 2.5.2 OLED屏幕扫描方式
      • 2.5.3分析hal库的接口函数
      • 2.5.4 取模软件的注册
      • 2.5.5 编写打印图像的代码。
    • 2.6 温湿度传感器
      • 2.6.1 温湿度传感器概述
      • 2.6.2转换公式
      • 2.6.3IIC 总线通信协议,示意图如图2- 6 -1。
      • 2.6.4 温湿度传感器原理图
      • 2.6.5分析hal库中接口函数
      • 2.6.6测量温度和湿度代码
    • 2.7 ADC转换器
      • 2.7.1概述
      • 2.7.2分析hal库的接口函数
      • 2.7.3 ADC转换代码
    • 2.8光照传感器
      • 2.8.1光照传感器概述
      • 2.8.2AP3216C工作模式
      • 2.8.3分析hal库中的接口函数
      • 2.8.4编写代码
    • 2.9使用阿里云平台调试程序
  • 三、实习成果
    • 3.1 按键控灯
      • 3.1.1 代码如下
    • 3.2PWM 控制蜂鸣器
      • 3.2.1程序
      • 3.2.2结果
    • 3.3OLED打印图形
      • 3.3.1程序
      • 3.3.2 结果
    • 3.4 检测温湿度
      • 3.4.1 程序
      • 3.4.2 结果
    • 3.5ADC 转换
      • 3.5.1 代码
      • 3.5.2结果
    • 3.6光照传感器
      • 3.6.1代码
      • 3.6.2结果
  • 四、总结


前言

        基于AliO Things智能环境监控系统。可以通过连接阿里云实现远程计算机对周围环境进行监控。依托开发板上的环境监测传感器采集环境信息并显示,并进行异常报警。通过上云,实现监测系统的远端控制和查询。


提示:以下是本篇文章正文内容,下面案例可供参考

一、实习内容

1.1 通过按键可以控制系统的LED灯,表示系统状态;
1.2 通过屏幕显示传感器的采集数据;
1.3 控制蜂鸣器进行监测异常报警;
1.4 借助ADC转换器采集电压值并显示;
1.5 借助光强传感器、红外距离传感器、温湿度传感器采集环境数据,并显示;
1.6 通过云端控制系统,并实现系统状态的查询。

二、实习方法

2.1搭建开发环境并完成编译

2.1.1 正常完成编译的标志

当使用vscode软件编译之后,如果出现如图2- 1- 1即可表示创建的项目已完成了正常编译。
在这里插入图片描述

2.1.2 编写实例烧录程序,并完成烧录

        实例程序如图2- 1- 2。编写完成之后,先点击编译,再点击烧录。点击烧录之后,当出现图2- 1- 3之后,说明程序已经正常完成了烧录。
在这里插入图片描述

2.2按键实现流水灯

2.2.1 HaaS EDU K1开发版原理图。如图2- 2- 1。

在这里插入图片描述

2.2.2 GPIO中各个接口函数的作用,如图2- 2- 2。

在这里插入图片描述
HaaS EDUk1板载了三个可编程LED,分别是L1, L2, L3, 分别为红、绿、蓝三个单色灯。

2.2.3 led初始化函数的结构体

typedef struct {uint8_t        port;   /*gpio的引脚号/端口号*/gpio_config_t  config; /*gpio的配置信息*/void          *priv;   /*私有数据*/
} gpio_dev_t;

2.2.4 流水灯具体实现流程

        流水灯具体分为两步,第一步是对led灯进行初始化,第二步就是在循环当中按照顺序依次点亮和熄灭对应的led灯。
        第一步:我们使用结构体pio_dev_t分别定义led1,led2,led3这三个变量。随后通过查询开发版手册查询到端口号和配置信息,我们对定义的变量进行初始化操作。初始化操作后使用hal_gpio_init(&变量名)保存操作。保存完成之后,我们的led初始化就已经完成了。如图2- 2- 3。
        第二步:项目中hal_gpio_output_high(&变量名)hal_gpio_output_low(&变量名)函数分别控制的led灯亮和灭。我们在while(1)循环中按照依次对不同led灯进行点亮或者熄灭,两个灯亮灭之间要使用延时函数aos_msleep(延时时间)使得人眼可以观察到(防止余晖效应)。最后无限循环下去就可以实现本次的流水灯实验。如图2- 2- 4。
在这里插入图片描述

2.3按键控制led闪烁代码

2.3.1 按键分类

        编码按键:由专门的硬件进行驱动,生成了键码值或者是键值对。
        非编码按键:由软件编程进行控制。

2.3.2 按键原理图

在这里插入图片描述
分析原理图:
当按键被按下时,检测到引脚是一个低电平
当按键未被按下时,检测到引脚是一个高电平
电容:去滤波、充放电的作用
电阻:当按键未按下时,检测到是一个高电平
此实验中采用中断的方式

2.3.3按键消抖原理图

在这里插入图片描述

2.3.4 按键对应的CPU引脚

        HaaS EDU k1板载了四个可编程按键,分别是K1, k2, K3, K4四个按键对应的GPIO如图2- 3- 1。
在这里插入图片描述

2.3.5实现按键控制led灯亮灭代码及思路如下图。

在这里插入图片描述

2.4 使用PWM控制蜂鸣器

2.4.1蜂鸣器分类

蜂鸣器是一种非常简单的发声器件,播放使用的扬声器不同,蜂鸣器只能播放较为简单的频率。
驱动原理上区分,蜂鸣器可以分为无源蜂鸣器和有源蜂鸣器。这里的“源”,指的就是有无驱动源。
有源蜂鸣器:内部有rc震荡电路,只需要给控制引脚一个高电平即可,内部的rc震荡电路就会产生方波.这个方波控制线圈是否吸合薄片,从而决定是否发声。
无源蜂鸣器:内部没有rc震荡电路,需要给控制引脚一个方波,它就可以发声了。

2.4.2 PWM

PWM定义: 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,通过调节占空比,就可以调节脉冲宽度(脉宽时间) ,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
PWM频率: 是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);也就是说一秒钟PWM有多少个周期。其脉冲示意图如
单位: Hz
表示方式: 50Hz 100Hz
如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%
在这里插入图片描述

2.4.3分析hal库接口函数

int32_t hal_pwm_init(pwm_dev_t *pwm);
功能:初始化pwm引脚
参数:pwm:pwm的设备
返回值:0:成功    非0:失败int32_t hal_pwm_start(pwm_dev_t *pwm);
功能:开启pwm
参数:pwm:pwm的设备
返回值:0:成功    非0:失败int32_t hal_pwm_stop(pwm_dev_t *pwm);
功能:停止pwm
参数:pwm:pwm的设备
返回值:0:成功    非0:失败typedef struct {uint8_t       port;   /*pwm的端口号:pwm0 */pwm_config_t  config; /*pwm的配置信息*/void         *priv;   /*私有数据*/
} pwm_dev_t;
typedef struct {float    duty_cycle; /*pwm的占空比  单位:% */uint32_t freq;       /*pwm的频率 人耳的频率:20-20000Hz*/
} pwm_config_t;

2.4.4蜂鸣器报警

        首先对蜂鸣器进行初始化,初始化函数如图2- 4- 1。初始化之后我们调用hal库里面的函数hal_pwm_start()和hal_pwm_stop(),如图2- 4- 2。当程序烧录成功之后,我们可以听到蜂鸣器实现了报警功能。

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

2.5 OLED屏幕打印图形

2.5.1 OLED屏幕概述

1、HaaS EDU K1 自带了一块1.3寸132*64的OLED屏幕,黑底白字.芯片采用SH1106,使用SPI驱动。
2、OLED,即有机发光二极管(Organic Light-Emitting Diode)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板等优异之特性。
与LCD相比,LCD需要背光,同样的显示,OLED 效果要来得好一些,OLED分辨率可以做到很高。

2.5.2 OLED屏幕扫描方式

        四种扫描方式:逐行扫描、逐列扫描、列行式扫描、行列式扫描。此屏幕采用的是列行式的扫描方式。四种扫描方式如图2- 5- 1。本屏幕采用方式示意图,如图2- 5- 2。
在这里插入图片描述

2.5.3分析hal库的接口函数

接口函数的路径:components\drivers\external_device\sh1106\include\sh1106.h
uint8_t sh1106_init(void);
功能:初始化sh1106芯片
参数:无参数
返回值:0:成功    非0:失败void OLED_Clear(void);
功能:清理屏幕
参数:无参数
返回值:无返回值void OLED_Show_Char(uint8_t x, uint8_t y,uint8_t chr, uint8_t size, uint8_t mode);
功能:在屏幕上显示字符
参数:x:待显示字符的横坐标y:待显示字符的纵坐标chr:待显示字符(字符是以单引号引起来的'w')size:12/16/24mode:0是反显,1是正常显示
返回值:无返回值void OLED_Show_String(uint8_t x, uint8_t y, const uint8_t *p,uint8_t size, uint8_t mode);
功能:在屏幕上显示字符串
参数:x:待显示的字符串的横坐标y:待显示的字符串的纵坐标*p:待显示的字符串的首地址(字符串是以双引号引起来,例如:"hello")size:12/16/24mode:0是反显,1是正常显示
返回值:无返回值void OLED_Refresh_GRAM(void);
功能:刷新屏幕
参数:无参数
返回值:无返回值

2.5.4 取模软件的注册

        将取模软件进行解压并注册。注册完成之后,我们可以看到如图2- 5 -3,我们使用取模软件,对自己想要生成图片进行取模。
在这里插入图片描述

2.5.5 编写打印图像的代码。

        我们使用取模软件得到自己想要的图像数组。随后我们调用初始化函数sh1106_init()和屏幕清理函数OLED_Clear(),对屏幕进行预处理。最后我们使用void OLED_Show_Uimge(uint8_t *Name,int leftx,int lefty,int rightx,int righty)函数,我们进行编译和烧录就可以在屏幕上看到取模后的图片。

2.6 温湿度传感器

2.6.1 温湿度传感器概述

在这里插入图片描述

2.6.2转换公式

在这里插入图片描述

2.6.3IIC 总线通信协议,示意图如图2- 6 -1。

在这里插入图片描述

2.6.4 温湿度传感器原理图

在这里插入图片描述

2.6.5分析hal库中接口函数

int32_t hal_i2c_init(i2c_dev_t *i2c);
功能:初始化IIC的硬件接口
参数:I2C:I2C的设备
返回值:0:成功     非0:失败
typedef struct {uint8_t       port;   /*IIC的端口号*/i2c_config_t  config; /**< i2c 配置信息*/void         *priv;   /**< 私有数据 */
} i2c_dev_t;typedef struct {uint32_t address_width; /**< 寻址模式: 7 bit or 10 bit */uint32_t freq;          /*时钟频率 400kHz*/uint8_t  mode;          /*主模式或者是从模式,采用的是主模式*/uint16_t dev_addr;      /*从机设备地址   0x40 */
} i2c_config_t;int32_t hal_i2c_master_send(i2c_dev_t *i2c, uint16_t dev_addr, const uint8_t *data,uint16_t size, uint32_t timeout);
功能:IIC主模式发送
参数:i2c       iic的设备dev_addr  设备地址data      i2c发送的数据size      i2c发送数据的长度timeout   超时时间(毫秒)#ifndef HAL_WAIT_FOREVER#define HAL_WAIT_FOREVER 0xFFFFFFFFU#endif
返回值:0:成功    非0:失败int32_t hal_i2c_master_recv(i2c_dev_t *i2c, uint16_t dev_addr,uint8_t *data,uint16_t size, uint32_t timeout);
功能:iic主模式接收
参数:i2c       i2c的设备dev_addr  设备地址data      i2c接收的数据size      i2c接收数据的长度timeout   超时时间(毫秒)
返回值:0:成功     非0:失败
//模式的选择:
#define I2C_MODE_MASTER 1 /*IIC主模式 */
#define I2C_MODE_SLAVE  2 /*IIC从模式 *///时钟速度
#define I2C_BUS_BIT_RATES_100K  100000  //低速
#define I2C_BUS_BIT_RATES_400K  400000  //中速
#define I2C_BUS_BIT_RATES_3400K 3400000  //高速/*寻址模式*/
#define I2C_HAL_ADDRESS_WIDTH_7BIT  0   /**< 7 bit模式*/
#define I2C_HAL_ADDRESS_WIDTH_10BIT 1   /**< 10 bit模式*/

2.6.6测量温度和湿度代码

#include "aos/init.h"
#include "board.h"
#include <aos/errno.h>
#include <aos/kernel.h>
#include <k_api.h>
#include <stdio.h>
#include <stdlib.h>
//按ctrl+s进行保存或者是跳转到其他界面
//将此头文件选中之后按f12键进行跳转,或者是
//选中头文件点击右键选择跳转到定义
#include <aos/hal/gpio.h>  //gpio的头文件
#include <hal_iomux_haas1000.h>  //引脚号
#include <aos/hal/pwm.h>  //pwm的头文件
#include <sh1106.h>   //sh1106芯片的头文件 
#include <aos/hal/i2c.h>  //iic总线通信协议
#include <aos/hal/adc.h>  //adc转换器
#define PORT 1
#define DEVADDR 0x40
#define DATA 0x00
//定义一个全局结构体变量
i2c_dev_t IIC1;
//采用主模式获取温湿度函数
void temphumi_data(float *TTmp,float *HHui){//为结构体变量进行赋值IIC1.port = PORT;IIC1.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;  //寻址模式7位IIC1.config.dev_addr = DEVADDR;  //设备地址IIC1.config.freq = I2C_BUS_BIT_RATES_400K;  //通信速度IIC1.config.mode = I2C_MODE_MASTER;  //主模式IIC1.priv = NULL;  //无私有数据//保存初始化hal_i2c_init(&IIC1);//iic主模式发送数据uint8_t data = DATA;uint8_t buf[4] = {0};//保存温湿度的临时变量int temp = 0;int humi = 0;hal_i2c_master_send(&IIC1,DEVADDR,&data,1,1000);aos_msleep(1000);  //保证数据完整性//iic主模式接收数据hal_i2c_master_recv(&IIC1,DEVADDR,buf,4,1000);//将数据进行拼接保存到临时变量中temp = (buf[0] <<8)+ buf[1];humi = (buf[2] <<8)+ buf[3];//将数据进行转换*TTmp =  ((165.0f * (float)temp) / 65535.0f) - 40.0f;*HHui =  (100.0f * (float)humi) / 65535.0f;
}
//相对于是main函数,是应用程序入口函数
int application_start(int argc, char *argv[])
{   float tempp,humii;//防止程序跑飞while (1) {temphumi_data(&tempp,&humii);//%.2f和%0.2f等价的,保留两位小数printf("temp:%.2f humi:%.2f\n",tempp,humii);aos_msleep(1000);};
}

2.7 ADC转换器

2.7.1概述

ADC转换器将模拟量转换成数据量,模拟量是连续的,数字量是离散的。如图2- 7- 1。
在这里插入图片描述

2.7.2分析hal库的接口函数

int32_t hal_adc_init(adc_dev_t *adc);
功能:adc硬件初始化接口
参数:adc:adc的设备
返回值:0:成功    非0:失败typedef struct {uint8_t      port;   /*adc的端口号*/adc_config_t config; /*adc的配置信息 */void        *priv;   /*私有数据*/
} adc_dev_t;
typedef struct {uint32_t sampling_cycle; /*adc的采样周期*/
} adc_config_t;int32_t hal_adc_value_get(adc_dev_t *adc, uint32_t *output,uint32_t timeout);
功能:获取adc的采样数据
参数:adc:adc的设备output:采样数据timeout:超时时间(毫秒)#define HAL_WAIT_FOREVER 0xFFFFFFFFU
返回值:0:成功    非0:失败int32_t hal_adc_finalize(adc_dev_t *adc);
功能:取消ADC硬件接口初始化
参数:adc:adc的设备
返回值:0:成功    非0:失败

2.7.3 ADC转换代码

我们先对ADC模块初始化,如图2- 7- 2。初始化之后,直接调用int32_t hal_adc_value_get(adc_dev_t *adc, uint32_t *output,uint32_t timeout);函数就可以在终端上看到打印的电压信息。
在这里插入图片描述

2.8光照传感器

2.8.1光照传感器概述

本实验的主要结果是通过I2C总线控制光强度传感器AP3216C对环境光强度及物体接近情况进行测量并获取环境光强度及是否有物体靠近,然后通过OLED显示屏将读取到的光强度、接近程度、红外信息显示在HaaS EDU K1的屏幕上。

2.8.2AP3216C工作模式

根据AP32 16C的datasheet说明,在正常工作时,它共有3种工作模式:
ALS模式
在这种模式下,AP3216C只对光强度进行量测
PS+IR模式
在这种模式下,AP3216C只对接近程度进行量测
AL S+PS+IR模式
在这种模式下,AP3216C会同时对光强度及接近程度进行测量

2.8.3分析hal库中的接口函数

void ap3216c_init(void);
功能:光照传感器的初始化函数
参数:无参数
返回值:无返回值uint16_t ap3216c_read_ambient_light(void);
功能:获取光照值
参数:无参数
返回值:光照的数据uint16_t ap3216c_read_ps_data(void);
功能:获取距离值
参数:无参数
返回值:距离的数据
uint16_t ap3216c_read_ir_data(void);
功能:获取红外值
参数:无参数
返回值:红外的数据

2.8.4编写代码

#include "aos/init.h"
#include "board.h"
#include <aos/errno.h>
#include <aos/kernel.h>
#include <k_api.h>
#include <stdio.h>
#include <stdlib.h>
//按ctrl+s进行保存或者是跳转到其他界面
//将此头文件选中之后按f12键进行跳转,或者是
//选中头文件点击右键选择跳转到定义
#include <aos/hal/gpio.h>  //gpio的头文件
#include <hal_iomux_haas1000.h>  //引脚号
#include <aos/hal/pwm.h>  //pwm的头文件
#include <sh1106.h>   //sh1106芯片的头文件 
#include <aos/hal/i2c.h>  //iic总线通信协议
#include <aos/hal/adc.h>  //adc转换器
//相对于是main函数,是应用程序入口函数
int application_start(int argc, char *argv[])
{   int data[3] = {0};uint8_t light[50] = {0};uint8_t ps[50] = {0};uint8_t ir[50] = {0};//调用初始化函数ap3216c_init();sh1106_init();//防止程序跑飞while (1) {//获取光照值data[0] = ap3216c_read_ambient_light();//获取距离值data[1] = ap3216c_read_ps_data();//获取红外值data[2] = ap3216c_read_ir_data();sprintf(light,"light:%d",data[0]);sprintf(ps,"ps:%d",data[1]);sprintf(ir,"ir:%d",data[2]);OLED_Clear();OLED_Show_String(5,5,light,12,1);OLED_Show_String(5,25,ps,12,1);OLED_Show_String(5,45,ir,12,1);OLED_Refresh_GRAM();aos_msleep(1000);};
}

2.9使用阿里云平台调试程序

第一步:新建项目,如图2- 9 -1;
第二步:创建项目,如图2- 9 - 2;
第三步:创建物模型,如图2- 9 - 3;
最后,调试程序,如图2- 9 - 4。
在这里插入图片描述
在这里插入图片描述

三、实习成果

3.1 按键控灯

3.1.1 代码如下

#include "aos/init.h"
#include "board.h"
#include <aos/errno.h>
#include <aos/kernel.h>
#include <k_api.h>
#include <stdio.h>
#include <stdlib.h>
//按ctrl+s进行保存或者是跳转到其他界面
//将此头文件选中之后按f12键进行跳转,或者是
//选中头文件点击右键选择跳转到定义
#include <aos/hal/gpio.h>  //gpio的头文件
#include <hal_iomux_haas1000.h>  //引脚号
#include <aos/hal/pwm.h>  //pwm的头文件
#include <sh1106.h>   //sh1106芯片的头文件 
#include <aos/hal/i2c.h>  //iic总线通信协议
#include <aos/hal/adc.h>  //adc转换器
//相对于是main函数,是应用程序入口函数
int application_start(int argc, char *argv[]) {int data[3] = {0};     uint8_t ps[50] = {0};uint8_t ir[50] = {0};     uint8_t light[50] = {0};//调用初始化函数ap3216c_init();sh1106_init();//防止程序跑飞while (1) {//获取光照值data[0] = ap3216c_read_ambient_light();//获取距离值data[1] = ap3216c_read_ps_data();//获取红外值data[2] = ap3216c_read_ir_data();sprintf(light,"light:%d",data[0]);sprintf(ps,"ps:%d",data[1]);sprintf(ir,"ir:%d",data[2]);OLED_Clear();OLED_Show_String(5,5,light,12,1);OLED_Show_String(5,25,ps,12,1);OLED_Show_String(5,45,ir,12,1);OLED_Refresh_GRAM();aos_msleep(1000);};
}

在这里插入图片描述

3.2PWM 控制蜂鸣器

3.2.1程序

#include "aos/init.h"
#include "board.h"
#include <aos/errno.h>
#include <aos/kernel.h>
#include <k_api.h>
#include <stdio.h>
#include <stdlib.h>
#include <aos/hal/gpio.h>
#include <hal_iomux_haas1000.h>
#include <aos/hal/pwm.h>
#define PORT 0  //pwm的端口号
//定义结构体变量
pwm_dev_t buz;
void buz_init () {buz.port = PORT;              //端口号buz.config.duty_cycle = 0.1;  //占空比10%buz.config.freq = 1000;       //频率  1000buz.priv = NULL;      hal_pwm_init(&buz);          //保存初始化}
int application_start (int argc, char *argv[])
{buz_init ();  //蜂鸣器初始化while(1){   //实现蜂鸣器功能hal_pwm_start(&buz);aos_msleep(500);hal_pwm_stop(&buz);aos_msleep(500);  }//防止程序跑飞
}

3.2.2结果

蜂鸣器发出间断的声音。

3.3OLED打印图形

3.3.1程序

在这里插入图片描述

3.3.2 结果

在这里插入图片描述

3.4 检测温湿度

3.4.1 程序

void temphumi_data(float *TEMP, float *HUMI) {IIC1.port = PORT;IIC1.config.address_width = I2C_HAL_ADDRESS_WIDTH_7BIT;IIC1.config.dev_addr = DEVADDR;IIC1.config.freq = I2C_BUS_BIT_RATES_400K;IIC1.config.mode = I2C_MODE_MASTER;IIC1.priv = NULL;hal_i2c_init(&IIC1);aos_msleep (1000);  //保存数据完整性uint8_t data = DATA;uint8_t buf[4] = { 0 };int temp = 0;       //温度int humi = 0;      //湿度hal_i2c_master_send(&IIC1, DEVADDR, &data, 1, 1000);aos_msleep (1000);  //保存数据完整性hal_i2c_master_recv(&IIC1, DEVADDR, buf, 4, 1000);temp = (buf[0] << 8) | buf[1];humi = (buf[2] << 8) | buf[3];*TEMP = ((165.0f * (float)temp) / 65535.0f) - 40.0f;*HUMI = (100.0f * (float)humi) / 65535.0f;
}

3.4.2 结果

在这里插入图片描述

3.5ADC 转换

3.5.1 代码

int application_start (int argc, char *argv[])
{    int data = 0;  //采样数据adc_dev_t adc1; adc1.port = PORT; //端口号adc1.config.sampling_cycle = 100; //采样周期 adc1.priv = NULL;hal_adc_init(&adc1);   //保存数据while(1){   hal_adc_value_get(&adc1, &data, HAL_WAIT_FOREVER);data = data * 3;printf("data = %.2f\n", (float)data / 1000);aos_msleep(1000);}  //防止程序跑飞
}

3.5.2结果

在这里插入图片描述

3.6光照传感器

3.6.1代码

int application_start (int argc, char *argv[])
{    int data[3] = { 0 };uint8_t data_0[20], data_1[20], data_2[20];get_led1_init();ap3216c_init();sh1106_init();while(1){   data[0] = ap3216c_read_ambient_light();data[1] = ap3216c_read_ps_data();data[2] = ap3216c_read_ir_data();sprintf(data_0, "light:%d\n", data[0]);sprintf(data_1, "ps:%d\n", data[1]);sprintf(data_2, "ir:%d\n", data[2]);if (data[0] > 1000) {hal_gpio_output_high(&led1);} else {hal_gpio_output_low(&led1);}OLED_Clear();sh1106_show_string(5, 5, data_0, 12, 1);sh1106_show_string(5, 25, data_1, 12, 1);sh1106_show_string(5, 45, data_2, 12, 1);printf("light:%d, ps:%d, ir:%d\n", data[0], data[1], data[2]);OLED_Refresh_GRAM();aos_msleep(1000);}//防止程序跑飞
}

3.6.2结果

在这里插入图片描述

四、总结

        在完成这个项目的过程中,我学习到了许多与嵌入式开发和物联网相关的知识和技能。以下是我在整个项目中所学到的主要内容:
        刚开始,通过学习整个项目的构架,我了解了各个模块的功能和彼此间的关系。通过使用VSCode软件,我学会了如何搭建开发环境,并成功地创建了示例项目并进行了正常的编译操作。这为我更好地理解项目的需求和目标提供了基础。
        在搭建好开发环境之后,老师带领我们复习了与项目相关的C语言基础知识,包括语法、函数和指针等。这些知识对我理解项目代码和进行开发工作非常有帮助。我还通过连接开发版成功实现了程序的烧录,加深了对硬件与软件之间交互的理解。
        接着,通过了解GPIO和项目中各个接口函数的作用,我成功地实现了LED流水灯以及通过按键控制LED闪烁的功能;通过利用PWM来控制蜂鸣器,我实现了警报功能。通过调用#include <sh1106.h>中的函数和使用取模软件,我逐步实现了在开发版屏幕上显示字符、字符串和图片的功能;通过按键和显示屏的组合使用,我实现了按键控制图片显示和消失的功能;通过学习温度传感器和通信协议后,我成功地利用硬件设备测量了教室的温度和湿度,并将其显示在终端上;通过ADC模块,我成功的在串口中打印出了开发版的电压值信息;通过运用之前学到的LED模块、蜂鸣器模块、湿度传感器模块和液晶显示模块,我成功地开发了一个湿度检测报警程序;通过调用光照传感器内部自带的函数,我实现了测量光强、距离和获取红外值数据的功能;通过使用WiFi模块,我将手机热点连接上VSCode上,再结合之前学过的OLED屏幕,最后成功的将网络IP地址显示在液晶显示屏上;通过学习Netmgr相关知识之后,结合之前学过的WIFI模块,我成功的使用阿里云平台,实现了网络控制的功能。最后,将以上所学结合之后,我终于成功完成本次项目的开发,完成了预期目标。
        在项目的过程中也不是一帆风顺的,我也遇到了一些挑战和问题。例如,在配置VSCode时,由于环境变量的问题导致程序一直无法正常编译。通过老师的指导,我最终解决了编译问题;另外,刚开始使用显示屏时,遇到了图片无法完全显示的问题,最后通过正确设置取模软件的参数,我成功地解决了这个问题;在调用中断函数时,遇到了无法正常调用的情况。最后发现是函数体内的参数设定有误,修改后问题得以解决。
        通过本次项目开发提高了我对硬件模块和接口的应用能力,我不仅解决了具体的问题,还在实践中获得了宝贵的经验和教训。我学会了更加仔细地检查和分析代码,排除错误的可能性。同时,我也提高了解决问题的能力和自信心,明白了遇到困难时要积极主动地寻求帮助,并且善于与他人合作共同解决问题。这些经验将对我的未来学习和工作具有持久的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/178189.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

chatgpt接口调用

在线接口文档&#xff1a; https://app.apifox.com/invite?tokensymrLP7sojF6N31kZqnpZ 接口地址 https://chat.xutongbao.top/api/light/chat/createChatCompletion 请求方式 POST 请求参数 token String, 必须 prompt Array, 必须 例子一&#xff1a; 包含上下文 [ { "…

系列十五、idea全局配置

一、全局Maven配置 IDEA启动页面>Customize>All settings>Build,Execution,Deployment>Build Tools>Maven 二、全局编码配置 IDEA启动页面>Customize>All settings>Editor>File Encodings 三、全局激活DevTools配置 IDEA启动页面>Customize>A…

小年轻太卷了,我服了...

想和大家说的话 8年前军哥刚进入到IT行业&#xff0c;现在发现学习软件测试的人越来越多&#xff0c;今天想根据军哥的行业经验再结合自己的一些看法给大家提一些建议。 最近聊到软件测试的行业内卷&#xff0c;越来越多的转行和大学生进入测试行业&#xff0c;导致软件测试已…

HTML基本概念:

HTML简介&#xff1a; 超文本标记语言&#xff08;英语&#xff1a;HyperText Markup Language&#xff0c;简称&#xff1a;HTML&#xff09;是一种用于创建网页的标准标记语言。 1&#xff09;、HTML 是用来描述网页的一种语言。 2&#xff09;、HTML 不是一种编程语言&am…

03、移动零:给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

文章目录 1、题目描述1.1 移动所有零至数组末尾1.2 示例 2、解题思路2.1 思路讲解2.2 动画演示&#xff08; 待补充&#xff09;2.3 复杂度分析 3、答案3.1 Java 代码3.2 运行结果 4、视频讲解&#xff08; 待补充&#xff09; 1、题目描述 1.1 移动所有零至数组末尾 给定一个…

通过内网穿透分享本地电脑上有趣的照片:部署piwigo网页

通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页 文章目录 通过cpolar分享本地电脑上有趣的照片&#xff1a;部署piwigo网页前言1.Piwigo2. 使用phpstudy网页运行3. 创建网站4. 开始安装Piwogo5. 设定一条内网穿透数据隧道6. 与piwigo网站绑定7. 在创建隧道界面…

每日一练 | 网络工程师软考真题Day47

阅读以下关于Linux文件系统和Samba效劳的说明&#xff0c;答复以下【问题1】至【问题3】。 【说明】 Linux系统采用了树型多级目录来管理文件&#xff0c;树型结构的最上层是根目录&#xff0c;其他的所有目录都是从根目录生成的。通过Samba可以实现基于Linux操作系统的效劳器和…

锐捷RG-EW1200G登录绕过漏洞复现

文章目录 锐捷RG-EW1200G登录绕过漏洞复现0x01 前言0x02 漏洞描述0x03 影响版本0x04 漏洞环境0x05 漏洞复现1.访问漏洞环境2.复现 0x06 修复建议 锐捷RG-EW1200G登录绕过漏洞复现 0x01 前言 免责声明&#xff1a;请勿利用文章内的相关技术从事非法测试&#xff0c;由于传播、…

sql-50练习题11-15

sql-50练习题11-15 前言数据库表结构介绍学生表课程表成绩表教师表 1-1 查询没有学全所有课程的同学的信息1-2 查询至少有一门课与学号为01的同学所学相同的同学的信息1-3 查询和1号的同学学习的课程完全相同的其他同学的信息1-4 查询没学过张三老师讲授的任一门课程的学生姓名…

Windows电脑怎样修改电脑的名称?

Windows电脑在使用过程中会处于局域网络中&#xff0c;为了让局域网络中其他Windows电脑看到自己的电脑并知识是自己的电脑&#xff0c;可以将电脑名称设置为自己的名字&#xff0c;那怎样设置电脑名称呢&#xff1f; Windows电脑怎样修改电脑的名称&#xff1f; 1、打开Wind…

主从复制(gtid方式)

基于事务的Replication&#xff0c;就是利用GTID来实现的复制 GTID&#xff08;全局事务标示符&#xff09;最初由google实现&#xff0c;在MySQL 5.6中引入.GTID在事务提交时生成&#xff0c;由UUID和事务ID组成.uuid会在第一次启动MySQL时生成&#xff0c;保存在数据目录下的…

stm32 模拟spi

目录 简介 spi物理层 连接方式 框图 协议层&#xff1a; 数据处理 传输模式 模式0 起始和停止信号 发送和接收数据 模式1 模式2 模式3 总结 简介 spi物理层 SPI&#xff08; Serial Peripheral Interface&#xff0c; 串行外设接口&#xff09;是一种全双工同步…

(2)STM32单片机上位机

使用VX小程序开发上位机&#xff0c; 样式如何创建&#xff1f; 在你所在页面 开辟空间 使用 view 在view 中 输入class 就是样式&#xff0c;在编辑样式的时候&#xff0c;如何寻找哪一块的样式 就是通过这个class寻找的 按钮使用switch

十九、类型信息(6)

接口和类型 interface 关键字的一个重要目标就是允许程序员隔离组件&#xff0c;进而降低耦合度。使用接口可以实现这一目标&#xff0c;但是通过类型信息&#xff0c;这种耦合性还是会传播出去——接口并不是对解耦的一种无懈可击的保障。比如我们先写一个接口&#xff1a; …

Java生成二维码并打印二维码和文字信息

目录 1、生成二维码&#xff0c;并调用画布进行二维码和文字的描绘。 2、主程序&#xff1a;获取打印机&#xff0c;并打印内容 3、打印效果 参考文献&#xff1a; 前期工作是安装好打印机驱动&#xff0c;可连接打印机。 添加三个依赖jar&#xff1a; 具体见文底的参考文献…

RHCE第二次作业

配置ssh远程连接 1.实现两台linux主机之间通过公钥验证能够互相实现免密登陆 1.1交互式 1&#xff09;客户端&#xff08;client&#xff09;生成非对称秘钥 [rootserver2 ~]# ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the ke…

postgresql 触发器如何生成递增序列号,从1开始,并且每天重置

大家好&#xff0c;我是三叔&#xff0c;许久不见&#xff0c;这期给大家介绍一下笔者在开发中遇到的业务处理&#xff1a;pgsql 创建触发器生成每日递增序列&#xff0c;并且第二天重置&#xff0c;根据不同的用户进行不同的控制。 1.创建生成递增序列的 table 表 -- 创建us…

Java-数组的定义与使用

本章重点&#xff1a; 1. 理解数组基本概念 2. 掌握数组的基本用法 3. 数组与方法互操作 4. 熟练掌握数组相关的常见问题和代码 1. 数组的基本概念 1.1 为什么要使用数组 public class TestStudent{public static void main(String[] args){int score1 70;int s…

看完就牛了,自动化测试框架详解

一、引言 随着IT技术的快速发展&#xff0c;软件开发变得越来越快速和复杂化。在这种背景下&#xff0c;传统的手工测试方式已经无法满足测试需求&#xff0c;而自动化测试随之而生。 自动化测试可以提高测试效率和测试质量&#xff0c;减少重复性的测试工作&#xff0c;从而…

TimeGPT-1——第一个时间序列数据领域的大模型他来了

一直有一个问题:时间序列的基础模型能像自然语言处理那样存在吗?一个预先训练了大量时间序列数据的大型模型&#xff0c;是否有可能在未见过的数据上产生准确的预测?最近刚刚发表的一篇论文&#xff0c;Azul Garza和Max Mergenthaler-Canseco提出的TimeGPT-1&#xff0c;将ll…