STM32项目分享:智能语音三色灯

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图 

五、程序设计 

六、实验效果 

七、资料内容

项目分享


一、前言

项目成品图片:

哔哩哔哩视频链接:

STM32智能语音三色灯

(资料分享见文末) 

二、项目简介

1.功能详解

基于STM32的智能语音三色灯

功能如下:

  1. 检测功能:系统检测周围 温湿度数据、距离、人体信号、光照强度。
  2. 显示功能:将检测到的数据显示在oled屏幕上。
  3. 控制功能:系统可以通过PWM对其进行亮度和冷光、暖光、中性光的调节。
  4. 手动模式:通过按键控制台灯的亮度。
  5. 自动模式:当环境亮度低于阈值,并且有人时,会自动调节台灯亮度;
  6. 语音控制:通过语音指令可以控制LED灯的开启,以及亮度调节和冷暖光调节和系统模式切换等;
  7. 定时提醒:用户可以设置提醒时间,当到达时间后蜂鸣器会进行提醒。
  8. 护眼功能:当系统检测到人距离台灯过近时蜂鸣器报警。
  9. 阈值调节:系统传感器阈值大小可以通过按键或者APP自行设置调节。
  10. 接入云平台:系统通过ESP8266 WIFI模块连接网络,接入机智云服务器。
  11. 远程控制:可以通过APP查看传感器数据,以及远程控制台灯、远程调节阈值。
     

2.主要器件

  • STM32F103C8T6单片机
  • OLED 屏幕
  • DHT11温湿度传感器
  • HC-SR501人体红外传感器
  • 光敏传感器
  • HC-SR04超声波传感器
  • SNR8016语音模块
  • 有源蜂鸣器
  • 三色灯板
  • ESP8266-01S(WIFI模块)

三、原理图设计

四、PCB硬件设计

PCB图 

五、程序设计 

#include "stm32f10x.h"                  // Device header
#include "adcx.h"
#include "ldr.h"
#include "oled.h"
#include "dht11.h"
#include "pwm.h"
#include "led.h"
#include "key.h"
#include "tim2.h"   
#include "tim3.h"   
#include "hc_sr501.h"
#include "hc_sr04.h"
#include "sensormodules.h"
#include "usart.h"
#include "gizwits_product.h"
#include "myrtc.h"
#include "flash.h"
#include "iwdg.h"
#include "usart3.h"

#define KEY_Long1	11

#define KEY_1	1
#define KEY_2	2
#define KEY_3	3
#define KEY_4	4

#define FLASH_START_ADDR	0x0801f000	//写入的起始地址

uint8_t hc501;						//存储人体信号
uint8_t systemModel = 0;				//存储系统当前模式

uint8_t hour,minute,second;			//时 分 秒
uint8_t menu = 1;					//显示菜单变量
uint8_t gizwitsModeFlag;			// 配网标志位

SensorModules sensorData;	//声明传感器数据结构体变量
SensorThresholdValue Sensorthreshold;	//声明传感器阈值结构体变量


int main(void)
{
	Buzzer_Init();
	LDR_Init();
	OLED_Init();
	DHT11_Init();
	Key_Init();
	HC_SR501_Init();
	HC_SR04_Init();
	
	ADCX_Init();
	PWM_Init(100 - 1, 720 - 1);
	Timer2_Init(9,14398);
	Uart2_Init(9600);
	Uart1_Init(115200);
	IWDG_Init();	//初始化看门狗
	Uart3_Init();
	
	MyRTC_Init();	
	LED_Init();
	
	Sensorthreshold.Illumination_threshold = FLASH_R(FLASH_START_ADDR);	//从指定页的地址读FLASH
	Sensorthreshold.Distance_threshold = FLASH_R(FLASH_START_ADDR+2);	//从指定页的地址读FLASH
	Sensorthreshold.timing = FLASH_R(FLASH_START_ADDR+4);	//从指定页的地址读FLASH
	
	GENERAL_TIM_Init();
	userInit();		//完成机智云初始赋值
	gizwitsInit();	//开辟一个环形缓冲区
	 
	Delay_ms(1000);
//	scanGizwitsModeKey();	
	gizwitsSetMode(WIFI_AIRLINK_MODE);
	Delay_ms(1000);
	while (1)
	{
 		IWDG_ReloadCounter(); //重新加载计数值 喂狗
		sensorScan();	//获取传感器数据
		SNR8016();	//执行语音指令
		
		switch (menu)
		{
			case display_page:

				MyRTC_ReadTime();	//调用此函数后,RTC硬件电路里时间值将刷新到全局数组
				OLED_Menu_SensorData();	//显示主页面传感器数据、系统模式等内容
				OLED_Menu();	//显示主页面的固定内容
				TimingAlarm();
				if (!systemModel)
				{
					LED_PWM_KEY();	//按键控制LED的PWM			
				}
				
				//切换系统模式
				if (KeyNum == KEY_1)
				{
					KeyNum = 0;
					systemModel = ~systemModel;
					if (systemModel)
					{
						currentDataPoint.valueModel = 1;
						ledDutyRatio = 0;
						TIM_SetCompare1(TIM1, ledDutyRatio);
						
					}
					else
					{
						currentDataPoint.valueModel = 0;
						ledDutyRatio = 0;
						TIM_SetCompare1(TIM1, ledDutyRatio);
						Buzzer_OFF();
					}
				}				
				
				//判断是否进入阈值设置界面
				if (KeyNum == KEY_Long1)
				{
					KeyNum = 0;
					OLED_Clear();	//清屏
					menu = settingsPage;	//跳转到阈值设置界面
				}
				break;
				
			case settingsPage:
				OLED_SetInterfacevoid();	//显示阈值设置界面的固定内容
				OLED_Option(SetSelection());	//实现阈值设置页面的选择功能
				ThresholdModification(SetSelection());	//实现阈值调节功能	
			
				//判断是否退出阈值设置界面
				if (KeyNum == KEY_2)
				{
					KeyNum = 0;
					OLED_Clear();	//清屏
					menu = display_page;	//跳转到主界面
					
					//存储修改的传感器阈值至flash内				
					FLASH_W(FLASH_START_ADDR, Sensorthreshold.Illumination_threshold, Sensorthreshold.Distance_threshold,
							Sensorthreshold.timing);
					
					currentDataPoint.valueIllumination_threshold = Sensorthreshold.Illumination_threshold;
					currentDataPoint.valueDistance_threshold = Sensorthreshold.Distance_threshold;
					currentDataPoint.valuetiming = Sensorthreshold.timing;
				}
				break;
				
			case timeSettingsPage:
				OLED_ThresholdTime();	//显示时间设置界面的内容
				OLED_Time_Option(SetTimeSelection());	//实现间设置界面的选择功能
				TimeModification(SetTimeSelection());	//实现时间调节功能	
				
				//判断是否退出时间设置界面
				if (KeyNum == KEY_2)
				{
					KeyNum = 0;
					//将更改的数据赋值回RTC数组中
					MyRTC_Time[3] = hour;	
					MyRTC_Time[4] = minute;
					MyRTC_Time[5] = second;		
					MyRTC_SetTime();	//调用此函数后,全局数组里时间值将刷新到RTC硬件电路	
		
					OLED_Clear();	//清屏
					menu = settingsPage;	//回到阈值设置界面
				}
				break;

			case gizwitsMode:
				if (gizwitsModeFlag == 1)
				{
					//显示“热点配网”
					OLED_ShowChinese(2,3,38);
					OLED_ShowChinese(2,4,39);
					OLED_ShowChinese(2,5,40);
					OLED_ShowChinese(2,6,41);
				}
				else if (gizwitsModeFlag == 2)
				{
					//显示“一键配网”
					OLED_ShowChinese(2,3,34);
					OLED_ShowChinese(2,4,35);
					OLED_ShowChinese(2,5,36);
					OLED_ShowChinese(2,6,37);
				}
				if (!gizwitsModeFlag)
				{
					KeyNum = 0;
					OLED_Clear();
					menu = display_page;
				}				
				break;
			
			default:
				break;				
		}	
		
		//判断上位机是否更改阈值,如更改则保存至flash中
		if (valueFlashflag)
		{
			valueFlashflag = 0;
			//存储修改的传感器阈值至flash内				
			FLASH_W(FLASH_START_ADDR, Sensorthreshold.Illumination_threshold, Sensorthreshold.Distance_threshold,
					Sensorthreshold.timing);
		}

		userHandle();	//更新机智云数据点变量存储的值
		gizwitsHandle((dataPoint_t *)&currentDataPoint);	//数据上传至机智云					
	}
}

六、实验效果 

七、资料内容

项目分享