可視化信息 網站個人如何在百度做廣告
文章目錄
- 一、熱帶魚缸控制系統(tǒng)
- 1.題目要求
- 2.思路
- 3.電路仿真
- 3.1 未仿真
- 3.2 開始仿真,顯示屏顯示水溫、渾濁度、光照強度等值
- 3.3 當水溫低于閾值,開啟加熱并聲光報警
- 3.4 當渾濁度高于閾值,開啟自動換水并聲光報警
- 3.5 當光照低于閾值,開啟補光并聲光報警
- 3.6 手動開啟增氧和喂食
- 3.7 遠程監(jiān)控水溫等數據,遠程控制增氧喂食以及修改溫度閾值等
- 4.仿真程序
- 4.1 程序說明
- 4.2 主程序
- 4.3 OLED顯示程序
- 4.4 串口指令程序
- 二、總結
一、熱帶魚缸控制系統(tǒng)
1.題目要求
部件:
主控:STM32
顯示:OLED
溫度:防水型DS18B20
渾濁度:TSW-30
光照:光敏電阻
無線通信:藍牙
繼電器5(換水、加熱、增氧、喂食、補光)
聲光報警:蜂鳴器+LED
按鍵5
主要功能需求:
1、實時監(jiān)測水溫、水體渾濁度、光照強度,并顯示在OLED屏幕上。
2、通過藍牙模塊將監(jiān)測到的各項數據傳輸到手機APP,實現遠程監(jiān)控,同時可以通過手機進行遠程控制。
3、水溫、光照低于閾值或渾濁度高于閾值開啟聲光報警。當渾濁度超過閾值,自動開啟換水;光照低于閾值,開啟補光;水溫低于閾值,開啟加熱。
4、通過按鍵可以開啟增氧、喂食,以及修改溫度、渾濁度和光照強度的閾值。
2.思路
主控是STM32,這里我們選擇常用的STM32F103C8T6單片機
顯示:OLED
顯示的內容比較多1個界面可能不夠顯示,所以用多個界面,界面切換選擇按鍵切換
溫度:防水型DS18B20
渾濁度:TSW-30(proteus仿真沒有該傳感器,所以采用滑動變阻器模擬)
光照:光敏電阻
無線通信:藍牙
繼電器*5(換水、加熱、增氧、喂食、補光)和 聲光報警:蜂鳴器+LED
按鍵*5
通過按鍵手動開啟/關閉增氧,手動開啟/關閉喂食,這里兩個按鍵
要修改溫度,渾濁度,光照強度的閾值,一共3個閾值,選擇用1個按鍵來切換選擇的閾值,另外2個按鍵增大/減小閾值,這里三個按鍵。
3.電路仿真
3.1 未仿真
3.2 開始仿真,顯示屏顯示水溫、渾濁度、光照強度等值
3.3 當水溫低于閾值,開啟加熱并聲光報警
3.4 當渾濁度高于閾值,開啟自動換水并聲光報警
3.5 當光照低于閾值,開啟補光并聲光報警
3.6 手動開啟增氧和喂食
3.7 遠程監(jiān)控水溫等數據,遠程控制增氧喂食以及修改溫度閾值等
遠程監(jiān)控水溫,渾濁度,光照強度等數據
遠程控制打開增氧,關閉增氧
遠程控制打開喂食,關閉喂食
按下切換按鍵,切換為設置溫度閾值界面,更改溫度閾值為50
按下切換按鍵,切換為設置渾濁度閾值界面,更改溫度閾值為66
按下切換按鍵,切換為設置光照閾值界面,更改溫度閾值為80
4.仿真程序
4.1 程序說明
主控芯片:STM32F103C8
HSI:64MHZ
Systick: 1ms
渾濁度傳感器:ADC(PA0)
光照傳感器:LDR(PA2)
DS18B20溫度傳感器:DAT(PA4)
模擬藍牙模塊(Uart1):9600(PA9:tx1,PA10:rx1)
聲光報警:BUZZER(PA15)
按鍵:
KEY1(PB0)
KEY2(PB1)
KEY3(PB2)
KEY2(PB3)
KEY5(PB4)
換水:RELAY1(PB6)
加熱:RELAY2(PB7)
增氧:RELAY3(PB8)
喂食:RELAY4(PB9)
補光:RELAY5(PB10)
OLED顯示屏:SCL(PB14),SDA(PB15)
串口協(xié)議
舉例如發(fā)送*Temp50,即設置溫度閾值位50度
*TempXX 設置溫度閾值 XX取值為0-99
*MuddXX 設置渾濁度閾值 XX取值為0-99
*IlluXX 設置光照閾值 XX取值為0-99
*oxygX 開啟/關閉增氧 X取值為0-1
*feedX 開啟/關閉喂食 X取值為0-1
*Read 遠程監(jiān)控水溫、水體渾濁度、光照強度等數據,
4.2 主程序
/* Includes ------------------------------------------------------------------*/
#include "Drv_UserSystem.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
/*** @brief main function.* @param none* @retval none*/
int main(void)
{UserSystemInit();//用戶配置初始化 while (1){ if(stSysTime.flg._10ms + TEN_MILLISECOND < Time_millis()) //10ms{stSysTime.flg._10ms = Time_millis(); Key_Scan();//按鍵掃描 } if(stSysTime.flg._50ms + FIFTY_MILLISECOND < Time_millis()) //50ms{stSysTime.flg._50ms = Time_millis();ADC_Scan();//采集渾濁度和光照強度 } if(stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms{stSysTime.flg._100ms = Time_millis(); DS18B20_Collect_data();//DS18B20采集溫度數據 OLED_Handel();//OLED顯示 Forewarning_Handel();//預警函數 Receive_data_Handel();//數據接收判斷 IWDG_ReloadCounter();//清開門狗 } }
}
4.3 OLED顯示程序
/******************************************************************************** 函數名:OLED_Handel* 描述 :OLED顯示* 輸入 :void* 輸出 :void* 調用 :初始化* 備注 :100ms
*******************************************************************************/
void OLED_Handel(void)
{ if(ADC_Flag){ if(Threshold_switching == 0){OLED_Show_Character(1,1,0,16);//水OLED_Show_Character(1,2,1,16);//溫 OLED_Show_Character(1,3,2,16);//: OLED_ShowNum(1,7,Temp_High,2); OLED_ShowString(1, 9, "."); OLED_ShowNum(1,10,Temp_Low,1); OLED_Show_Character(1,6,3,16);//°OLED_ShowString(1, 13, "C");OLED_Show_Character(2,1,4,16);//渾OLED_Show_Character(2,2,5,16);//度OLED_Show_Character(2,3,6,16);//度 OLED_Show_Character(2,4,2,16);//:OLED_ShowNum(2,9,ADC1_Value,2); OLED_ShowString(2, 11, "%"); OLED_Show_Character(3,1,7,16);//光OLED_Show_Character(3,2,8,16);//照OLED_Show_Character(3,3,9,16);//強OLED_Show_Character(3,4,10,16);//度 OLED_Show_Character(3,5,2,16);//: OLED_ShowNum(3,11,ADC2_Value,2); OLED_ShowString(3, 13, "%");}else if(Threshold_switching == 1){OLED_Show_Character(1,1,0,16);//水OLED_Show_Character(1,2,1,16);//溫 OLED_Show_Character(1,3,11,16);//閾OLED_Show_Character(1,4,12,16);//值 OLED_Show_Character(1,5,2,16);//: OLED_ShowNum(1,11,Temp_Threshold,2); OLED_Show_Character(1,7,3,16);//°OLED_ShowString(1, 15, "C"); }else if(Threshold_switching == 2){OLED_Show_Character(1,1,4,16);//渾OLED_Show_Character(1,2,5,16);//度OLED_Show_Character(1,3,6,16);//度 OLED_Show_Character(1,4,11,16);//閾OLED_Show_Character(1,5,12,16);//值 OLED_Show_Character(1,6,2,16);//: OLED_ShowNum(1,13,ADC1_Threshold,2); OLED_ShowString(1, 15, "%"); } else if(Threshold_switching == 3){ OLED_Show_Character(1,1,7,16);//光OLED_Show_Character(1,2,8,16);//照 OLED_Show_Character(1,3,11,16);//閾OLED_Show_Character(1,4,12,16);//值 OLED_Show_Character(1,5,2,16);//: OLED_ShowNum(1,13,ADC2_Threshold,2); OLED_ShowString(1, 15, "%"); } }
}
4.4 串口指令程序
/******************************************************************************** 函數名:Send_Cmd1* 描述 :設置溫度閾值* 輸入 :void* 輸出 :void* 調用 :需要時調用* 備注 :舉例如發(fā)送*Temp50,即設置溫度閾值位50度*******************************************************************************/
void Send_Cmd1(void)
{uint8_t i = 0; variable1 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if(variable1 < 99){Temp_Threshold = variable1;printf("手機設置的溫度閾值 = %d\r\n",Temp_Threshold); }else{printf("手機設置的溫度閾值超出設置范圍 \r\n"); }
}/******************************************************************************** 函數名:Send_Cmd2* 描述 :設置水體渾濁度閾值* 輸入 :void* 輸出 :void* 調用 :需要時調用* 備注 :*******************************************************************************/
void Send_Cmd2(void)
{uint8_t i = 0;variable2 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if(variable2 < 99){ADC1_Threshold = variable2;printf("手機設置的水體渾濁度閾值 = %d\r\n",ADC1_Threshold); } else{printf("手機設置的水體渾濁度閾值超出設置范圍 \r\n"); }
}/******************************************************************************** 函數名:Send_Cmd3* 描述 :設置光照閾值* 輸入 :void* 輸出 :void* 調用 :需要時調用* 備注 :*******************************************************************************/
void Send_Cmd3(void)
{uint8_t i = 0;variable3 = (AsciiToHex(uart1_rx_buf[i+5])*10+AsciiToHex(uart1_rx_buf[i+6]));if(variable3 < 99){ADC2_Threshold = variable3;printf("手機設置的光照閾值 = %d\r\n",ADC2_Threshold);} else{printf("手機設置的光照閾值超出設置范圍 \r\n"); }
}/******************************************************************************** 函數名:Send_Cmd4* 描述 :開啟/關閉增氧 * 輸入 :void* 輸出 :void* 調用 :需要時調用* 備注 :*******************************************************************************/
void Send_Cmd4(void)
{uint8_t i = 0;variable4 = AsciiToHex(uart1_rx_buf[i+5]);if(variable4 == 0){Relay3_Off(); printf("關閉增氧\r\n");} else if (variable4 == 1){Relay3_On(); printf("打開增氧 \r\n"); } else {printf("手機設置的供氧模式超出設置范圍 \r\n"); }
}/******************************************************************************** 函數名:Send_Cmd5* 描述 :開啟/關閉喂食* 輸入 :void* 輸出 :void* 調用 :需要時調用* 備注 :*******************************************************************************/
void Send_Cmd5(void)
{uint8_t i = 0;variable5 = AsciiToHex(uart1_rx_buf[i+5]);if(variable5 == 0){Relay4_Off(); printf("關閉喂食\r\n");} else if (variable5 == 1){Relay4_On(); printf("打開喂食 \r\n"); } else {printf("手機設置的喂食模式超出設置范圍 \r\n"); }
}/******************************************************************************** Function : Receive_data_Handel* Description : 數據接收判斷* Input : 無* Return : 無* Call : 100ms* Others :*******************************************************************************/
void Receive_data_Handel(void)
{uint8_t i = 0;if(uart1_rx_finsh){ for(i = 0;i< 20; i++){if(uart1_rx_buf[i] == '*') {switch(uart1_rx_buf[i+1]){case 'T':Send_Cmd1();break;//*TempXX case 'M':Send_Cmd2();break;//*MuddXXcase 'I':Send_Cmd3();break;//*IlluXX case 'o':Send_Cmd4();break;//*oxygX case 'f':Send_Cmd5();break;//*feedX case 'R':Printf_Task();break;//*Read default:break; } }}uart1_rx_finsh = 0; uart1_rx_count = 0;memset(uart1_rx_buf,0,RX_MAX_NUM); }
}/******************************************************************************** Function : Printf_Task* Description : 打印數據任務* Input : 無* Return : 無* Call : 1s* Others :*******************************************************************************/
void Printf_Task(void)
{if(ADC_Flag){ printf("水溫=%d.%d 水體渾濁度=%d 光照強度=%d\r\n",Temp_High,Temp_Low,ADC1_Value,ADC2_Value); }
}
二、總結
今天主要講了基于STM32的熱帶魚缸控制系統(tǒng)的設計。
感謝你的觀看!