1、準備開發板
這里我選用了一塊網紅開發板:”小熊派“,這款板子的人氣比較高,還是全國大學生物聯網設計競賽(華為杯)的華為競賽開發板,我個人也比較喜歡用這款板子,這款板子在放在紙箱吃灰半年之后,被我重新拿了起來,并想借此寫博客的機會,整理一下自己的代碼,
開發板功能區分布圖

開發板俯視圖

我們前面實作了一個廚房煙霧監測系統,還有一點點的欠缺,就是不能通過按鍵進行煙霧濃度閾值的修改,現在我們把這部分功能進行完善,到了這里我們該怎么做呢,方法就是用標志位,難點主要是在:只有兩個按鍵,但是要實作畫面切換,并且修改閾值的操作,解決方法:按鍵按下的時候,進入閾值設定模式,當再按下上次按鍵的時候,進行閾值的加或者減,當按下另一個按鍵的時候,就會回到主選單,這樣就可以巧秒的利用兩個按鍵了,
2、在MDK中撰寫代碼
在main.c中撰寫以下代碼
/* USER CODE BEGIN 0 */
float smoke_value; //煙霧濃度值
float Smoke_UT = 5;//防止開機時閾值比煙霧濃度值小,導致蜂鳴器發聲
char LCD_Str[30];
unsigned char F1btn_back_flag; //按鍵1回傳主選單標志位
unsigned char F2btn_back_flag; //按鍵2回傳主選單標志位
unsigned char display_mode;//設定顯示的模式
typedef enum
{
NORMAL, //正常模式
SETUP //設定模式
}ENUM_DISPLAY_MODE;
//設定當前顯示模式
void setDisplayMode(ENUM_DISPLAY_MODE mode)
{
display_mode = mode;
}
//獲取當前顯示模式
ENUM_DISPLAY_MODE getDisplayMode(void)
{
return display_mode;
}
//閾值修改函式
void Info_Alter(char *info)
{
char *uwRet;
uwRet = strstr(info, "UT");
if (uwRet != NULL)
{
uwRet = strchr(uwRet, ':');
if (uwRet != NULL)
{
uwRet++;
printf("設定煙霧濃度閾值為:%s\r\n",uwRet);
Smoke_UT = atof(uwRet);
// printf("煙霧濃度閾值為:%f\r\n",Smoke_UT);
}
}
}
//LCD顯示函式
void LCD_Display(void)
{
if(getDisplayMode() == NORMAL)
{
sprintf(LCD_Str,"smoke:%0.2f",smoke_value);
LCD_ShowString(40, 50+24+32, 240, 32, 32, LCD_Str); //LCD顯示煙霧濃度
}
else
{
sprintf(LCD_Str,"upthv:%0.2f",Smoke_UT);
LCD_ShowString(40, 50+24+32, 240, 32, 32, LCD_Str); //LCD顯示煙霧濃度報警閾值
}
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
unsigned char key; //按鍵值
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
uint32_t smoke_time = 0; //煙霧定時采集
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_ADC1_Init();
MX_SPI2_Init();
MX_TIM2_Init();
MX_TIM16_Init();
/* USER CODE BEGIN 2 */
USART_Interupt_Enable(); //使能串口接收中斷和空閑中斷
TIM_Interupt_Enable(); //使能定時器更新中斷并啟動定時器
LCD_Init(); //LCD初始化
LCD_Clear(BLUE);//清屏為藍色
LCD_ShowString(65, 50+24+32, 240, 32, 32, "Welcome");//顯示字串,字體大小32*32
LCD_Draw_Circle(120, 120, 60);//畫圓 半徑r=60
LCD_Draw_Circle(120, 120, 80);//畫圓 半徑r=80
LCD_Draw_Circle(120, 120, 100);//畫圓 半徑r=100
LCD_Draw_Circle(120, 120, 120);//畫圓 半徑r=120
HAL_Delay(500); //歡迎頁面影片時間
LCD_Clear(BLACK);//清屏為黑色
LCD_ShowString(10, 10, 240, 24, 24, "Monitoring system");//顯示字串,字體大小24*24
LCD_Draw_Circle(120, 120, 85);//畫圓 半徑r=80
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(time2Count - smoke_time >= 1000) //( 1ms * 1000 )計時一秒
{
smoke_time = time2Count; //記下當前定時器的值
smoke_value = (float)ADC_GetValue()/4096*3.3; //轉化為電壓值
printf("smoke_value:%f\r\n",smoke_value);
if(smoke_value > Smoke_UT) //如果煙霧濃度超過閾值
{
printf("報警中...");
BEEP_ON;//蜂鳴器發聲
}
else
{
BEEP_OFF;//蜂鳴器關閉
}
}
key = KEY_Scan(0); //按鍵掃描函式(在這里不能使用連按)
if(key == 1) //如果按鍵1按下
{
LED_Set(LED_ON)//點亮LED
F2btn_back_flag = 1; //設定按鍵2回傳主頁面使能(再按下按鍵2回傳主界面)
Smoke_UT += 0.1; //將閾值加0.1
if(F1btn_back_flag == 1) //如果按鍵1回傳主頁面使能(這時候按下按鍵1回傳主頁面)
{
F1btn_back_flag = 0; //將按鍵1回傳主頁面失能
setDisplayMode(NORMAL); //設定顯示模式為正常模式
continue;
}
setDisplayMode(SETUP); //設定顯示模式為設定模式
}
else if(key == 2) //如果按鍵2按下
{
LED_Set(LED_OFF)//熄滅LED
F1btn_back_flag = 1; //設定按鍵1回傳主頁面使能(再按下按鍵1回傳主界面)
Smoke_UT -= 0.1; //將閾值減0.1
if(Smoke_UT<=0) //防止閾值為負數
Smoke_UT = 0;
if(F2btn_back_flag == 1) //如果按鍵2回傳主頁面使能(這時候按下按鍵2回傳主頁面)
{
F2btn_back_flag = 0; //將按鍵1回傳主頁面失能
setDisplayMode(NORMAL); //設定顯示模式為正常模式
continue;
}
setDisplayMode(SETUP); //設定顯示模式為設定模式
}
LCD_Display(); //在顯示LCD上顯示畫面
if(usart1Info.InfBit.finishFlag == REC_OK) //如果串口資料接收成功
{
usart1Info.rxBuf[usart1Info.InfBit.dataLen++] = '\0'; //在陣列最后添加\0,這樣可以截斷字串
printf("usart1Info.rxBuf:%s\r\n",usart1Info.rxBuf); //列印字串
Info_Alter((char*)usart1Info.rxBuf); //進行閾值的修改
usart1Info.InfBit.finishFlag = REC_WAIT; //將標志位設定成等待接收狀態
usart1Info.InfBit.dataLen = 0; //將接收的資料長度設定為0
}
}
/* USER CODE END 3 */
}
3、實驗現象
| 實作的功能 |
|---|
| 1、給單片機上電會顯示歡迎界面然后進入煙霧濃度顯示界面 |
| 2、按下按鍵1控制LED點亮,按下按鍵2控制LED熄滅 |
| 3、ADC采集煙霧傳感器濃度,并顯示到LCD螢屏上 |
| 4、通過串口助手向單片機發送閾值設定指令,設定閾值成功后會給串口助手回傳修改成功資訊 |
| 5、煙霧濃度超過所設定的閾值時,觸發蜂鳴器報警 |
| 6、按下按鍵1時,就會進入閾值設定畫面,再按下按鍵1,煙霧濃度閾值就會加0.1,當按下按鍵2的時候就會回到主頁面 按下按鍵2時,就會進入閾值設定畫面,再按下按鍵2,煙霧濃度閾值就會減0.1,當按下按鍵1的時候就會回到主頁面 |



[外鏈圖片轉存中…(img-seB2Y1W2-1626783255189)]

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/289682.html
標籤:其他
上一篇:ESP8266串口WiFi模塊基本使用方法和配置教程
下一篇:物聯網場景中的實時計算問題與方案
