基于STM32F103C8单片机做一个自动宠物喂食器,主要特点可以在自动喂食模式下通过按键设置喂食时间,待喂食时间达到,驱动步进电机转动模拟喂食;其中自动模式下,还有个液位传感器能够检测水位,低于一定水位需要开启水泵加水,而压力传感器则检测食物重量,达到一定重量,要关闭电机。而手动喂食模式电机不转动。
额外功能:DS1302时钟模块显示实时时间,OLED显示。
OLED要显示中文,这需要用到取模软件,如下所示:
参数设置为:
这里晶振可以不画,仿真里面不影响
仿真里面没有液位传感器,这里用滑动变阻器代码,通过改变滑阻的阻值,输出不同的电压值来检测。而水泵的驱动则是NPN驱动继电器的电路,当PUMP为低电平时,继电器不闭合,水泵不工作,当PUMP为高电平时,继电器闭合,水泵工作。
这里的压力传感器用的是mpx4115,步进电机用ULN2003芯片驱动。
主控芯片:STM32F103C8
HICK:64MHZ
Systick: 1ms
测试Led:PC13
模拟wifi模块(Uart1):9600(PA9:tx1,PA10:rx1)
OLED显示屏:SCL(PB10),SDA(PB11)
液位传感器:FLUID(PA0)
压力传感器:STRESS(PA1)
水泵:PUMP(PB0)
时钟DS1302:
RST(PB7)
SCLK(PB5)
IO(PB6)
KEY按键:
KEY1(PA2)
KEY2(PA3)
KEY3(PA4)
KEY4(PA5)
KEY5(PA6)
KEY6(PA7)
KEY7(PA8)
MOTOR电机:
IN1(PB12)
IN2(PB13)
IN3(PB14)
IN4(PB15)
/* Includes ------------------------------------------------------------------*/ #include "Drv_UserSystem.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();OLED_Handel();//OLED显示}if (stSysTime.flg._100ms + BEST_MILLISECOND < Time_millis()) //100ms{stSysTime.flg._100ms = Time_millis();Receive_data_Handel();//数据接收判断Led_Flicker();//灯光闪烁 ADC_Scan();//液体/压力检测IWDG_ReloadCounter();//清开门狗}if (stSysTime.flg._1s + THOUSAND_MILLISECOND < Time_millis()) //1s{stSysTime.flg._1s = Time_millis(); Pet_feeding_countdown(); Read_RTC();//DS1302读取当前时间 } } }
123456789101112131415161718192021222324252627282930313233343536373839 4.3 OLED显示函数/******************************************************************************* * 函数名:OLED_Handel * 描述 :OLED显示 * 输入 :void * 输出 :void * 调用 :内部调用 * 备注 :50ms *******************************************************************************/ void OLED_Handel(void) { if(Display_interface == 0){if(Back_clear_flag){Back_clear_flag = 0;OLED_Clear();} OLED_ShowNum(1,1,Year,2);OLED_Show_Character(1,2,23,16);//年 OLED_ShowNum(1,5,Month,2);OLED_Show_Character(1,4,24,16);//月 OLED_ShowNum(1,9,Day,2);OLED_Show_Character(1,6,25,16);//日 OLED_ShowNum(2,1,Hour,2);OLED_Show_Character(2,2,26,16);//时 OLED_ShowNum(2,5,Minute,2);OLED_Show_Character(2,4,27,16);//分 OLED_ShowNum(2,9,Second,2);OLED_Show_Character(2,6,28,16);//秒OLED_Show_Character(3,1,29,16);//星OLED_Show_Character(3,2,30,16);//期 OLED_ShowNum(3,5,Week,1); } else if(Display_interface == 1){if(Back_clear_flag){Back_clear_flag = 0;OLED_Clear();}OLED_Show_Character(1,1,5,16);//模OLED_Show_Character(1,2,6,16);//式OLED_Show_Character(1,3,7,16);//选OLED_Show_Character(1,4,8,16);//择OLED_Show_Character(2,1,11,16);//喂OLED_Show_Character(2,2,12,16);//食OLED_Show_Character(2,3,13,16);//时OLED_Show_Character(2,4,14,16);//间 if(key_Line == 1) {if(clear_flag){clear_flag = 0;OLED_Part_Clear(2,13,16);} OLED_Show_Character(1,8,21,16);//← } else if(key_Line == 0) { if(clear_flag) {clear_flag = 0;OLED_Part_Clear(1,13,16); } OLED_Show_Character(2,8,21,16);//← }} else if(Display_interface == 2)//模式选择{if(Back_clear_flag){Back_clear_flag = 0;OLED_Clear();}OLED_Show_Character(1,1,19,16);//自OLED_Show_Character(1,2,20,16);//动OLED_Show_Character(1,3,17,16);//喂OLED_Show_Character(1,4,18,16);//食OLED_Show_Character(2,1,15,16);//手OLED_Show_Character(2,2,16,16);//动OLED_Show_Character(2,3,17,16);//喂OLED_Show_Character(2,4,18,16);//食 if(key_Line == 1) {if(clear_flag){clear_flag = 0;OLED_Part_Clear(2,13,16);}OLED_Show_Character(1,8,21,16);//← } else if(key_Line == 0) {if(clear_flag){clear_flag = 0;OLED_Part_Clear(1,13,16);}OLED_Show_Character(2,8,21,16);//← }} else if(Display_interface == 3)//喂食时间设置{if(Back_clear_flag){ Back_clear_flag = 0; OLED_Clear(); } OLED_ShowNum(2,3,Minute_tens,1); OLED_ShowNum(2,4,Minute_ones,1); OLED_ShowString(2,5,":");//: OLED_ShowNum(2,6,Second_tens,1); OLED_ShowNum(2,7,Second_ones,1); if(key_Column == 0) { if(clear_flag){clear_flag = 0;OLED_Part_Clear(3,1,16);} OLED_ShowString(3,7,"^");//^ } else if(key_Column == 1) {if(clear_flag){clear_flag = 0;OLED_Part_Clear(3,1,16);}OLED_ShowString(3,6,"^");//^ } else if(key_Column == 2) { if(clear_flag) {clear_flag = 0;OLED_Part_Clear(3,1,16); } OLED_ShowString(3,4,"^");//^ } else if(key_Column == 3) {if(clear_flag){clear_flag = 0;OLED_Part_Clear(3,1,16);} OLED_ShowString(3,3,"^");//^ } } }
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163 4.4 DS1302获取实时时间函数/******************************************************************************* * 函数名:Read_RTC * 描述 :读RTC * 输入 :void * 输出 :void * 调用 :内部调用 * 备注 : *******************************************************************************/ void Read_RTC(void) { static uint8_t time_count = 0; // 获取时间数据Second = Read_Clock(0X81); Minute = Read_Clock(0X83); Hour = Read_Clock(0X85); Day = Read_Clock(0X87); Month = Read_Clock(0X89); Week = Read_Clock(0X8B);Week = Week - 1; Year = Read_Clock(0X8D);if(++time_count > 2){time_count = 0;// 输出时间数据printf("时间:%d年%d月%d日 %d时%d分%d秒 星期%d rn", Year, Month, Day, Hour, Minute, Second, Week);} }
12345678910111213141516171819202122232425262728今天主要讲了基于STM32的自动宠物喂食器的Proteus仿真。
感谢你的观看!
相关知识
0525基于单片机的智能宠物喂食器Proteus仿真
基于STM32的智能宠物看护喂养系统(程序源码+原理图+PCB+Boom表+实物操作说明)
基于STM32的宠物远程投喂和监测系统设计
使用STM32实现简单的智能宠物喂食器
基于STM32的宠物远程投喂和监测系统设计 Design of Embedded Pet Remote Feeding and Monitoringsystem Based on STM32
智能喂食器的研究背景及意义
基于Proteus学习单片机系列(十)——LCD1602
基于stm32的远程监控喂食器
基于STM32设计的宠物投喂器
基于单片机的智能宠物喂食器设计
网址: 基于STM32的自动宠物喂食器的Proteus仿真 https://m.mcbbbk.com/newsview302397.html
上一篇: 自己在家也可以给宠物拍写真,效果 |
下一篇: 昆明萌宠派对盛宴 |