0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

基于机智云物联网平台的温湿度和光照强度获取

机智云 2023-08-30 08:12 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文的开发项目由开发者发布在CSDN博客(F l e)分享,该设计采用esp8266烧写机智云固件。并且esp8266与stm32进行通信,则stm32可以通过esp8266与机智云服务器进行数据交互,而机智云服务器可以和机智云app进行数据交互。为此,实现stm32通过esp8266可以与机智云app进行数据交互。

stm32作为MCU传感器进行数据交互,得到传感器采集的数值,所以完成的是传感器和app的数据交互。由于本次实验增加了对光照强度的采集,所以又增加了一个三色RGB灯外设。通过机智云app可以调节RGB灯的光强,以此来模拟光照强度的变化。整个设计的传感器数据流向如下图所示:

d07b2dea-46c9-11ee-8e12-92fbcf53809c.png

另外,对于用机智云app调节RGB灯的光强的数据流向如下图:

d0a019ca-46c9-11ee-8e12-92fbcf53809c.png

01

传感器的测试

本次设计利用STM32CubeMX进行开发,代码设计过程分模块进行,分别编写测试用例验证各模块的功能,包括oled模块、按键模块、dht11模块、光敏电阻模块、rgb模块。1、oled模块① 接线:

d0b173be-46c9-11ee-8e12-92fbcf53809c.png

②代码编写:

本次设计中oled采用硬件SPI2驱动,STM32CubeMX的设计如下图:

d0bb48da-46c9-11ee-8e12-92fbcf53809c.pngd0cf747c-46c9-11ee-8e12-92fbcf53809c.png

d0f15290-46c9-11ee-8e12-92fbcf53809c.png

利用STM32CubeMX生成的SPI主要代码如上所示。在生成的SPI代码上进一步编写oled.c和oled.h文件。

oled.c封装了以下的函数:

d129448e-46c9-11ee-8e12-92fbcf53809c.png

测试函数:

int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI2_Init(); OLED_Init(); OLED_ShowString(0, 0, "wait for set esp8266,press key1 to set esp8266 with AIRLINK_MODE");}

③测试用例实验结果:

d1490fee-46c9-11ee-8e12-92fbcf53809c.png

由上图可知,oled模块的显示函数能够正确显示。

2、按键模块

①接线:

d15a5f88-46c9-11ee-8e12-92fbcf53809c.png

KEY_R0接地,KEY_L0和KEY_L1可以用于检测按键状态。对应的引脚为:

d15ecc76-46c9-11ee-8e12-92fbcf53809c.png

②代码编写:

STM32CubeMX设计如下:

d16d5750-46c9-11ee-8e12-92fbcf53809c.png

PC11设置为输出模式,PC10和PB5设置为输入模式。

Key.c封装了以下函数:

void key_init(void){ HAL_GPIO_WritePin(KEY_COM_GND_GPIO_Port,KEY_COM_GND_Pin,GPIO_PIN_RESET);}
void Test_key(void){ if(HAL_GPIO_ReadPin(KEY1_GPIO_Port, KEY1_Pin)==GPIO_PIN_SET) { OLED_ShowString(0,0,"key1_up"); } else { OLED_ShowString(0,0,"key1_down"); } if(HAL_GPIO_ReadPin(KEY2_GPIO_Port, KEY2_Pin)==GPIO_PIN_SET) { OLED_ShowString(0,10,"key2_up"); } else { OLED_ShowString(0,10,"key2_down"); } OLED_Refresh_Gram();}

测试用例:

int main(void){ MX_GPIO_Init(); key_init(); while(1) { Test_key(); }}

③测试用例实验结果:

d1917f68-46c9-11ee-8e12-92fbcf53809c.png

由图中可以看出,按键一被按下时显示key1_down和key2_up,与理论相符。

3、dht11模块

①接线:

d1f40f98-46c9-11ee-8e12-92fbcf53809c.png

②代码编写:

由于dht11的数据引脚有时需要作为输入,有时需要作为输出,所以不在STM32CubeMX设置。

Dht11.c主要封装了以下函数:

d20a6126-46c9-11ee-8e12-92fbcf53809c.png

这里的us延时并没有使用定时器来产生,而是用系统时钟来实现:

void delay_us(uint32_t us){ uint32_t delay = (HAL_RCC_GetHCLKFreq() / 4000000 * us); while (delay--) { ; }}

测试用例:

int main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI2_Init(); OLED_Init(); while(1) { Test_dht11(); }
void Test_dht11(void){ char txt[16]; while(1) { DHT11_Read_Data(&humidity_integer,&humidity_decimal,&temperature_integer,&temperature_decimal); sprintf(txt, "temp:%d.%d", temperature_integer,temperature_decimal); OLED_ShowString(0,0,txt); sprintf(txt, "humi:%d.%d", humidity_integer,humidity_decimal); OLED_ShowString(0,10,txt); OLED_Refresh_Gram(); }}

③测试用例实验结果:

d2222ba8-46c9-11ee-8e12-92fbcf53809c.png

由上图可以看出,温度为23.3℃,湿度为53.0%,湿度的小数为0,与理论相符。

4、光敏电阻模块

①接线:

d22aaa44-46c9-11ee-8e12-92fbcf53809c.png②代码编写:

STM32CubeMX设置ADC1的IN0如下:

d2381f12-46c9-11ee-8e12-92fbcf53809c.png

Stm32Rct6的ADC是12位的,这里没有更改的选项,则ADC读取的最大值是2^12=4096。

这里采样时间Sampling Time选择1.5个周期。ADC采样时间 = (采样周期+12.5周期)* 1/ADC时钟频率,这里ADC采样时间=(1.5+12.5)*1/12 = 1.167us。light_check5506.c主要封装以下函数:

void light_check5506_init(void){ HAL_ADCEx_Calibration_Start(&hadc1); HAL_Delay(200);}
uint32_t light_check5506_getinitvalue(void){ HAL_ADC_Start(&hadc1); HAL_ADC_PollForConversion(&hadc1,50);//ÏÞʱ50ms return HAL_ADC_GetValue(&hadc1);}
uint32_t light_check5506_get0to100value(void){ //°µ-->ÁÁ£º0~100 uint32_t value; value=light_check5506_getinitvalue(); value=4096-value;//ÔʼÊý¾ÝÊÇÔ½°µÊý¾ÝÔ½´ó value=(value*100/4096);//»¯Îª0~100µÄÊý,±ØÐëÏȳËÒÔ100ÔÙ³ý£¬ÒòΪȫ²¿ÊÇÕûÊý return value;}
void Test_5506(void){ uint32_t value; char txt[16]; while(1) { value=light_check5506_get0to100value(); sprintf(txt, "light(0-100):%d", value); OLED_ShowString(0,0,txt); OLED_Refresh_Gram(); }}

测试用例:

main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI2_Init(); MX_ADC1_Init(); OLED_Init(); light_check5506_init(); while(1)` { Test_5506(); }}

③测试用例实验结果:

d250d214-46c9-11ee-8e12-92fbcf53809c.png

将ADC读取的值归一化到0~100后光照强度的数值为18。

5、rgb模块

①接线:

d272b654-46c9-11ee-8e12-92fbcf53809c.png②代码编写:

STM32CubeMX设置TIM8的三个通道如下:

d2981908-46c9-11ee-8e12-92fbcf53809c.png

计数周期Counter Period设置为255,这是为了便于查找RGB颜色表进行颜色设置,占空比Pulse设置为50%Rgb.c封装了以下函数:

void rgb_init(void){ HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_2); HAL_TIM_PWM_Start(&htim8,TIM_CHANNEL_3);}void Test_rgb(void){ rgb_setpwm(10.0,100.0,200.0);}void rgb_setpwm(uint8_t pwm_r,uint8_t pwm_g,uint8_t pwm_b){ __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_1,pwm_r); __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_2,pwm_g); __HAL_TIM_SET_COMPARE(&htim8, TIM_CHANNEL_3,pwm_b);}

测试用例:

main(void){ HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_SPI2_Init(); MX_TIM8_Init(); rgb_init(); OLED_Init(); while(1)` { Test_rgb(); }}

③测试用例实验结果:

d2b552de-46c9-11ee-8e12-92fbcf53809c.png

由上图可知RGB灯被点亮。

02

通过esp8266实现数据上传和数据回传

在进行数据上传与数据回传之前,首先进行用于打印数据的串口1的设置和用于stm32与esp8266通信的串口2。串口1:

d2bea6cc-46c9-11ee-8e12-92fbcf53809c.pngd2d0675e-46c9-11ee-8e12-92fbcf53809c.png

串口1设置PA9和PA10分别作为TX和RX,波特率为115200,不使能中断。

串口2:

d2e17bac-46c9-11ee-8e12-92fbcf53809c.pngd2f6c746-46c9-11ee-8e12-92fbcf53809c.pngd32cd6f6-46c9-11ee-8e12-92fbcf53809c.png

串口2设置PA2和PA3分别作为TX和RX,波特率为9600,使能中断。

1、数据上传:温湿度数据、关照强度数据

①主要代码

void userHandle(void){ DHT11_Read_Data( & humidity_integer, & humidity_decimal, & temperature_integer, & temperature_decimal); currentDataPoint.valuehumidity = humidity_integer; currentDataPoint.valueLight_intensity = light_check5506_get0to100value(); currentDataPoint.valueDHT11 = temperature_integer + 0.1 * temperature_decimal; }

在userHandle(void)中添加温湿度数据的采集以及光照强度的读取。userHandle()是main函数中while循环的内容。

d33b8692-46c9-11ee-8e12-92fbcf53809c.png

由上图可以看出,userHandle对于用户来说是最顶层的,数据在userHandle中采集,依次经过gizCheckReport判断是否上报当前状态的数据、gizDataPoints2ReportData完成用户区数据到上报型数据的转换、gizReportData将转换后的上报数据通过串口发送给 WiFi 模块。

②设计结果:

首先确保esp8266和手机都已经连接到同一个网络,这里用电脑作为这个网络。

d342526a-46c9-11ee-8e12-92fbcf53809c.png

由上图可知手机和esp8266已经连接上了电脑。机智云app连接上esp8266后得到上传来的数据:

d353a84e-46c9-11ee-8e12-92fbcf53809c.pngd3769034-46c9-11ee-8e12-92fbcf53809c.png

Oled上的数据是stm32收集的,上图的数据是机智云app通过esp8266收到的,两者一致,说明数据交互是正确的。2、数据回传:RGB三数值

①主要代码

int8_t gizwitsEventProcess(eventInfo_t * info, uint8_t * gizdata, uint32_t len){ uint8_t i = 0; dataPoint_t * dataPointPtr = (dataPoint_t *)gizdata; moduleStatusInfo_t * wifiData = (moduleStatusInfo_t *)gizdata; protocolTime_t * ptime = (protocolTime_t *) gizdata; # if MODULE_TYPE gprsInfo_t * gprsInfoData = (gprsInfo_t *)gizdata; # else moduleInfo_t * ptModuleInfo = (moduleInfo_t *) gizdata; # endif if ((NULL == info) || (NULL == gizdata)) { return -1; } for (i=0; i < info->num; i++) { switch(info->event[i]) { case EVENT_LED_R: currentDataPoint.valueLED_R = dataPointPtr->valueLED_R; GIZWITS_LOG("Evt:EVENT_LED_R %d\n", currentDataPoint.valueLED_R); rgb_setpwm(currentDataPoint.valueLED_R, currentDataPoint.valueLED_G, currentDataPoint.valueLED_B); break; case EVENT_LED_G: currentDataPoint.valueLED_G = dataPointPtr->valueLED_G; GIZWITS_LOG("Evt:EVENT_LED_G %d\n", currentDataPoint.valueLED_G); rgb_setpwm(currentDataPoint.valueLED_R, currentDataPoint.valueLED_G, currentDataPoint.valueLED_B); break; case EVENT_LED_B: currentDataPoint.valueLED_B = dataPointPtr->valueLED_B; GIZWITS_LOG("Evt:EVENT_LED_B %d\n", currentDataPoint.valueLED_B); rgb_setpwm(currentDataPoint.valueLED_R, currentDataPoint.valueLED_G, currentDataPoint.valueLED_B); break; } }}

在gizwitsEventProcess中的EVENT_LED_R、EVENT_LED_G、EVENT_LED_B分别添加对对RGB三个PWM的赋值,赋值之后使其立即生效。

d3932de8-46c9-11ee-8e12-92fbcf53809c.png

protocolIssuedProcess被 gizwitsHandle 调用,接收来自云端或 app端下发的相关协议数据。ACTION_CONTROL_DEVICE进行“控制型协议”的相关处理,gizDataPoint2Event根据协议生成“控制型事件”,并进行相应数据类型的转化转换,gizwitsEventProcess是位于数据回传过程中的最底层,根据已生成的“控制型事件”进行相应处理。

②设计结果:

首先确保esp8266和手机都已经连接到同一个网络,这里用电脑作为这个网络。

d342526a-46c9-11ee-8e12-92fbcf53809c.png

由上图可知手机和esp8266已经连接上了电脑。机智云app设置RGB三个PWM数值,得到oled上的数据为:

d3b2eb7e-46c9-11ee-8e12-92fbcf53809c.pngd3baac9c-46c9-11ee-8e12-92fbcf53809c.png

由上图可知,右图为机智云app设置的三个PWM数值,左图再oled上为同样的数值,说明数据交互正确。

03

总 结

①通过这次设计接触了STM32CubeMX这个软件,相比与之前的标准库,STM32CubeMX生成的Hal库不仅封装度更高,而且更有利于开发者进行快速开发,而且在本次实验中机智云生成的代码也是基于Hal库的,这说明以后对于stm32来说,会越来越趋向于Hal开发。②官网永远是对解决问题的最好地方,机智云的官方文档给了我极大帮助。

③esp8266的烧录对于供电要求十分苛刻,导致多次烧录都失败了,所以在制pcb的时候加上了esp8266的烧录接口,以及GPIO的接地开关,还有复位电路。PCB扩展板图如下:

d3da52e0-46c9-11ee-8e12-92fbcf53809c.png

④stmRct6板的供电十分差,由于刚开始只是接了ST-LINK进行供电,导致dht11和oled一起使用时dht11的VCC口只有2.6V,进而使得dht11通信一直不成功,这也说明了一切先从电源管理开始,确保供电没问题再查找软件问题。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 传感器
    +关注

    关注

    2578

    文章

    55875

    浏览量

    795688
  • 数据
    +关注

    关注

    8

    文章

    7366

    浏览量

    95185
  • 物联网
    +关注

    关注

    2951

    文章

    48287

    浏览量

    419840
  • STM32
    +关注

    关注

    2313

    文章

    11212

    浏览量

    375359
  • 机智云
    +关注

    关注

    3

    文章

    655

    浏览量

    27871
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【米尔全志T153开发板评测】联网温湿度

    采集环境温湿度,将数据通过 MQTT 协议上传至 Home Assistant 平台,实现联网温湿度监控的项目设计。 环境搭建 包括 Do
    发表于 05-19 21:29

    机智联网平台设备接入完整实操教程

    机智联网设备云端服务平台,提供设备管理、数据处理等全套解决方案。本教程详解硬件接入平台全流
    的头像 发表于 05-19 18:04 236次阅读
    <b class='flag-5'>机智</b><b class='flag-5'>云</b><b class='flag-5'>物</b><b class='flag-5'>联网</b><b class='flag-5'>平台</b>设备接入完整实操教程

    基于STM32联网WiFi平台温湿度烟雾报警器设计

    联网WiFi平台温湿度烟雾报警器仿真设计 1. 烟雾采集传感器选用MQ-2,由于该传感器输出的是模拟信号,STM32内部ADC将模拟信号
    的头像 发表于 05-12 10:05 575次阅读
    基于STM32<b class='flag-5'>物</b><b class='flag-5'>联网</b>WiFi<b class='flag-5'>云</b><b class='flag-5'>平台</b><b class='flag-5'>温湿度</b>烟雾报警器设计

    联网架构下温湿度远程监测、数据上传及平台管理方案

    原标题:以太网温湿度记录仪技术方案 以太网温湿度记录仪突出功能: 1.以太网协议 支持 MODBUS TCP IP 协议、SNMP协议、UDP协议、RJ45信号输出。 2.可POE直接供电、可12
    的头像 发表于 03-25 10:28 287次阅读
    <b class='flag-5'>物</b><b class='flag-5'>联网</b>架构下<b class='flag-5'>温湿度</b>远程监测、数据上传及<b class='flag-5'>云</b><b class='flag-5'>平台</b>管理方案

    2025温湿度变送器选购指南与传感器应用方案解析

    温湿度变送器作为环境监测和工业控制领域的重要设备,广泛应用于农业、医疗、工业制造、联网等众多行业。2025年,伴随着传感器技术的进一步发展,温湿度变送器的性能不断提升,市场需求也持续
    的头像 发表于 02-01 10:44 1196次阅读

    冷库温湿度监控系统联网解决方案

    冷库作为生鲜食品、医药试剂、化工原料等物资的核心存储载体,温湿度的稳定性直接决定物资品质与安全。传统冷库温湿度管理存在诸多痛点:人工巡检效率低、误差大,难以实现 24 小时全覆盖监测;温湿度异常后
    的头像 发表于 01-19 16:57 833次阅读

    全无线联网库房温湿度自动监控系统设计与实施解决方案

    在食品、药品、电子元件、仓储物流、文物馆藏等众多领域,库房内的温湿度环境是影响物资存储质量的关键因素。传统库房温湿度管理多采用人工定时巡检、纸质记录的方式,存在效率低下、误差大、实时性差、漏检误报等问题。一旦温湿度超出安全阈值,
    的头像 发表于 01-15 17:49 1276次阅读

    【上海晶珩睿莓1开发板试用体验】Home Assistant 联网温湿度

    实时上传至 Home Assistant 平台,实现联网温湿度计,并进一步结合 LabVIEW 上位机实现演化曲线分析及数据采集的项目设计。 项目介绍 硬件连接:通过开发板 IIC
    发表于 08-18 13:55

    基于联网温湿度监测系统方案:构建全域感知的智能环境网络

    储备粮; -精密制造:半导体车间1%湿度波动引发30%良品率下降; 基于联网温湿度监测系统正成为破解环境管理难题的核心基础设施。本方案基于“端-管-
    的头像 发表于 07-24 18:05 1163次阅读

    STM32+esp8266连接机智,上传温湿度数据并控制继电器开关(平台配置、代码生成、代码移植)

    本教程将详细介绍如何将STM32微控制器与ESP8266Wi-Fi模块连接到机智平台,实现温湿度数据的上传与继电器的远程控制。通过此过程,您将学会如何配置
    的头像 发表于 07-15 18:54 1653次阅读
    STM32+esp8266连接<b class='flag-5'>机智</b><b class='flag-5'>云</b>,上传<b class='flag-5'>温湿度</b>数据并控制继电器开关(<b class='flag-5'>平台</b>配置、代码生成、代码移植)

    全自动温湿度监测系统:环境数据驱动的智能化革命

    在药品失效、芯片良率下降、文物损毁等事故背后,温湿度失控往往是关键诱因。全自动温湿度监测系统通过联网、边缘计算与AI技术的融合,正重塑医药、农业、工业、物流等领域的风险管理模式,将环
    的头像 发表于 07-08 16:53 946次阅读

    基于联网温湿度监测系统

    在医药冷链、智慧农业、智能制造等领域,温湿度失控轻则导致品质下降,重则引发安全事故。传统人工巡检方式滞后性强、误差率高,而联网温湿度监测系统通过“端-管-
    的头像 发表于 07-08 16:52 931次阅读

    联网温湿度监控系统

    联网温湿度监控系统作为现代智能化管理的重要工具,已广泛应用于农业温室、医药仓储、数据中心、食品冷链等多个领域。其核心价值在于通过实时数据采集、智能分析和远程控制,实现对环境参数的精准管理,从而保障
    的头像 发表于 07-07 17:36 1501次阅读

    STM32项目分享:智能家居(机智)升级版

    01—项目简介1.功能详解STM32智能家居(机智)升级版功能如下:检测功能:监测环境温湿度、烟雾浓度、一氧化碳、空气质量、光照
    的头像 发表于 07-02 18:04 1144次阅读
    STM32项目分享:智能家居(<b class='flag-5'>机智</b><b class='flag-5'>云</b>)升级版

    智能仓储:温湿度监控方案应用

    随着仓储环境要求提高,温湿度监控对保障货物品质至关重要。本文介绍一个工厂仓库温湿度监控方案,利用温湿度变送器、LoRa技术和智能监测平台,为仓库业主提供高效、可靠的监测解决方案。仓库
    的头像 发表于 05-29 11:35 1027次阅读
    智能仓储:<b class='flag-5'>温湿度</b>监控方案应用