2021校賽基于stm32f103多功能臺燈
起源
又到了一學期一次的校內電子設計大賽,又到了激動人心的時刻每次電子設計大賽都會出現(xiàn)各種大佬展現(xiàn)他們的作品,對于我這種菜鳥也只能默默觀望,但是呢,積極參與還是要有的,記得上一次參加做的基于51的避障小車直接買的套件焊好 然后在燒入程序就直接上戰(zhàn)場了(結果自然是成功參與獎)。
這次校內電子設計大賽我選的是多功能臺燈制作,由于沒有規(guī)定單片機的型號,自己選擇合適的就行,就想到做一個基于stm32f103c8t6的多功能臺燈。自己剛好在自學了一小段時間32了剛好來檢測一下自己的學習情況,玩一些基本的外設。
心得總結
說真的看見其他人做的電子設計,就算是比較簡單的那種,當自己從頭做到尾的時候感受真的不一樣,在制作過程中會遇到各種bug,不斷的調試查找相關的資料解決后再進行下一步,然后就是反復這樣,并沒有我們想象的那么簡單。但是哈雖然過程艱難了一點最后還是很有成就感的,雖然簡單但至少是自己完成的。其實越到后面會發(fā)現(xiàn)結果也并沒有我們想象的那么重要,其中的過程更能讓我們成長,不斷發(fā)現(xiàn)問題,不斷想辦法去解決,然后把每一個問題和解決方法做好總結,到最后會發(fā)現(xiàn)這些都是我們寶貴的經(jīng)驗??傊兀m然我們比其他人笨了一點,技術也并沒有他們懂的多,但是我們愿意花更多的時間來彌補這些,成長慢了一點,我始終相信最后我們也都會成為其他人眼中的大佬。
基于stm32f103多功能臺燈制作
相關軟件鏈接 下面軟件都在這個鏈接中
鏈接:https://pan.baidu.com/s/1-1oYhpx1LAaYdCUx36Hg4A
提取碼:1ttv
–來自百度網(wǎng)盤超級會員V4的分享
一、環(huán)境準備
|Keil5|
|–|–|
| FlyMcu 程序下載軟件 |
STC-isp |
|野火串口調式助手
二、硬件準備
| stm32f103C8t6最小系統(tǒng)|
|–|–|
|IIC 四引腳 OLED顯示屏|
|光敏傳感器|
|蜂鳴器|
|超聲波|
|語音模塊|
|USB Led燈|
|串口轉TTL
|若干杜邦線
|洞洞板
| 按鍵若干個| |
三、功能構建
四、工程搭建
4.1 選好一個文件目錄在下面創(chuàng)建工程文件夾
這里我是基于正點原子標準庫模板進行代碼的添加的。
4.2 分模塊寫好相關功能模塊
這里的建議是我們每寫一個功能的時候都單獨的創(chuàng)建一個文件夾然后在里面創(chuàng)建一個xxx.c xxx.h 文件這樣寫的好處是方便我們的移值也比較清晰的看懂代碼模塊,特別是代碼量很大的時候 這樣寫的優(yōu)點就完全體現(xiàn)出來了。
寫代碼的時候也要把相關的文件路徑添加進來哦,要不然是找不到的
4.1 多級菜單顯示
把基本的模塊函數(shù)模塊寫好了就開始整體功能顯示設計了
首先我會把各種功能需要的菜單顯示列出來在用oled屏進行顯示
1.在開始用多級菜單進行顯示之前,也去看了很多其他大佬的博客,自己之前并沒有寫過這一類的,所以在這第一步就遇到了很多問題。每個菜單界面單獨顯示的時候很正常,進行頁面切換并進行相關功能函數(shù)顯示的時候就出現(xiàn)了問題,問題的界面切換過來了但是功能并沒有進行執(zhí)行??戳似渌┲鲗懙亩际莿?chuàng)建了結構體和嗎,枚舉來操作我們界面的切換和函數(shù)功能的調用??戳怂麄兊拇a才發(fā)現(xiàn)真的很菜,不由感慨大佬寫的代碼就是不一樣。
不過最重要的是在后面不斷的調試還是根據(jù)自己的想法實現(xiàn)了我想要的功能。自然后面也會去多學習一下大佬寫代碼的風格。
界面展示
主界面
菜單界面
光敏檢測界面
語音識別界面
時鐘顯示界面
整體效果還是不錯哈
4.2 主函數(shù)邏輯處理及相關函數(shù)調用
/************************************多功能臺燈********************************
一、相關功能
1.光敏傳感器檢測光照強度從而來自動調解燈光的暗亮程度
2.通過按鍵來控制 改變高低電平的占空比調節(jié)燈光的暗亮程度
3.通過語音識別來改變燈光的暗亮程度
4.通過超聲波來檢測 當檢測距離大于特定值的關閉燈光,否則在該模式下默認占空比50%
5.通過紅外遙控來控制燈光的暗亮程度
6.定時功能 用戶給個值 當達到此值時蜂鳴器發(fā)出相應的報警提示
二、菜單界面顯示
1.光敏界面
2.時鐘界面
3.按鍵界面
4.語音界面
5.超聲波界面
*******************************************************************************
Author:xiao yin
Date:2021-11-17
*******************************************************************************/
#include "stm32f10x.h"
#include "usart.h"
#include "oled.h"
#include "infrared.h"
#include "delay.h"
#include "led.h"
#include "adc.h"
#include "ldr.h"
#include "timer.h"
#include "key.h"
#include "timer2.h"
#include "syn6288.h"
#include "buzzer.h"
#include "ultrasonic.h"
#define Min_duty 0 //最小占空比
#define max_duty 100//最大占空比
extern unsigned char sec;//秒
extern unsigned char min; //分
extern unsigned char hour;//時
extern unsigned int count; //計數(shù)變量
extern unsigned char time[6]; //存儲時間轉換后的值
unsigned int adcx; //光敏值 0-100
unsigned char keyvalue;//按鍵返回值
unsigned char flag;//界面切換標志
unsigned int current_duty = 100; //當前占空比 此時燈光最暗
unsigned int value_duty; //設置占空比的值
unsigned char flag_function = 0;//函數(shù)功能標志位
unsigned char RxData; //語音接收
unsigned int Time = 120;//定時時間變量
float dis; //接收超聲波返回的數(shù)據(jù)
void main_interface(void);
void menu_interface(void);
void Interface1(void);
void Interface2(void);
void Interface3(void);
void Interface4(void);
void Interface5(void);
void Ldr_Tackle(void);
void Time_Display(void);
void KEY_Tackle_Puty(void);
void Voice_Tackle(void);
/*********************************************三個界面顯示函數(shù)*****************************/
//主頁面
void main_interface(void)
{
// OLED_Clear(0);
// delay_ms(10);
OLED_ShowCHinese(6,0,0);//智
OLED_ShowCHinese(26,0,1);//能
OLED_ShowCHinese(46,0,2);//臺
OLED_ShowCHinese(66,0,3);//燈
OLED_ShowCHinese(86,0,4);//系
OLED_ShowCHinese(106,0,5);//統(tǒng)
OLED_ShowNum(6,4,2021,4,16);
OLED_ShowCHinese_TWO(40,4,0);//年
OLED_ShowNum(60,4,11,2,16);
OLED_ShowCHinese_TWO(74,4,1);//月
OLED_ShowNum(92,4,17,2,16);
OLED_ShowCHinese_TWO(108,4,2);//日
}
//菜單頁面
void menu_interface(void)
{
// OLED_Clear(0);
// delay_ms(10);
//
OLED_ShowString(20,0,(unsigned char *)"Function",8);
OLED_ShowString(20,2,(unsigned char *)"1.Light Test",8);
OLED_ShowString(20,4,(unsigned char *)"2.Time Clock",8);
OLED_ShowString(20,6,(unsigned char *)"3.KEY Test",8);
}
//光敏功能界面1
void Interface1(void)
{
// OLED_Clear(0);
// delay_ms(10);
//
OLED_ShowString(20,0,(unsigned char *)"Light Test",8);
OLED_ShowString(10,3,(unsigned char *)"VALUE:",8);
OLED_ShowString(10,5,(unsigned char *)"DUTY :",8);
OLED_ShowString(10,7,(unsigned char *)"MODE :",8);
OLED_ShowNum(60,3,adcx/100,2,4);
OLED_ShowNum(68,3,adcx/10%10,2,4);
OLED_ShowNum(76,3,adcx%10,2,4);
OLED_ShowNum(60,5,(100-current_duty)/100,2,4); //百位
OLED_ShowNum(68,5,(100-current_duty)/10%10,2,4);//十位
OLED_ShowNum(76,5,(100-current_duty)%10,2,4);//個位
OLED_ShowNum(60,7,1,2,4);//mode
}
//時鐘功能界面2
void Interface2(void)
{
//界面清屏
// OLED_Clear(0);
// delay_ms(10);
//刷新重新要顯示的數(shù)據(jù)
OLED_ShowString(26,1,(unsigned char *)"Time Clock",8);
OLED_ShowString(30,5,(unsigned char *)"MODE :",8);
}
//按鍵功能界面3
void Interface3(void)
{
//界面清屏
// OLED_Clear(0);
// delay_ms(10);
//刷新重新要顯示的數(shù)據(jù)
OLED_ShowString(40,0,(unsigned char *)"KEY",8);
OLED_ShowString(10,3,(unsigned char *)"DUTY :",8);
OLED_ShowString(10,5,(unsigned char *)"MODE :",8);
OLED_ShowNum(68,3,(100-current_duty)/100,2,4); //百位
OLED_ShowNum(76,3,(100-current_duty)/10%10,2,4);//十位
OLED_ShowNum(84,3,(100-current_duty)%10,2,4);//個位
OLED_ShowNum(68,5,3,2,4);//mode
}
/*****************************************************************************************/
//功能界面四 語音模式
void Interface4(void)
{
OLED_ShowString(20,0,(unsigned char *)"Voice Test",8);
OLED_ShowString(10,3,(unsigned char *)"DUTY :",8);
OLED_ShowString(10,5,(unsigned char *)"MODE :",8);
OLED_ShowNum(60,3,(100-current_duty)/100,2,4); //百位
OLED_ShowNum(68,3,(100-current_duty)/10%10,2,4);//十位
OLED_ShowNum(76,3,(100-current_duty)%10,2,4);//個位
OLED_ShowNum(60,5,4,2,4);//mode
}
//超聲波測距界面
void Interface5(void)
{
OLED_ShowString(20,0,(unsigned char *)"CSB Test",8);
OLED_ShowString(10,4,(unsigned char *)"DIS:",8);
OLED_ShowString(10,6,(unsigned char *)"DUTY :",8);
OLED_ShowNum(60,4,(int)dis/100,2,4); //百位
OLED_ShowNum(68,4,(int)dis/10%10,2,4);//十位
OLED_ShowNum(76,4,(int)dis%10,2,4);//個位
OLED_ShowNum(60,6,(100-current_duty)/100,2,4); //百位
OLED_ShowNum(68,6,(100-current_duty)/10%10,2,4);//十位
OLED_ShowNum(76,6,(100-current_duty)%10,2,4);//個位
}
/*********************************************功能函數(shù)*********************************/
//光敏電阻改變led燈的亮度
void Ldr_Tackle(void)
{
adcx = Lsens_Get_Val();
if(adcx <=30 )
{
current_duty = 10;
}
else if(adcx > 30 && adcx <= 50)
{
current_duty = 40;
}
else if(adcx >50 && adcx <=70)
{
current_duty = 60;
}
else if(adcx>70 && adcx <= 90)
{
current_duty = 80;
}
else{
current_duty = 0;
}
// TIM_SetCompare2(TIM3,current_duty);
//printf("光線強度為:%d\n",adcx);
//printf("占空比為:%d\n",100-current_duty);
}
//對時間進行顯示
void Time_Display(void)
{
unsigned char i;
OLED_ShowNum(30,3,time[0],2,4);
OLED_ShowNum(38,3,time[1],2,4);
OLED_ShowChar(46,3,':',4);
OLED_ShowNum(52,3,time[2],2,4);
OLED_ShowNum(60,3,time[3],2,4);
OLED_ShowChar(68,3,':',4);
OLED_ShowNum(74,3,time[4],2,4);
OLED_ShowNum(82,3,time[5],2,4);
OLED_ShowNum(74,5,2,2,4);//mode
//如果超過
if(sec >= Time)
{
for(i =0; i< 4;i++)
{
Buzzer_On();
delay_ms(500);
Buzzer_Off();
}
sec = 0;
}
}
//按鍵處理函數(shù)通過key2 key3兩個按鍵來控制燈光的占空比
//key 2進行占空比的累加 key3 進行占空比的減
void KEY_Tackle_Puty(void)
{
keyvalue = 0;
keyvalue = KEY_Scan();
//當占空比加到最大值的時候重新從最小的占空比開始 當占空比減到最小值的時候重新從最大值開始
if(keyvalue == 3 )//為1的時候進行占空比加
{
current_duty+=20;
if(current_duty >=max_duty )
{
current_duty = 0;
}
}
if(keyvalue == 4)
{
current_duty-=20;
if(current_duty <= Min_duty)
{
current_duty = 100;
}
}
//printf("keyvalue = %d\n",keyvalue);
}
//超聲波處理函數(shù)
void Csb_Tackle(void)
{
dis = Senor_Using();
printf("current dis = %.2f\n",dis);
if(dis >= 500)
{
Buzzer_On();
delay_ms(500);
Buzzer_Off();
current_duty = 100; //檢測不到物體關閉燈光
}
else
{
current_duty = 50; //檢測到時候 默認 一半
}
}
//語音功能處理
void Voice_Tackle(void)
{
if(RxData == '0')
{
Buzzer_On();
delay_ms(500);
Buzzer_Off();
current_duty = 100; //關閉
}
else if(RxData == '1')
{
current_duty = 20;
//printf("rec 1 success\n");
}
else if(RxData == '2')
{
current_duty = 50;
// printf("res 2 success\n");
}
else if(RxData == '3')
{
current_duty = 90;
//printf("re3 success\n");
}
else if(RxData == '4')
{
Time = 10;
//printf("re 4 success\n");
}
else if(RxData == '5')
{
Time = 20;
//printf("re 5 success\n");
}
else if(RxData == '6')
{
Time = 30;
//printf("re 6 success\n");
}
else {
//printf("cmd is error\n");
}
}
/**********************************************************************************************/
//通過按鍵來進行界面的切換
unsigned char Key_Mode(void)
{
// delay_ms(500);
keyvalue = KEY_Scan(); //按鍵1來進行模式的切換
if(keyvalue == 1) //判斷按鍵1是否被按下
{
flag++;
}
if(keyvalue == 2)
{
flag--;
}
switch(flag)
{
case 1:OLED_Clear(0);main_interface();break;
case 2:OLED_Clear(0);menu_interface();break;
case 3:OLED_Clear(0);Interface1();flag_function=1;break;
case 4:OLED_Clear(0);Interface4();flag_function=2;break;
case 5:OLED_Clear(0);Interface2();flag_function=3;break;
case 6:OLED_Clear(0);Interface5();flag_function=4;break;
case 7:OLED_Clear(0);Interface3();flag_function=5;break;
default:break;
}
return flag_function; //返回功能函數(shù)的標志位
}
/*****************************************主函數(shù)*********************************/
int main(void)
{
unsigned char value =0;
Infrared_GPIO_INIT();
KEY_GPIO_INIT();//按鍵初始化
USART_INIT(9600); //串口初始化
LED_GPIO_INIT();// led初始化
CH_SR04_Init(); //超聲波初始化
Buzzer_GPIO_Init();//蜂鳴器初始化
Lsens_Init(); //光敏傳感器初始化
TIM3_PWM_Init(100-1,7200-1);//pwm控制初始化 1hkz 計數(shù)到100為10ms
OLED_Init(); //初始化OLED
OLED_Clear(0);
while(1)
{
value = Key_Mode();
if(value == 1)
{
Ldr_Tackle(); //光敏模式處理
}
else if(value == 2)
{
Voice_Tackle(); //語音模式功能處理
}
else if(value == 3)
{
Time_Display(); //定時模式處理
}
else if(value == 4)
{
Csb_Tackle(); //超聲波功能處理
}
else if(value == 5)
{
KEY_Tackle_Puty(); //按鍵模式功能處理
}
TIM_SetCompare2(TIM3,current_duty);
}
}
/***********************************串口中斷****************************/
//通過語音發(fā)送串口接收數(shù)據(jù)來進行燈光占空比的節(jié)和定時長短 這里我寫的比較簡單 要實現(xiàn)其他功能
//大家自己修改一下即可
void USART1_IRQHandler(void){
if (USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
USART_ClearITPendingBit(USART1, USART_IT_RXNE);
RxData=USART_ReceiveData(USART1);
if(RxData == '0')
{
Time = 20;
Buzzer_On();
delay_ms(50);
Buzzer_Off();
}
else if( RxData == '1')
{
current_duty = 10;
Buzzer_On();
delay_ms(50);
Buzzer_Off();
}
else if(RxData == '2')
{
current_duty = 50;
Buzzer_On();
delay_ms(50);
Buzzer_Off();
// printf("res 2 success\n");
}
else if(RxData == '3')
{
current_duty = 90;
Buzzer_On();
delay_ms(50);
Buzzer_Off();
//printf("re3 success\n");
}
else if(RxData == '4')
{
Time = 10;
Buzzer_On();
delay_ms(50);
Buzzer_Off();
//printf("re 4 success\n");
}
else if(RxData == '5') //關閉燈光
{
current_duty =100;
Buzzer_On();
delay_ms(50);
Buzzer_Off();
//printf("re 5 success\n");
}
else if(RxData == '6')
{
Time = 30;
Buzzer_On();
delay_ms(50);
Buzzer_Off();
//printf("re 6 success\n");
}
else {
//printf("cmd is error\n");
}
USART_SendData(USART1,RxData);
}
}
整體實物(太丑了 ^ ^)
上面代碼實測功能可以實現(xiàn),當然在邏輯處理上還是有有多問題 后面我會慢慢優(yōu)化,上面純屬個人理解有錯還希望各位大佬指正。學習一步一個腳印慢慢來,時間會見證一切 加油鴨。
文章來源:http://www.zghlxwxcb.cn/news/detail-419039.html
最后工程源碼的鏈接我放這里了有需要的小伙伴自取
有問題大家一起討論 共同進步
鏈接:https://pan.baidu.com/s/11gRoBYrJTWg69tV65VzX5w
提取碼:jyep
–來自百度網(wǎng)盤超級會員V4的分享文章來源地址http://www.zghlxwxcb.cn/news/detail-419039.html
現(xiàn)在項目不開源了哦,有需可私 創(chuàng)作不易拒絕白嫖
到了這里,關于2021校賽基于stm32f103多功能臺燈的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!