基于STM32单片机的智能鱼缸控制系统原理图PCB
生活随笔
收集整理的這篇文章主要介紹了
基于STM32单片机的智能鱼缸控制系统原理图PCB
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
功能介紹:
0.本系統采用STM32F103C8T6作為單片機
1.采用DS1302時鐘芯片可實時顯示時間,通過四個功能按鍵可設置投喂等操作定時時間
2.具有WiFi模塊可以與手機進行數據傳輸通信
3.采用防水型的DS18B20傳感器可以測量水溫
4.采用DC002作為電源接口可直接輸入5V給整個系統供電
5.水位傳感器可以測量水位的實時情況
6.具備水泵控制電路,根據水位傳感器數據判斷是否加水;具備加熱和投食控制電路。
原理圖:
PCB:
主程序:
#define __MIAN_C #include "main.h"// 局部變量,用于保存轉換計算后的電壓值 CreatByte volatile Flag; enum _MODE_DF_ dispMode;char dis[16]; volatile u8 setIndex = 0; volatile u8 feedTime[2] = {18, 0}; //投喂時間18:00 volatile u16 totalFeedTime[3] = {0, 0}; //投喂時間18:00 volatile u8 feedLevel = 1; //投喂量等級 volatile u16 amountOfFeed = 0; volatile u16 feedDelay = 0; //喂食延遲 uint16_t tempBuf = 0; float f_temp = 0.0; volatile uint16_t tempMin = 25; //最低溫度 volatile uint16_t tempMax = 40; //最高溫度 uint16_t waterLevel = 0; volatile uint16_t waterLevelLow = 25; //最低水位 volatile uint16_t waterLevelHigh = 35; //最高水位 char command = NULL;int main(void) {// 使用HSI,SYSCLK = 4M * RCC_PLLMul_x, x:[2,3,...16],最高是64MHHSI_SetSysClock(RCC_PLLMul_2); //使用內部8MHz晶振,并設置PLL輸出為8MHz// 端口初始化GENERAL_TIM_Init();GPIO_Config();DS1302_Init();USART_Config();ADCx_Init();DelayMs(1000);printf("AT+CIPMUX=1\r\n"); //打開多連接DelayMs(1000);printf("AT+CIPSERVER=1,8080\r\n"); //建立服務 端口號為8080DelayMs(1000);Key_GPIO_Config();DelayMs(200);LCD_GPIO_Init();LCD_Init();LCD_DispStr(0, 0, " Welcome! ");DelayMs(200);DelayMs(200);DelayMs(200);LCD_Clear();DelayMs(200);while (1){if (sendFlag == 1){sendFlag = 0;SendData();}if (refreshFlag == 1){refreshFlag = 0;if (dispMode == NORMAL){DispNormal();}if (waterLevel <= waterLevelLow) //水位低于最低水位值,啟動水泵繼電器{RELAY_WATER_ON;}else if (waterLevel >= waterLevelHigh) //水位高于最高水位值,關閉水泵繼電器{RELAY_WATER_OFF;}if (f_temp <= tempMin) //溫度低于最低溫度值,啟動加熱繼電器{RELAY_HEAT_ON;}else if (f_temp >= tempMax) //溫度高于最高溫度值,關閉加熱繼電器{RELAY_HEAT_OFF;}if (timeBufDec[4] == feedTime[0] && timeBufDec[5] == feedTime[1] && timeBufDec[6] == 0) //到達喂食時間{feedDelay = feedLevel * 5; //feedLevel * 1s * 5}if (feedDelay > 0) //啟動喂食{feedDelay--;amountOfFeed = amountOfFeed + 5; //喂食總量加5gtotalFeedTime[2]++; //秒鐘加if (totalFeedTime[2] == 60){totalFeedTime[2] = 0;totalFeedTime[1]++;if (totalFeedTime[1] == 60){totalFeedTime[1] = 0;totalFeedTime[0]++;}}RELAY_FOOD_ON;}else{RELAY_FOOD_OFF;}}KeyProcess();} }void DispNormal(void) {TIM_ITConfig(GENERAL_TIM2, TIM_IT_Update, DISABLE);DS1302_ReadTime();TIM_ITConfig(GENERAL_TIM2, TIM_IT_Update, ENABLE);sprintf(dis, "%02d/%02d/%02d", (int)timeBufDec[1], (int)timeBufDec[2], (int)timeBufDec[3]);// sprintf(dis, "%02d/%02d/%02d", timeBufDec[1], timeBufDec[2], timeBufDec[3]);LCD_DispStr(0, 0, dis);switch (timeBufDec[7]){case 0: LCD_DispStr(10, 0, " Sun."); break;case 1: LCD_DispStr(10, 0, " Sun."); break;case 2: LCD_DispStr(10, 0, " Mon."); break;case 3: LCD_DispStr(10, 0, " Tue."); break;case 4: LCD_DispStr(10, 0, " Wed."); break;case 5: LCD_DispStr(10, 0, "Thur."); break;case 6: LCD_DispStr(10, 0, " Fri."); break;case 7: LCD_DispStr(10, 0, " Sat."); break;default: break;}TIM_ITConfig(GENERAL_TIM2, TIM_IT_Update, DISABLE);DS18B20_GetTemp(&tempBuf); //采集溫度f_temp = tempBuf * 0.0625; //溫度轉換TIM_ITConfig(GENERAL_TIM2, TIM_IT_Update, ENABLE);waterLevel = ADC_ConvertedValue; //檢測水位值waterLevel = waterLevel * 100 / 4096;// sprintf(dis, "%02d:%02d %5.1f", (int)timeBufDec[4], (int)timeBufDec[5], f_temp);sprintf(dis, "%02d:%02d:%02d %4.1f", (int)timeBufDec[4], (int)timeBufDec[5], (int)timeBufDec[6], f_temp);LCD_DispStr(0, 1, dis);// LCD_DispOneChar(11, 1, 0xdf); //攝氏度右上角的° // LCD_DispOneChar(12, 1, 'C'); //攝氏度右上角的°sprintf(dis, " %02d", waterLevel);LCD_DispStr(13, 1, dis); }void DispSetRealTime(u8 setIndex) {sprintf(dis, "%02d/%02d/%02d", (unsigned int)timeBufDec[1], (unsigned int)timeBufDec[2], (unsigned int)timeBufDec[3]);LCD_DispStr(0, 0, dis);switch (timeBufDec[7]){case 1: LCD_DispStr(10, 0, " Sun."); break;case 2: LCD_DispStr(10, 0, " Mon."); break;case 3: LCD_DispStr(10, 0, " Tue."); break;case 4: LCD_DispStr(10, 0, " Wed."); break;case 5: LCD_DispStr(10, 0, "Thur."); break;case 6: LCD_DispStr(10, 0, " Fri."); break;case 7: LCD_DispStr(10, 0, " Sat."); break;default: break;}sprintf(dis, " %02d:%02d:%02d ", (unsigned int)timeBufDec[4], (unsigned int)timeBufDec[5], (unsigned int)timeBufDec[6]);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(1, 0, 1); break;case 2: LCD_SetCursor(4, 0, 1); break;case 3: LCD_SetCursor(7, 0, 1); break;case 4: LCD_SetCursor(14, 0, 1); break;case 5: LCD_SetCursor(5, 1, 1); break;case 6: LCD_SetCursor(8, 1, 1); break;case 7: LCD_SetCursor(11, 1, 1); break;default:break;} }void DispSetWaterLevel(u8 setIndex) {LCD_DispStr(0, 0, " Set WaterLevel ");sprintf(dis, " H:%2d%% L:%2d%% ", waterLevelHigh, waterLevelLow);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(6, 1, 1); break;case 2: LCD_SetCursor(12, 1, 1); break;default:;} }void DispSetTemp(u8 setIndex) {LCD_DispStr(0, 0, "Set Temperature ");sprintf(dis, " H:%3d L:%3d ", tempMax, tempMin);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(7, 1, 1); break;case 2: LCD_SetCursor(13, 1, 1); break;default:;} }void DispSetFeed(u8 setIndex) {sprintf(dis, "FeedTime: %02d:%02d ", (unsigned int)feedTime[0], (unsigned int)feedTime[1]);LCD_DispStr(0, 0, dis);sprintf(dis, "FeedLevel: %2d ", (unsigned int)feedLevel);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(11, 0, 1); break;case 2: LCD_SetCursor(14, 0, 1); break;case 3: LCD_SetCursor(12, 1, 1); break;default:break;} }void DispSetTotalFeed(u8 setIndex) {sprintf(dis, "Total: %02d:%02d:%02d", (unsigned int)totalFeedTime[0], (unsigned int)totalFeedTime[1], (unsigned int)totalFeedTime[2]);LCD_DispStr(0, 0, dis);sprintf(dis, "TotalFeed: %4dg", (unsigned int)amountOfFeed);LCD_DispStr(0, 1, dis);switch (setIndex){case 1: LCD_SetCursor(15, 0, 1); break;case 2: LCD_SetCursor(14, 1, 1); break;default: break;} }void SendData(void) {printf("AT+CIPSEND=0,29\r\n"); //發送29位數據DelayMs(100);printf("Water Level:%2d%% Temp:%5.1f'C\r\n", waterLevel, f_temp); //串口發送DelayMs(100); }/*********************************************END OF FILE**********************/實物演示視頻:
https://www.bilibili.com/video/BV1UU4y117K1/
總結
以上是生活随笔為你收集整理的基于STM32单片机的智能鱼缸控制系统原理图PCB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 斐波拉契数列的递推递归求解算法
- 下一篇: DW网页设计学习日记1