1、系统介绍

本次我们教程中的项目为STM32智能台灯系统。希望通过对本项目的学习,大家可以成功的搭建出来智能台灯系统。并且可以在此基础上开发一些新的功能或者能够搭建其他各种各样类似的物联网系统。

关于系统的名称可以是以下不同的名称:基于机智云平台的智能台灯系统、STM32物联网智能台灯、STM32多功能台灯系统等等。

适用对象

该系统需要一定的C语言知识和STM32单片机开发经验,最起码了解过STM32单片机并简单的使用过,比如说使用单片机下载过程序。如果没有下载过程序,或对STM32单片机没有一点了解的同学,可以先简单了解一下。在我们的这个教程中,我主要会讲解系统所需要的每一个模块的用法,手把手的带大家实现相应的逻辑功能,主要讲解的是如何完成一个物联网系统。

1、适用于对物联网感兴趣的同学,想自己亲手做一个物联网系统。

2、该系统的开发也有一定的工作量,可适用于课程设计等。

3、想做其它物联网系统,可以学习该教程的开发方法,同样适用于开发一些其它相似的物联网系统。

实物展示

{2BD749FF-360A-450b-97C7-A00250F50311}.png

实物主要由单片机硬件电路和手机APP组成,通过APP可以远程控制硬件电路功能,并且硬件电路的一些状态也可以上发给APP。教程上使用的是通过PCB板焊接的硬件电路。有需要的同学也可以通过面包板简单搭建电路,代码和功能都是一样的,只需要注意传感器和单片机之间的连接即可。

硬件电路

单片机硬件系统可以通过多种方式搭建,主要有两种方式

1、PCB板:通过画系统的电路图,然后交给PCB生产厂家进行打板。我们只需要在做好的PCB电路板上面将相关的模块和元器件进行焊接即可。这种方式需要有系统的原理图,做出来的系统比较美观(视频教程使用的方式就为PCB板,外观美观,并且集成CH340芯片,可以一键下载程序)。

87fb185190c9311d7c0770f7a4fa07c0.png

2、面包板:面包板则搭建相对简单,不过需要许多的杜邦线对单片机和传感器模块进行连接。硬件实物比较杂乱,并且稳定性较低,容易损坏。简单实现功能可使用该方式,由于智能台灯系统功能稍微比较复杂,使用的模块比较多。所以暂且不使用面包板的方式去搭建,

两种方式各有好坏,具体使用哪种方式根据自己的需求去选择。不管用那种方式,都可以实现本系统的所有功能。相关原理图可以关注公众号进行获取。

模块

模块介绍

语言识别模块

语音识别模块

OLED显示模块

OELD显示模块

超声波测距模块

超声波测距模块

Wifi模块

ESP8266模块

光敏电阻模块

光敏电阻模块

LED灯模块

LED灯模块

人体红外检测模块

按键、LED、话筒、小喇叭等

系统功能

1、灯光调节:

  • 手动模式,通过按键对灯光亮度进行调节。

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

2、坐姿检测:

  • 超声波检测距离,当距离小于设定的阈值时,触发声光报警电路。

3、番茄时钟:

  • OLED显示设置的番茄时钟的倒计时。

4、语音控制

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

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

  • 可以语音控制灯光亮度。

5、OLED显示

  • 显示自动/手动模式

  • 显示灯光亮度

  • 显示超声波距离

  • 显示番茄钟时间

6、APP远程功能

  • 可以选择自动模式和手动模式。

  • 在手动模式下可以远程调节灯光亮度。

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

  • 可以下发番茄钟时间。

系统框架

整个系统主要分为硬件部分和云平台部分,硬件部分主要是通过STM32单片机对各种传感器模块数据进行处理,然后通过wifi模块与云平台进行数据的交互。云平台我们采取的是机智云平台,使用该平台的好处是单片机端程序写好之后,可以一键式生成APP界面,不用单独的再写一个APP界面,实现快捷开发。

图片2-gzzg.png

2、代码工程

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

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

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

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

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

打开工程以后,我们可以看到工程左侧有很多文件,先简单介绍一下这些文件都是用来干什么的。


首先介绍一下代码中的这些文件夹分别是什么:

  • STARTUP: 该目录下只有一个文件,作为单片机启动文件,该文件是由汇编语言编写,是上电之后执行的第一个程序。主要是初始化堆栈指针等内容,然后调用C语言main函数。

  • CMSIS:该目录下的文件主要是实现了操作内核外设寄存器的一些函数,我们其实很少用到,不需要修改。

  • FWLB:里面放的是ST 公司针对每个 STM32 外设而编写的库函数文件。我们调用的库函数的实现就是在这些文件中编写的。

  • Main:最主要的就是main.c文件,后续代码执行包括功能的实现,都是在这个main.c文件里进行的。

  • BSP:基本的功能代码,单片机的一些驱动代码,比如串口、定时器模块、按键、等功能的实现都放在这个文件夹下面。

  • APP:主要是一些传感器模块的驱动代码,比如温湿度传感器模块的代码、蜂鸣器功能的代码都在这个文件夹下。

  • Wifi:单片机与Onenet平台进行数据交互的实现都在这个目录中的文件中实现。

将不同功能的.c文件放在不同的目录下仅仅是为了整个工程框架看起来更加的简洁和清晰,比如说将实现与云平台交互的.c文件都放在Wifi目录下,大家一看就知道这个目录下的.c文件是和网络相关的。其实不同的.c文件也都可以全部都放在一个目录下,对其功能不影响,大家理解即可。

上面主要介绍了每个文件夹下都存放了什么样的文件。接下来重点介绍一下BSP、APP、Wifi目录下的文件。这些文件是我们实现功能的基础。
BSP目录下文件:

  • bsp_led.c:板子上LED灯功能实现

我们设计的电路板上面设计的声光报警电路驱动就在该文件中实现,主要就是驱动蜂鸣器和LED灯。让单片机输出高低电平就可以使声光报警电路关闭或打开。

  • bsp_delay.c:延时函数实现

延迟函数实现文件,这个里面通过定时器的方式实现ms级的延迟。比如你想实现LED灯一秒亮一下,就可以通过这个函数去实现。

  • bsp_usart.c:串口功能实现

Stm32单片机提供了多个串口,USART串口是STM32与外部设备交互信息的模块。其中Bsp_usart1.c功能为单片机与电脑串口打印工具通信。Bsp_usart2.c:单片机与Wifi模块通信。Bsp_usart3.c:单片机与语音识别模块进行通信。

3.png

  • bsp_Key.c:按键功能实现

我们设计的电路板预留了三个按键,按键的实现其实和LED灯的实现相差无异。当按键按下的时候,单片机管脚会输入低电平。因此只要我们调用函数去检测管脚的输入状态,如果输入状态为低电平的时候,就说明有按键按下了。

  • bsp_timer.c:定时器功能

       STM32F1 系列中,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器。定时器实现文件,定时器功能在单片机中比较重要,通过定时器我们可以去做很多的事情。比如说你想每隔1S实现一个变量Value加1,就可以通过定时器去定时,每过1s,首先Value加1。

APP目录下文件:

  • bsp_hw269.c: Led灯模块驱动文件

LED模块是通过单片机的PWM功能实现灯光亮度的调节的,该文件实现了单片机通过相应的管脚给LED灯模块输出PWM信号,从而控制灯光的亮暗程度。

  • bsp_dht11.c: 温湿度传感器驱动文件

DHT11温湿度传感器可以同时检测温度和湿度。它与单片机直接的交互协议是单总线协议,通过一根线单片机就可以和DHT11进行数据交流。DHT11上电之后就会自动检测环境中的温度和湿度,单片机只需要通过通信协议从DHT11获取温湿度的数据即可。

  • bsp_FMQ.c: 蜂鸣器驱动文件,实现相关管脚的初始化配置。

  • bsp_hcsr04.c:超声波传感器驱动文件

单片机通过外部中断和定时器的功能,完成对超声波模块距离的检测。具体的检测方法,在我们后面的教程中会讲到。

  • bsp_light.c:光敏电阻传感器驱动文件

  • bsp_oled.c:OLED显示屏驱动文件

该模块与单片机的通讯为IIC协议。模拟IIC指的就是用单片机引脚高低电平的变化,来模拟IIC的时序信号传送数据。硬件IIC则可以直接配置单片机相应的寄存器自动产生通讯信号,我们代码中主要采用了模拟IIC的方式来驱动OLED。单片机与OLED显示屏之间通过IIC协议进行数据的交互,从而正确的显示单片机发送给显示屏的数据。

  • bsp_sr312.c:人体红外检测模块驱动文件

人体红外检测模块的使用非常简单,当人体红外模块检测到有人时,模块的数据管脚就会输出高电平,单片机只需要读取到这个管脚为高电平,说明检测到有人出入。当红外模块没有检测到人的适合,会输出低电平,单片机检测到该管脚输出的是低电平,则表示没有检测到有人出入。

APP目录下的文件主要就是系统中各种传感器模块的实现,后续我们实现系统逻辑功能的时候,只需要调用相关的函数即可。


WIFI目录下文件:

WIFI目录下的文件就和机智云平台相关了,在后续我们机智云上功能配置好以后,会生成一个代码包,代码包下载完成之后其中就包含了这些文件。这些文件主要的作用是完成和机智云平台之间协议的封装、数据的转换等等。这些内容在后续对机智云平台介绍的时候会给大家讲的。大家这里先简单知道一下这些文件是和机智云平台交互的文件即可。

3、机智云平台

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

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

图片2-dzfe.png

机智云平台开发流程:

图片3-ovkc.png

Step1:注册账号

登录机智云官网https://www.gizwits.com/5,创建一个机智云平台的账号。

图片4-afty.png

注册完成之后,我们可以看到网站首页有一个开发者中心,我们后续的开发都是在开发者中心进行的。

Step2:创建设备

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

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

图片5-hqnm.png

图片6.png

  • 产品名称:可以随意填写。

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

  • 数据传输方式:

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

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

  • 功耗方式:选择正常

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

图片7-vdsi.png

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

  • 标识名:用于应用层传输,客户端或业务云开发时需要使用。命名规则遵循标准的开发语言变量名命名规范,支持英文字母、数字和下划线,以英文字母开头。

  • 显示名称:自定义功能点名称。

  • 读写类型:

图片9.png

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

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

③ 报警:表示该数据点非控制,数据只支持从设备上报,数据类型需为布尔值。

④ 故障:表示该数据点非控制,数据只支持从设备上报,数据类型需为布尔值。云端会对设备上报的该数据点做统计,可在“运行状态”查看。

  • 数据类型:

图片10.png

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

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

③ 数值:填写数值范围,数值可为负数/小数,机智云自动将数值转换为正数。

④ 扩展:填写数据长度,数据内容由用户自定义。对于上述功能点无法满足的复杂功能可采用。机智云不建议使用此类型数据,设备上报该数据点的数据,机智云无法识别。

比如我们智能台灯系统需要定义的数据点及相应的格式就有以下几种:

Step3:烧写GAgent固件

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

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

图片12.png

我们将下载的压缩包进行解压,里面会有如下几个文件,首先我们需要根据WIFI模块的Flash大小去选择应该烧录那个文件,并且我们需要选择带有combine字段的bin文件。

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

图片14.png

  • 固件下载方式

1、PCB板下载。

开发板已经集成好了一颗CH340芯片,可以直接通过板子的串口给ESP-01模块下载固件,只需要将下图三个跳线帽全部都置到右边。然后点击START即可下载,如果没有反应,可以重新拔插一下wifi模块。待软件最下面的进度条加载完成,即完成下载。

A7AABA43FE4E428B802AA8942DF208C5-plrk.png

2、USB转TTL下载器下载          

如果没有智能台灯系统的PCB板,Wifi固件也可以通过USB转TTL线对ESP-01S模块进行连接,直接将固件下载到模块中去。将wifi模块的串口与USB转TTL下载器的串口进行连接如下图所示。需要注意的是,用下载器下载,需要Wifi模块的IO0引脚一个低电平,即可完成下载。

图片1-mjxh.png

Step4:代码移植

创建完产品和数据点之后,我们就可以通过云平台直接生成一份代码。该代码实现了机智云通信协议的解析与封包、传感器数据与通信数据的转换逻辑,并封装成了简单的 API。当设备收到云端或 APP 端的数据后,开发者只需要在对应的事件处理逻辑中添加传感器的控制函数,便可完成产品的开发。在选择硬件平台的时候,我们需要选择其它平台。

图片16.png

  • Product Key:产品标识码,开发者通过机智云后台创建新产品后,自动生成的一个32位字符串。在机智云的数据库中是一个唯一的号码,开发者将Product Key写入设备主控MCU后,机智云通过此标识码对设备进行识别并自动完成注册。设备接入机智云的前提是,需要机智云认同这个设备。Product Key是设备接入机智云的一个重要参数

  • Product Secret:产品密钥,在生成Product Key的时候云端会对应生成一个Product Secret,该参数为关键性机密参数。

代码包下载完成之后我们就可以将有用的程序移植到我们的基本代码框架里面,Gizwits工程主要实现了机智云通信协议的解析与封包,并封装成了简单的API。当设备收到云端或APP端的数据后,程序会将数据转换成对应的事件并通知到应用层,开发者只需要在对应的事件处理逻辑API中添加传感器的控制函数,就可以完成产品的开发。

图片17.png

User文件里面的main.c文件,这个我们一般不需要管,也不用移植,Utile文件里面有6个文件,主要包括工具函数、数据点的相关压缩,解压函数,环形缓冲区等接口。我们对这些文件不需要进行修改,只需要直接移植到我们自己的程序中去即可。

       在Gizwits 文件夹下有2个.C文件和2个.H文件,这四个文件需要移植到我们自己的工程里面,也是我们需要添加自己一些修改的地方。

  • gizwits_product.c:该文件为功能相关处理函数,用户需要对该文件里面部分的函数进行完善和修改,以实现相应的功能。

  • gizwits_product.h存放产品相关宏定义,一般无需修改。

  • gizwits_protocol.c协议相关处理的文件,完成和wifi模块通信协议的解析,主要提供一些API接口函数供用户调用。

  • gizwits_protocol.h协议处理相关文件,定义产品密钥、结构体等,一般无需修改

  1. 将文件复制到我们框架工程

将Gizwite工程里面的Gizwits文件夹和Utils文件夹下面的文件都添加到我们工程里面里面的WIFI文件夹下面。

图片18.png

2、将文件添加到工程编译中

3、将wifi串口接收的数据写入缓冲区

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

因此在串口2的中断接收函数里面,我们直接调用gizPutData,将获取到的数据先写入循环buffer,以待后续的处理。

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模块发送数据

    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);
        }
    }

5、实现毫秒的定时

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

		gizTimerMs();

6、 实现mcuRestart复位函数

WIFI 在通信过程中会对 MCU 进行请求复位,而复位调用函数为mcuRestart(),该函数是空的,我们需在函数中实现软复位,函数位置在gizwits_product.c 中。我们只需要在该接口中增加__set_FAULTMASK(1);NVIC_SystemReset();

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

4、功能实现

  • 配网模式

 WIFI 设备与云端通信前需要配置配网模式,而设置配网模式是调用了gizwitsSetMode()函数,其函数可实现模组配网功能或复位、产测和绑定功能,gizwitsSetMode()函数具体位置在 gizwits_protocol.c 文件下,它共有五种配置模式,复位、 SoftAP、 AirLink 模式、产测模式和允许用户绑定设备模式。在本次项目中,我们使用的配网方式为SoftAP模式。我们通过按键的方式对设备进行入网模式的配置,当按下按键时,完成配网的设置

关于配网模式,我们只需要关注SoftAP、 AirLink 模式,这两种模式我们可以根据自己的需求进行配置。

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

QQ20241201-200058.png

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

QQ20241201-200115.png

  • 数据的上传和下发

	gizwitsHandle((dataPoint_t*)&currentDataPoint);			

单片机将采集到的数据通过wifi模块上传到机智云平台,或者机智云平台下发数据控制单片机实现相应的功能,都是在gizwitsHandle接口中实现的。