1、系统介绍

实物展示

PCB硬件如下图所示,只需要将对应的传感器模块插入到对应的接口即可实现完整的系统功能。

APP界面如下,我们这个系统使用的机智云平台,在机智云平台提供了两种方式生成APP,功能都是一样的,大家可以任选其一使用。

系统功能实现中使用到的各个模块可以参考网站里面其它的文章,大家在实现功能的过程中可以进行参考。

系统功能

  • 灯光调节:

1、手动模式,通过按键对灯光进行调节。

2、自动模式,通过光敏电阻和人体检测传感器对灯光进行调控。

  • 坐姿检测:

1、超声波检测距离,当距离小于设定的阈值时,蜂鸣器报警。

  • 番茄时钟设置:

1、通过APP可以远程下方番茄钟的时间。

  • 语音控制

1、可以语音切换自动模式和手动模式

2、可以语音设置番茄钟时间。

3、可以语音控制灯光亮度。

  • OLED显示

1、显示自动/手动模式

2、显示灯光亮度

3、显示超声波距离

4、显示番茄钟时间

  • APP

1、可以选择自动模式和手动模式。

2、在手动模式下可以调节灯光亮度。

3、可以设置超声波检测距离阈值。

4、可以下发番茄钟时间。

大家可以在这个功能基础上去修改相关代码,去实现自己想要做的功能。

STM32智能台灯系统主函数流程图如下:

系统框架

物联网系统的实现方案有多种,其中较为常见的就是如下两种方案,本教程视频采取的是方案2。

该方案采用STM32单片机+机智云平台+APP去实现,目前这种物联网系统开发方案比较方便,不需要自己额外去编写APP代码,减少了很多的工作量,适合较为快速的去实现物联网系统。如果使用Onenet平台去实现,需要自己开发APP(具体可以看另外一个系统,采取的就是方案一)

2、代码工程

资料里会给大家分享两个代码工程,分别是STM32智能台灯基本框架代码和STM32智能台灯系统完整代码。这两个工程的介绍如下:

  • STM32智能台灯基本框架:主要是系统基本功能的实现,比如按键、串口、定时器、延迟函数和各种传感器模块驱动代码等内容的实现,但是并没有WIFl目录下机智云平台和main.c文件里功能实现相关的代码,主要是为了方便大家跟着视频一步一步进行操作。视频教程也是在基本代码框架工程的基础上,不断加入机智云平台相关代码,并开发相应的逻辑功能。从而实现完整的系统功能。

  • STM32智能台灯系统完整代码:该代码工程是我们系统功能实现的完整代码,在STM32智能台灯基本框架代码的基础上,添加了机智云平台相关代码和一些功能实现的相关代码。可直接下载到板子中,实现智能台灯系统的完整功能。

QQ20260105-220150.png

接下来我以STM32智能台灯系统完整代码工程给大家简单介绍一下工程里面都有什么文件,后续我们应该修改哪些文件去实现相应的功能。

开发STM32单片机程序,必不可少的工具就是keil,该工具如果大家没有的话,可以自行去网上下载安装一下。B站上针对安装该软件的视频教程特别的多,安装完成以后,就可以查看和编译代码工程了。keil软件安装完成以后,就可以进入代码工程的Project文件夹下,可以看到有个总的工程文件,打开该文件就可以看到我们的代码了。

3、机智云平台

机智云平台是面向开发者的一站式智能硬件开发平台。机智云平台提供了一些API接口供我们使用,能够降低对物联网设备的开发的门槛,我们可以通过调用提供的API将硬件设备快速的连接到云端。

Gagent是一个固件,主要的作用是数据转发,是设备数据、机智云、应用端(APP)的数据交互桥梁。我们只需要将该因件烧录到WIFI模块,就可以实现硬件设备与云端和APP的通信。因此使用该固件,可以节省我们自己编写与云平台通信代码。降低开发难度和节省时问。

1、注册账号

登录机智云官网https://www.gizwits.com,可以看到主界面上有开发者中心,我们后续的操作都是在这个开发者中心里面进行操作的。

如果之前没有创建过机智云的账号,可以先注册一个账号,注册完以后登陆即可。

进入到开发者中心就显示这个界面,我这里已经创建了一些设备,如果大家第一次用的话,这里面都是空的。后续需要创建对应的设备进行操作。

2、创建设备

在机智云平台上创建产品,后续我们单片机通过wi模块将数据上传到机智云平台,就是上传到这个产品中。单片机与机智云平台通信,其实就是单片机与机智云平台上的的某个产品进行通信。

在开发者中心,我们可以点击创建按钮,会让你选择创建的产品。我们选择自定义方案创建产品。

  • 产品名称:可以随便编写。

  • 类型:我们使用的是wifi接入,所以选择wifi模块

  • 数据传输方式:

定长:指在功能数据点上报下发时一并传输。

变长:指在功能数据点上报下发时只传输改变的功能数据点。比如一个灯有开关、亮度两个功能时,触发改变亮度这个功能时,定长是两个功能数据点的状态数据都传输,变长则只会传输亮度这个功能数据点。两者各有优势,定长对于开发更方便,变长则更节省传输资源。

  • 功耗方式:选择正常

3、定义数据点

产品创建好之后,我们就可以创建数据点,数据点即设备产品的功能的抽象,用于描述产品功能及其参数,创建数据点后,设备与云端通讯的数据格式即可确定,设备、机智云可以相互识别设备与机智云互联互通的数据。

数据点的创建需要根据我们系统的需求来进行创建,比如我们智能台灯系统中需要要远程控制单片机的灯光模式(切换手动模式或者自动模式),因此我们可以创建一个灯光模式的数据点。

  • 标识名:支持英文字母、数字和下划线,以英文字母开头。后续STM32单片机与机智云数据的交互就是通过这个标识去识别。

  • 显示名称:自定义功能点名称,APP界面上显示功能的名称。

  • 读写类型:

只读:表示该数据点非控制,数据只支持从设备上报。

可写:表示该数据点可控制。设备端可上报该数据点数据;云端/客户端可对该数据点数据做出下发控制。

  • 数据类型:

布尔值:表示两个状态:0,或1。如开关状态等,建议使用布尔数据类型。

枚举类型:可定义一个有限的取值集合。当定义的某个功能(元器件)有固定的若干个值

数值:填写数值范围,数值可为负数。

4、烧写GAgent固件

GAgent是运行在各种通讯模组上的一款应用程序(固件),可以提供上层应用(手机APP等控制端、云端)到产品设备的双向数据通讯,产品开发者使用GAgent后,只需要关心产品的业务逻组开发,不用关心数据的通讯功能开发,大大降低了开发的难度。

单片机通过申口发送命令给WIFI模块,从而与云平台进行连接和数据的交换。实现接入机智云,我们只需要给WIFI模块烧录一个Gagent固件,在该固件里实现了一些网络的传输协议,因此我们不必再关注具体的网络是怎么实现的。Gagent实现了设备、机智云、应用端(APP)的数据的交互。

我们将下载的压缩包进行解压,里面会有如下几个文件,首先我们需要根据WIFI模块的Flash大小去选择应该烧录那个文件,并且我们需要选择带有combine字段的bin文件。一般买的ESP8266-01s直接选择下图圈的那个bin文件下载就可以了。

首先我们需要从安信可官网下载ESP8266系列模组的固件烧录软件,我们使用下载的烧录器将GAgent固件烧录到我们的ESP8266上面。选择我们对应flash大小的combine文件,我手头的ESP8266M模块是ESP8266-01S,flash只有8Mbit,因此我选择了8Mbit的combint文件。SPI SPEED选择40MHz,SPI MODE选择DOUT,波特率选择115200。COM:选择你自己单片机对应的COM口。

  • 固件下载方式

1、PCB板下载

我们的开发板已经集成好了一颗CH340芯片,可以直接通过板子的串口给ESP8266-01S模块下载固件,只需要将下图所示的跳线帽放置对应的位置,配置好上面所讲的参数,然后点击START即可下载,如果没有反应,可以量新拔插一下wifi模块。当进度条加载完成,即完成下载。

2、USB转TTL下载器下载

如果没有智能台灯系统的PCB板,Wifi固件也可以通过USB转TTL下载器直接对ESP8266-01S模块进行连接下载。将wifi模块的串口与USB转TTL下载器的串口进行连接如下图所示,需要注意的是,下载固件的时候需要给Wifi模块的IO0引脚一个低电平,让WIFI模块进入下载模式,点击开始下载才能正常进行下载固件。

4、移植机智云代码

在机智云平台上创建完产品和数据点之后,我们就可以通过云平台直接生成一份代码。该代码实现了机智云通信协议的解析与封包、传感器数据与通信数据的转换逻辑,并封装成了简单的API。当设备收到云端或APP端的数据后,开发者只需要在对应的事件处理逻组中添加传感器的控制函数,便可完成产品的开发。我们把这个生成的代码下载下来,然后移植到我们的STM32单片机代码框架里面。

硬件平台:选择其它平台,这样会生成STM32标志库的代码。

1、文件移植

可以在STM32智能台灯基本框架工程里面新建一个Wifi文件夹(命名可以随意)。

创建完这个文件夹后,将刚刚从机智云平台下载的文件拷贝到Wifi文件夹目录下。其中从机智云下载的文件夹里面的main.c文件可以不进行移植。

2、文件添加到工程环境

在工程里新建Wifi目录,并且将刚才拷贝的WIFI相关的文件添加到工程里面。

点击OK,可以看到工程左侧的目录里面多出来了Wifi的目录,并且该目录下面有刚刚添加的一些文件。这样我们就完成将机智云生成的代码移植到了我们的代码工程里面,接下来需要做的就是修改这些文件,实现我们的系统功能。

3、单片机获取WIFI发送过来的数据

单片机与WIFI模块是通过串口2连接的,wifi模块从云平台获取到数据,然后通过串口2发送给单片机。由于数据是一直可以从机智云平台下发,因此需要将数据写入循环缓冲区甲面,当我们处理数据时,就从这个循环buffer面取出来相应的数据。因此在串口2的中断接收函数里面,我们去调用gizPutData,将获取到的数据先入循环buffer,以待后续的处理。

需要注意的是,由于我们在bsp_usart2.c文件里面调用了其它文件的函数,所以需要在这个.C文件里面包含头文件 #include "gizwits_protocol.h"

void  USART2_IRQHandler(void)
{
	uint8_t u8res = 0;
	if(USART_GetITStatus(USART2,USART_IT_RXNE)!=RESET)
	{
		u8res = USART_ReceiveData(USART2);
		gizPutData(&u8res,1);	 		
	}
}

4、单片机采集到的数据发送Wifi模块

单片机将数据发送给wifi模块,是通过uartWrite函数进行的。但这个函数里面并没有实现真正的串口发送函数,所以我们要在这个地方调用串口2的接口,能够让单片机通过串口2将数据发送给wifi模块,wifi模块再将数据发送给机智云平台。同样的,在这个文件里面调用了串口2相关的函数,因此也需要包含对应的头文件。

int32_t uartWrite(uint8_t *buf, uint32_t len)
{
    uint32_t i = 0;
    
    if(NULL == buf)
    {
        return -1;
    }

    for(i=0; i<len; i++)
    {
        USART_SendData(USART2, buf[i]);//STM32 test demo
        while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
        if(i >=2 && buf[i] == 0xFF)
        {
					USART_SendData(USART2, 0X55);//STM32 test demo
					while(USART_GetFlagStatus(USART2,USART_FLAG_TXE) == RESET);
        }
    }  
    return len;
}

5、实现毫秒的定时

网络协议层的运行需要一个系统时间,事件单位为毫秒,所以我们需要实现毫秒定时器(必须是1ms的精确定时,若不准确,会影响到超时重发、定时上报等处理),gizTimerMs()函数具体位置在gizwits_product.c文件下。在定时器中断函数里面添加完gizTimerMs()函数之后,需要在gizwits_product.h进行声明一下,gizTimerMs()函数才能够被其它.c文件引用,并且在bsp_timer.c文件引l用时需要包含gizwits_product.h头文件。

6、实现mcuRestart复位函数

WIFI在通信过程中会对MCU进行请求复位,而复位调用函数为mcuRestartO,该函数是空的,我们需在函数中实现软复位,函数位置在gizwits_product.c中。我们只需要在该接口中增加两行代码即可。

void mcuRestart(void)
{
	__set_FAULTMASK(1);
	NVIC_SystemReset();
}

通过这几部分操作,我们就算将从机智云下载的代码给集成到我们自己的工程里面了,实现了一个代码的移植。后续,我们只需要在这个上面去编写我们的逻辑功能函数代码即可。

5、功能实现

  • 配网模式

WIFI设备与机智云通信前需要配置配网模式,而设置配网模式是调用了gizwitsSetMod()函数,其函数可实现模组配网功能,gizwitsSetModeO函数具体位置在gizwits_protocol.c文件下,提供了多种配置模式SoftAP、AirLink等模式、在本次项目中,我们使用的配网方式为SoftAP模式。

我们通过按键的方式对设备进行入网模式的配置,当按下按键时,完成配网的设置关于配网模式,我们只需要关注SoftAP、AirLink模式,这两种模式我们可以根据自己的需求进行配置。

AirLink模式:当设备处于该模式下,会不断的接收待特定编码的wifi广播包,手机连接可用的wifi网络后,通过指定的APP发送编码后的WIFI网络的SSID和密码广播,设备接收到之后自动尝试连接此WiFi网络,连接成功即配置完成。

SoftAP模式:设备在SoftAP模式下相当于一个热点,于机可以连接到该热点中,并将可用的wifi网络SSID和密码发送给设备,设备接收到配置信息后自动尝试连接该路由器,连接成功则自动切换到正常使用的模式。

  • 功能实现

具体功能实现的代码大家可参考B站教程视频13、14、15章。了解代码编写的流程,就能够完整的了解整个系统的制作过程。