基于STM32的定时定量智能宠物投食器原理图PCB
生活随笔
收集整理的這篇文章主要介紹了
基于STM32的定时定量智能宠物投食器原理图PCB
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
功能介紹:
0.本系統采用STM32F103ZET6作為單片機
1.四個功能按鍵可設置投喂實物和水等時間和投喂等級,等級越高表示投喂實物越多
2.時鐘芯片采用DS1302芯片
3.到達投喂時間蜂鳴器會響起,直到投喂結束
4.采用ESP8266 WiFi模塊可與手機進行數據通信
原理圖:
PCB:
主程序:
#define __MIAN_C #include "main.h"// 局部變量,用于保存轉換計算后的電壓值 CreatByte Flag; enum _MODE_DF_ dispMode;char dis[16]; u8 volatile setIndex = 0; u8 volatile feedTime[2] = {18, 0}; //投喂時間18:00 u16 volatile totalFeedTime[3] = {0, 0}; //總投喂時間 u8 volatile feedLevel = 1; //投喂量等級 u16 volatile amountOfFeed = 0; //總投喂量 u16 volatile feedDelay = 0; //喂食延遲 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();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_Clear();DelayMs(200);while (1){if (refreshFlag == 1){refreshFlag = 0;if (dispMode == NORMAL){DispNormal();}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;RELAY_WATER_ON;BUZZER_ON;}else{RELAY_FOOD_OFF;RELAY_WATER_OFF;BUZZER_OFF;}}KeyProcess();} }void DispNormal(void) {DS1302_ReadTime();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;}sprintf(dis, "%02d:%02d Feed:%02d:%02d", (int)timeBufDec[4], (int)timeBufDec[5], (int)feedTime[0], (unsigned int)feedTime[1]);// sprintf(dis, "%02d:%02d Feed:%02d:%02d",timeBufDec[4], timeBufDec[5], feedTime[0], feedTime[1]);LCD_DispStr(0, 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 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;}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 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;} }/*********************************************END OF FILE**********************/實物演示視頻:
https://www.bilibili.com/video/BV1234y177hy/
總結
以上是生活随笔為你收集整理的基于STM32的定时定量智能宠物投食器原理图PCB的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: checksum algorithm a
- 下一篇: python 二维码识别与重构