基于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相关推荐
- 基于STM32单片机的跑步机心率检测proteus仿真原理图PCB
功能: 0.本系统采用STM32F103RCT6作为单片机 1.系统采用LCD1602液晶实时显示转速 心率以及跑步时间等情况 2.系统设计有三个功能按键可以控制电机的启停以及复位跑步时间 3.心率检 ...
- 基于51单片机手势控制智能台灯(程序+原理图+PCB)
功能介绍: 1.采用手势传感器PAJ7620U2来检测当前的手势动作: 2.可以通过手势动作来控制灯的开关: 3.可以通过手势动作来控制LED灯的亮度: 4.LCD1602显示亮度等级: 5.可以通过 ...
- STM32单片机紫外线强度检测仪器蜂鸣器报警(程序+原理图+PCB)
本设计: 基于STM32单片机紫外线强度检测仪器蜂鸣器报警(程序+原理图+PCB) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 编号C0023 完整下载链接: ...
- 最简单DIY基于STM32单片机的WIFI智能小车设计方案
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 第三篇:最简单DIY基于STM32F ...
- 最简单DIY基于STM32单片机的蓝牙智能小车设计方案
STM32库函数开发系列文章目录 第一篇:STM32F103ZET6单片机双串口互发程序设计与实现 第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案 文章目录 STM32库函数开发系列文 ...
- 基于STM32的指纹识别智能锁设计
本设计是基于stm32的指纹识别智能锁设计,主要实现以下功能: 1,OLED显示输入锁的状态,解锁状态,开锁成功,开锁失败,确定,清除 2,通过矩阵键盘输入开门密码.修改密码.确认密码等操作: 3,可 ...
- (毕业设计资料)基于STM32的物联网WiFi智能家居控制系统
092[电路方案]基于STM32的物联网WiFi智能家居控制系统 功能: 1.可以检测环境中温湿度,气压,一氧化碳,空气质量,烟雾浓度和光照强度. 2.将测量的值显示在屏幕上,数据上报机智云平台可以通 ...
- 基于STM32的语言控制智能家居系统
承接单片机定做 文章目录 前言 一.设计目标及内容: 二.框架思路 三.实现 喜欢请点赞哦! 前言 基于STM32的语言控制智能家居系统,主控使用STM32F103(正点原子战舰板子) 一.设计目标及 ...
- 基于STM32F103C8T6的充电桩计费系统(程序+原理图+PCB+论文)
本设计: 基于STM32F103C8T6的充电桩计费系统(程序+原理图+PCB+论文) 原理图:Altium Designer 程序编译器:keil 5 编程语言:C语言 编号C0019 下载链接 [ ...
最新文章
- leetcode--无重复字符的最长子串--python
- vue 时间安排表
- Java并发工具类(闭锁CountDownLatch)
- grunt前端构建工具使用教程
- 将 vCenter Server vSphere 软件从 VMware vSphere 6.5 升级到 6.7
- 垃圾收集器分类与GC性能指标
- 致敬学习者丨黑马2020年度TOP榜视频教程,一键领!
- SPSS篇—卡方检验
- 不同安卓模拟器连接appium的端口
- python制作万年历
- 借助 PrivateLink 与 EMQX Cloud 建立安全可靠的连接
- kali Linux 常用软件
- 2022年重新启航规划
- 跨域 万金油解决方法 非原理向
- 【SVM】支持向量机数学公式
- android 性格测试 csdn,华为加密状态码查询脚本
- 触觉智能分享-SSD20X Ubuntu 20.04 文件系统的移植
- gold matlab 编解码_JPEG编码解码(Matlab)
- 安卓设置EditText回车不换行
- 优美抒情钢琴曲《kiss the rain》