文章目录
- 一、项目简介
- 二、项目组成
- 三、原理图设计
- 四、源码设计
- 五、APP设计
- 六、成品展示
一、项目简介
本设计以一款为基础STM32物联网智能台灯设计,采用STM32F103C8T6使用最小系统作为主控HLK_V语音控制开关灯采用语音识别模块ESP8266_WIFI手机通信模块和云平台APP远程控制,使用HC-SR04超声传感器检测人与台灯的距离,判断坐姿是否异常,使用L298N使用电机驱动模块来控制台灯的亮度RTC实时实时钟获取当前时间.96寸的OLED使用12个显示屏实时显示时间、日期、距离等信息V不同风格的照明采用冷使用按钮控制灯的开关、档位调整和冷暖光切换。
二、项目组成
系统框图
三、原理图设计
四、源码设计
main.c
///单片机头文件 #include "stm32f10x.h" //网络协议层 #include "onenet.h" //网络设备 #include "net_device.h" ///硬件驱动 #include "led.h" #include "oled.h" #include "delay.h" #include "usart.h" #include "hwtimer.h" #include "SysTick.h" #include "system.h" #include "iwdg.h" #include "fault.h" #include "selfcheck.h" #include "info.h" #include "key.h" #include "yykz.h" #include "pwm.h" #include "rtc.h" #include "TIM1.h" #include "UltrasonicWave.h"
//C库
#include <string.h>
_Bool LED_Q=0;//0灯关 1灯开 u8 D_W=0; //0亮度30% 1亮度60% 2亮度100% u32 J_L=0;
_Bool LED_C=0;//0暖白 1白
//数据流 DATA_STREAM dataStream[] = {
{
"LED_Q", &LED_Q, TYPE_BOOL, 1},
{
"LED_C", &LED_C, TYPE_BOOL, 1},
{
"D_W", &D_W, TYPE_UCHAR, 1},
{
"J_L", &J_L, TYPE_UINT, 1},
}; unsigned char dataStreamLen = sizeof(dataStream) / sizeof(dataStream[0]);
/* ************************************************************ * 函数名称: Hardware_Init * * 函数功能: 硬件初始化 * * 入口参数: 无 * * 返回参数: 无 * * 说明: 初始化单片机功能以及外接设备 ************************************************************ */ void Hardware_Init(void) {
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //中断控制器分组设置 Delay_Init(); //systick初始化 Led_Init(); //LED初始化 Usart1_Init(115200);
//初始化串口 115200bps TIM1_Configuration(); UltrasonicWave_Configuration(); netDeviceInfo.reboot = 0; TIM2_Int_Init(49, 35999); //72MHz,36000分频-500us,50重载值。则中断周期为500us * 50 = 25ms TIM3_Int_Init(1999, 35999); //72MHz,36000分频-500us,2000重载值。则中断周期为500us * 2000 = 1s //定时检查网络状态标志位 UsartPrintf(USART_DEBUG, "3.Hardware init OK\r\n"); //提示初始化完成 }
/* ************************************************************ * 函数名称: main * * 函数功能: * * 入口参数: 无 * * 返回参数: 0 * * 说明: ************************************************************ */ int main(void) {
u16 i; u8 k; u8 t; u8 flag=0; unsigned char *dataPtr; unsigned int runTime = 0; _Bool sendFlag = 0; SysTick_Init(48); Hardware_Init(); //硬件初始化 NET_DEVICE_IO_Init(); //网络设备IO初始化 NET_DEVICE_Reset(); //网络设备复位 NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式(例如ESP8266要区分AT的返回还是平台下发数据的返回) OLED_Init(); KEY_Init(); Yyds_Init(); TIM4_PWM_Init(899,0); TIM_SetCompare3(TIM4,900); TIM_SetCompare4(TIM4,900); while(RTC_Init()) //RTC初始化 ,一定要初始化成功 { } OLED_ShowString(0,0,"DATE:"); OLED_ShowString(0,2,"TIME:"); OLED_ShowString(0,4,"JULI: CM"); while(1) { if(flag==0) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 0) {
flag=1;
LED_Q=1; } } else {
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_4) == 1) {
flag=0;
LED_Q=0; } } //超声波测距 J_L=UltrasonicWave_StartMeasure(); UsartPrintf(USART_DEBUG,"\r\ndistance:%d cm\r\n",J_L); OLED_ShowNum(40,4,J_L,3,16); //小于设置距离LED亮 if(J_L<=30) { Led1_Set(0);
} else {
Led1_Set(1); } //显示时间日期 if(t!=calendar.sec) { t=calendar.sec; OLED_ShowNum(40,0,calendar.w_year,4,16); OLED_ShowNum(80,0,calendar.w_month,2,16); OLED_ShowNum(100,0,calendar.w_date,2,16); OLED_ShowNum(40,2,calendar.hour,2,16); OLED_ShowNum(70,2,calendar.min,2,16); OLED_ShowNum(100,2,calendar.sec,2,16); } k=KEY_Scan(0); switch(k) { //按键1控制开关灯 case KEY0_PRES: //开关灯 if(LED_C==0) {
if(LED_Q==0)
{
LED_Q=1;
}
else
{
LED_Q=0;
} } else {
if(LED_Q==0)
{
LED_Q=1;
}
else
{
LED_Q=0;
} } break; //按键2控制灯光切换 case KEY1_PRES:
if(LED_C==0)
LED_C=1;
else
LED_C=0; //灯光切换 break;
//按键3控制调节亮度,一共三挡 case KEY2_PRES:
if(D_W==0)
{
D_W=1;
}
else if(D_W==1)
{
D_W=2;
}
else if(D_W==2)
{
D_W=0;
} //亮度调节 break; }
if(LED_C==0) {
if(LED_Q==0) {
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,900); } else if(LED_Q==1) {
if(D_W==0)
{
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,500);
}
else if(D_W==1)
{
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,300);
}
else if(D_W==2)
{
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,0);
} } } else if(LED_C==1) {
if(LED_Q==0) {
TIM_SetCompare3(TIM4,900);
TIM_SetCompare4(TIM4,900); } else if(LED_Q==1) {
if(D_W==0)
{
TIM_SetCompare3(TIM4,500);
TIM_SetCompare4(TIM4,900);
}
else if(D_W==1)
{
TIM_SetCompare3(TIM4,300);
TIM_SetCompare4(TIM4,900);
}
else if(D_W==2)
{
TIM_SetCompare3(TIM4,0);
TIM_SetCompare4(TIM4,900);
} } } delay_ms(100); if(oneNetInfo.netWork == 1) {
OLED_ShowNum(110,6,1,1,16); /****************************************************************************** 数据与心跳 ******************************************************************************/ if(timInfo.timer6Out - runTime >= 100) //25s一次(25ms中断) {
runTime = timInfo.timer6Out;
if(sendFlag)
{
TIM_Cmd(OS_TIMER, DISABLE);
OneNet_HeartBeat(); //心跳连接
TIM_Cmd(OS_TIMER, ENABLE);
}
else
{
TIM_Cmd(OS_TIMER, DISABLE);
OneNet_SendData(kTypeSimpleJsonWithoutTime, dataStreamLen); //数据发送
TIM_Cmd(OS_TIMER, ENABLE);
}
sendFlag = !sendFlag; }
/****************************************************************************** 平台下发命令解析 ******************************************************************************/ if(oneNetInfo.netWork && NET_DEVICE_Get_DataMode() == DEVICE_DATA_MODE) //当有网络 且 在命令接收模式时 {
dataPtr = NET_DEVICE_GetIPD(0); //不等待,获取平台下发的数据
if(dataPtr != NULL) //如果数据指针不为空,则代表收到了数据
{
OneNet_App(dataPtr); //集中处理
} }
/****************************************************************************** 错误处理 ******************************************************************************/ if(faultType != FAULT_NONE) //如果错误标志被设置 {
UsartPrintf(USART_DEBUG, "WARN: Fault Process\r\n");
Fault_Process(); //进入错误处理函数 }
/****************************************************************************** 数据反馈 ******************************************************************************/ if(oneNetInfo.sendData) {
oneNetInfo.sendData = OneNet_SendData(kTypeSimpleJsonWithoutTime, dataStreamLen); } } else {
OLED_ShowNum(110,6,0,1,16); /****************************************************************************** 初始化网络设备、接入平台 ******************************************************************************/ if(!oneNetInfo.netWork && (checkInfo.NET_DEVICE_OK == DEV_OK)) //当没有网络 且 网络模块检测到时 {
NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式
if(!NET_DEVICE_Init()) //初始化网络设备,能连入网络
{
OneNet_DevLink(oneNetInfo.devID, oneNetInfo.apiKey); //接入平台
if(oneNetInfo.netWork)
{
runTime = timInfo.timer6Out; //更新时间
}
else
{
}
} }
/****************************************************************************** 网络设备检测 ******************************************************************************/ if(checkInfo.NET_DEVICE_OK == DEV_ERR) //当网络设备未做检测 {
NET_DEVICE_Set_DataMode(DEVICE_CMD_MODE); //设置为命令收发模式
if(timerCount >= NET_TIME) //如果网络连接超时
{
UsartPrintf(USART_DEBUG, "Tips: Timer Check Err\r\n");
NET_DEVICE_Reset(); //复位网络设备
timerCount = 0; //清零连接超时计数
faultType = FAULT_NONE; //清除错误标志
}
if(!NET_DEVICE_SendCmd("AT\r\n", "OK")) //网络设备检测
{
UsartPrintf(USART_DEBUG, "NET Device :Ok\r\n");
checkInfo.NET_DEVICE_OK = DEV_OK; //检测到网络设备,标记
NET_DEVICE_Set_DataMode(DEVICE_DATA_MODE); //设置为数据收发模式
}
else
{
UsartPrintf(USART_DEBUG, "NET Device :Error\r\n");
} } }delay_ms(10); }
}
五、APP设计
六、成品展示
演示视频(APP是旧版本,现在使用的是如上面图片的新版本)
[智能台灯实物演示]基于STM32物联网的智能台灯已做好,演示视频,欢迎大家一起学习,语音控制,远程控制