【stm32项目】基于stm32智能宠物喂养(完整工程资料源码)

基于STM32宠物喂养系统

前言:

随着人们生活幸福指数的提高,越来越多的家庭选择养宠物来为生活增添乐趣。然而,由于工作等原因,许多主人无法及时为宠物提供充足的食物与水。为了解决这一问题,我设计了一款便捷的宠物喂养设备。该设备采用STM32单片机为核心控制单元,通过电驱动模块、光电传感器模块、温度传感器模块以及超声波检测水位,实现给宠物定时定量喂食喂水的功能。

目录:

目录:

一、项目背景与目标

1.1 项目背景:

1.2 项目目标:

1.3 国内外研究现状:

1.3.1 国外研究现状:

1.3.2 国内研究现状:

1.4 发展趋势:

二、硬件电路设计

2.1 总体电路设计:

2.2 主控单元

2.2.1 STM32单片机

2.2.2 电路设计

2.3 供电模块

2.4 传感器模块

2.4.1 温湿度传感器(DHT11)

2.4.2 红外测温传感器(MLX90614)

2.4.3 有害气体传感器:

2.4.4 水位传感器:

2.4.5 压力传感器(HX711)

2.4.6整体模块功能连接 

2.5 显示模块

2.6 控制模块

2.6.1 继电器模块:

2.6.2 蜂鸣器:

2.6.3 LED指示灯:

2.7 用户输入模块

2.8 外设接口

2.8.1 RTC模块(DS1302):

2.8.2 语音模块:

2.9 电路连接示意

2.10 PCB设计

2.11 实物整体效果

三、软件设计

3.1 主要模块

3.2 功能说明

3.3 分析

3.4 main函数代码:

四、开发环境:

4.1 Keil uVision5 

4.2 Altium Designer

详细资料源码:毕设&课设&项目&竞赛-基于STM32宠物喂养系统(源码+PCB+论文+完整设计材料资料).zip_fbp项目资源-CSDN文库

总目录:

AD软件打开电路图 

KEIL软件打开代码 

 电路图

​ 模块资料       

​屏幕说明+实物照片

上位机软件 

元器件清单 

源代码 


一、项目背景与目标

1.1 项目背景:

随着社会的发展和人们生活水平的不断提高,宠物已经成为越来越多家庭生活中的重要成员。宠物不仅给人们带来了欢乐,也成为了家庭成员之一。然而,随着工作节奏的加快和生活压力的增大,许多宠物主人面临着无法随时照顾宠物的难题。尤其是对于定时定量喂食喂水这样的基本生活需求,许多主人往往因为忙碌而无法满足。

为了解决这一实际问题,提高宠物主人的生活质量,同时也确保宠物能够得到良好的照顾,我们团队设计并开发了一款基于STM32单片机的智能宠物喂养设备。该设备旨在通过创新的技术手段,实现宠物的自动喂养,减轻主人的负担,提高宠物的生活质量。让宠物主人即使在忙碌的工作日也能确保宠物得到及时和适量的喂养。通过科学合理的喂养,确保宠物健康成长,减少因饮食不当导致的问题。通过智能化的互动,增进宠物主人与宠物之间的情感联系。为宠物行业提供创新的解决方案,引领行业向更加智能化、个性化的方向发展。

1.2 项目目标:

  1. 自动化喂养:通过智能设备,实现宠物的定时定量喂食喂水,确保宠物在主人不在家时也能得到充足的营养和水分。

  2. 提高便利性:为宠物主人提供一种便捷的喂养解决方案,让他们能够更加轻松地管理宠物的日常饮食。

  3. 增强安全性:通过传感器模块实时监测宠物的饮食环境,如温度、水位等,确保宠物在健康的环境中生活。

  4. 远程监控:利用移动应用程序,让宠物主人可以远程控制设备,随时了解宠物的饮食状况。

  5. 节能环保:设计时考虑节能环保,减少能源消耗,符合可持续发展的理念。

通过这款智能宠物喂养设备,我们不仅致力于为宠物主人提供一种更加人性化的宠物照顾方式,设备的设计旨在模拟自然喂养环境,通过精准控制食物和水量的供给,确保宠物获得均衡的营养,从而提升它们的生活品质。通过设备提供的实时监控和互动功能,主人可以更加直观地感受到宠物的需求,增强主人与宠物之间的情感联系。

我们的设备代表了宠物行业智能化、自动化的一个新趋势,鼓励行业内的其他企业和技术人员探索更多的创新解决方案。通过设备收集的数据,宠物主人可以更好地了解宠物的饮食习惯和健康状况,及时调整喂养策略,预防潜在的健康问题。通过提供更加便捷和有效的喂养方式,我们希望能够减少因为主人无法照顾宠物而导致的弃养现象,为社会和谐做出贡献。

我们的设备采用了节能技术,鼓励宠物主人从日常生活中践行环保理念,减少资源浪费。通过参与宠物照顾设备的研发和推广,我们希望能够培养公众对宠物福利的关注,提高社会对动物保护的意识。我们的智能宠物喂养设备可以作为平台,连接更多的智能宠物产品和服务,共同构建一个完整的智能宠物生态系统。

图1-1 光多拉猫咪自动喂食器猫碗猫食盆饮水机狗吃饭喝水投食猫粮器宠物用品 

1.3 国内外研究现状:

1.3.1 国外研究现状:

  1. 技术领先:国外在智能宠物设备领域的研究起步较早,技术相对成熟。许多产品已经实现了高度自动化,如自动喂食器、自动饮水机等。

  2. 功能多样:国外的智能宠物喂养设备通常功能丰富,不仅包括自动喂食和饮水,还可能包括宠物健康监测、行为分析等。

  3. 品牌竞争激烈:国际上有多个知名品牌在智能宠物喂养设备市场占据领先地位,如PetSafe、Petronics等。

  4. 重视用户体验:国外研究注重用户体验,设备设计更加人性化,操作简单,便于宠物主人使用。

1.3.2 国内研究现状:

  1. 快速发展:近年来,随着国内宠物经济的兴起,智能宠物喂养设备市场迅速发展,吸引了众多企业和研究机构的关注。

  2. 技术创新:国内在智能宠物喂养设备技术上不断取得突破,如利用人工智能、物联网等技术提升设备的智能化水平。

  3. 市场潜力巨大:由于国内宠物数量庞大,宠物主人的消费能力不断提升,智能宠物喂养设备市场潜力巨大。

  4. 政策支持:政府出台了一系列政策支持宠物产业发展,为智能宠物喂养设备的发展提供了良好的外部环境。

  5. 关注健康与安全:国内研究更加关注宠物的健康和安全,设备在设计和制造过程中更加注重宠物福利。

国内外在智能宠物喂养设备的研究上各有侧重,国外更注重技术的成熟和功能的多样性,而国内则更注重技术创新和市场拓展。随着技术的不断进步和市场需求的增长,智能宠物喂养设备有望在未来得到更广泛的应用和发展。

1.4 发展趋势:

随着人工智能、机器学习等技术的进步,智能宠物喂养设备将更加智能化。未来设备将能够通过学习宠物的饮食习惯和生活规律,自动调整喂食量和时间,甚至能够识别宠物的情绪变化,做出相应的调整。智能宠物喂养设备将集健康监测功能于一体,通过内置的传感器监测宠物的体重、饮食、运动等数据,结合大数据分析,为宠物提供个性化的健康管理建议。随着物联网技术的发展,智能宠物喂养设备将实现与移动设备的无缝连接,宠物主人可以通过手机APP远程控制喂食、喂水,实时查看宠物的健康状况,甚至进行视频通话。

未来的智能宠物喂养设备将提供更加个性化的服务。用户可以根据宠物的种类、年龄、体重等特征,自定义喂养计划,满足不同宠物的特殊需求。环保理念将贯穿智能宠物喂养设备的研发和生产过程。设备将采用更加节能的材料和设计,减少能源消耗,同时确保产品的可回收性和环保性。智能宠物喂养设备将不再局限于喂食和饮水功能,可能会集成宠物玩具、温度控制、空气净化等功能,打造一个完整的宠物生活解决方案。

用户体验将是产品设计的重要考虑因素。未来设备将更加注重人机交互界面设计,提供更加直观、易用的操作体验。随着数据收集和分析的增多,智能宠物喂养设备将面临数据安全和隐私保护的问题。因此,设备将需要更加严格的数据加密和安全措施,确保用户数据的安全。随着技术的成熟和规模化生产,智能宠物喂养设备的成本有望降低,使其更加普及,更多家庭能够负担得起。随着行业的快速发展,智能宠物喂养设备将需要更多的行业标准与认证,以确保产品的质量和安全性。智能宠物喂养设备的发展趋势将是多方面的,从技术创新到用户体验,都将朝着更加智能化、个性化和人性化的方向发展。
 

二、硬件电路设计

2.1 总体电路设计:

本方案旨在设计一款智能宠物喂养设备,核心由STM32单片机作为主控单元,负责处理所有传感器数据、执行控制逻辑以及与用户界面交互。供电模块采用稳压的DC-DC转换器,以保障STM32和其他外设所需的电压(如3.3V、5V等),并结合锂电池供电方案以实现高效能和便携性。传感器模块包括DHT11温湿度传感器、红外测温传感器(MLX90614)、有害气体传感器(MQ系列)、水位传感器(超声波或电阻式)和压力传感器(HX711),它们通过GPIO、ADC或I2C接口与STM32连接,实时采集环境数据。

显示模块使用OLED显示屏,通过I2C或SPI接口与STM32连接,展示温湿度、重量和水位等信息。控制模块包括继电器模块用于控制水泵开关,蜂鸣器发出警报音,LED指示灯用于状态指示,全部通过GPIO控制。用户输入模块由按键组成,用户可通过按键设置时间和喂养参数,连接至GPIO引脚,采用简单的按键扫描方式。外设接口包括RTC模块(DS1302)用于实时时间跟踪,采用SPI接口与STM32连接,以及音乐模块,通过PWM或DAC输出连接至STM32。电路连接示意中,STM32的GPIO引脚连接各类传感器、继电器、蜂鸣器、LED和按键,同时ADC引脚连接有害气体和水位传感器的模拟输出,I2C/SPI引脚连接OLED显示屏和红外测温传感器以及RTC模块。

在PCB设计中,需要合理布局电路以确保信号完整性,减少干扰,电源线和信号线应分开,并使用适当的去耦电容来减少电源噪声。最后,在设计完成后进行调试与测试,以确保各个模块正常工作,数据采集准确,控制响应及时。

图2-1 整体电路图设计 

2.2 主控单元

2.2.1 STM32单片机

STM32单片机在智能宠物喂养设备中担任核心控制器的角色。它负责实时处理来自各类传感器的数据,执行相应的控制逻辑,并与用户界面进行交互。STM32的多种接口(如GPIO、ADC、I2C、SPI等)使其能够灵活地连接温湿度传感器、红外测温传感器、水位传感器等外设,确保系统能够准确获取环境信息。此外,STM32还能够根据传感器的数据做出及时反应,如控制水泵的开关、发出警报信号以及更新OLED显示屏的信息。这种高效的处理能力和灵活的接口设计,使得STM32单片机成为智能宠物喂养设备的理想选择。

图2-2 STM32F103C8T6 实物图

2.2.2 电路设计

在智能宠物喂养设备中,主控芯片STM32的接线设计至关重要,确保各个模块能够有效地连接和通信。温湿度传感器(DHT11)数据引脚连接至STM32的任意GPIO引脚,例如PA0。VCC和GND引脚分别连接至电源和地。红外测温传感器(MLX90614)SDA(数据线)连接至STM32的I2C引脚(如PB7),SCL(时钟线)连接至STM32的I2C引脚(如PB6),VCC和GND连接至电源和地。有害气体传感器(MQ系列)模拟输出引脚连接至STM32的ADC引脚(如PA1)。VCC和GND连接至电源和地。

水位传感器模拟输出引脚连接至STM32的ADC引脚(如PA2),VCC和GND连接至电源和地,压力传感器(HX711),数据引脚(DT)连接至STM32的GPIO引脚(如PB0),时钟引脚(SCK)连接至STM32的GPIO引脚(如PB1),VCC和GND连接至电源和地。显示模块的连接OLED显示屏,SDA连接至STM32的I2C引脚(如PB7),SCL连接至STM32的I2C引脚(如PB6),VCC和GND连接至电源和地,控制模块的连接,继电器模块控制引脚连接至STM32的GPIO引脚(如PB2),用于控制水泵的开关。VCC和GND连接至电源和地。蜂鸣器连接至STM32的GPIO引脚(如PB3),用于发出警报音。VCC和GND连接至电源和地。

LED指示灯连接至STM32的GPIO引脚(如PB4),用于状态指示。VCC和GND连接至电源和地,用户输入模块的连接,按键模块按键引脚连接至STM32的GPIO引脚(如PA3、PA4、PA5、PA6),用于用户输入。VCC和GND连接至电源和地。外设接口的连接RTC模块(DS1302)数据引脚连接至STM32的任意GPIO引脚(如PB5)。CLK引脚连接至STM32的GPIO引脚(如PB5)。VCC和GND连接至电源和地。音乐模块连接至STM32的PWM引脚(如PA7)或DAC引脚(如PA8)。

电源所有模块的VCC引脚应连接至5V或3.3V的电源,GND引脚应接至公共地。考虑在电源线上添加去耦电容,以减少电源噪声对系统的影响。在设计PCB时,确保信号线与电源线分开布置,以降低干扰,适当使用接地平面,减少噪声和电磁干扰。通过上述接线设计,STM32能够有效地与各个传感器和控制模块进行交互,确保智能宠物喂养设备正常工作。

模块名称 STM32连接引脚 功能说明 供电要求
温湿度传感器(DHT11) PA0 读取环境温度和湿度 VCC: 5V, GND: 0V
红外测温传感器(MLX90614) PB6 (SCL), PB7 (SDA) 远程测量物体温度 VCC: 3.3V, GND: 0V
有害气体传感器(MQ系列) PA1 (ADC) 检测空气中有害气体浓度 VCC: 5V, GND: 0V
水位传感器 PA2 (ADC) 检测水位高度 VCC: 5V, GND: 0V
HX711压力传感器 PB0 (DT), PB1 (SCK) 读取物体重量 VCC: 5V, GND: 0V
OLED显示屏 PB6 (SCL), PB7 (SDA) 显示温度、湿度、时间等信息 VCC: 3.3V, GND: 0V
继电器模块 PB2 控制水泵的开关 VCC: 5V, GND: 0V
蜂鸣器 PB3 发出声音警报 VCC: 5V, GND: 0V
LED指示灯 PB4 状态指示灯 VCC: 5V, GND: 0V
按键模块 PA3, PA4, PA5, PA6 用户输入按钮 VCC: 5V, GND: 0V
RTC模块(DS1302) PB5 实时时钟显示 VCC: 3.3V, GND: 0V
音乐模块 PA7 (PWM) 播放音乐 VCC: 5V, GND: 0V

图2-3 电路图设计 

2.3 供电模块

  • 电源管理:设计稳定的电源模块,通常采用DC-DC转换器,以保证STM32和其他外设所需的电压(如3.3V、5V等)。可以使用锂电池供电,并结合充电电路。
  • 电源管理:设计稳定的电源模块,通常采用DC-DC转换器,以保证STM32和其他外设所需的电压(如3.3V、5V等)。可以使用锂电池供电,并结合充电电路。

图2-4 稳压电路实物图 

 

2.4 传感器模块

2.4.1 温湿度传感器(DHT11)

温湿度传感器(DHT11)用于监测环境的温度和湿度。以下是该传感器的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
温湿度传感器(DHT11) 监测环境温度和湿度 GPIO数字信号 PA0

详细说明

  • 功能:DHT11传感器能够提供环境的温度和湿度信息,适用于气候监测和室内环境控制等应用。
  • 连接方式:DHT11通过单根数据线与STM32进行通信,使用GPIO引脚读取传感器输出的数据。
  • 连接至STM32引脚:建议将DHT11的数据引脚连接至STM32的PA0引脚。同时,确保VCC和GND引脚正确连接至电源和地。

额外注意事项

  • 在使用DHT11时,建议在数据引脚和STM32引脚之间添加一个4.7kΩ的上拉电阻,以确保数据传输的稳定性。
  • DHT11的测量范围和精度:
    • 温度范围:0°C to 50°C,精度±2°C。
    • 湿度范围:20% to 80% RH,精度±5% RH。

这个信息可以帮助您更好地理解DHT11传感器的功能及其在智能宠物喂养设备中的应用。

图2-5 DHT11温湿度传感器实物图

图2-6 电路图设计

2.4.2 红外测温传感器(MLX90614)

红外测温传感器(MLX90614)用于非接触式温度测量。以下是该传感器的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
红外测温传感器(MLX90614) 非接触式测量物体温度 I2C通信接口 PB6 (SCL), PB7 (SDA)

详细说明

  • 功能:MLX90614能够以非接触的方式测量目标物体的温度,非常适合用于宠物体温监测、工业温度检测及其他需要非接触测温的应用。
  • 连接方式:该传感器通过I2C通信接口与STM32进行连接,使用两根线(SCL和SDA)进行数据传输。
  • 连接至STM32引脚
    • SCL(时钟线)连接至STM32的PB6引脚。
    • SDA(数据线)连接至STM32的PB7引脚。

额外注意事项

  • 确保在I2C总线上添加适当的上拉电阻(通常为4.7kΩ)以确保信号稳定。
  • MLX90614的工作电压通常为3.0V至3.6V,确保供电符合要求。

图2-7 MLX90614实物图

图2-8 MLX90614电路设计图 

2.4.3 有害气体传感器

有害气体传感器(如MQ系列传感器)用于检测空气中有害气体的浓度。以下是该传感器的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
有害气体传感器(MQ系列) 检测空气中有害气体浓度 模拟信号输出 PA1 (ADC)

详细说明

  • 功能:MQ系列传感器能够检测多种有害气体的浓度,如甲烷(CH4)、一氧化碳(CO)、氨气(NH3)等,适用于空气质量监测和安全检测等应用。
  • 连接方式:传感器通过模拟信号输出将气体浓度信息发送至STM32,STM32通过ADC(模拟数字转换器)引脚读取这些值。
  • 连接至STM32引脚
    • 将MQ传感器的模拟输出引脚连接至STM32的PA1引脚,用于ADC读取气体浓度。

额外注意事项

  • 在使用MQ系列传感器时,通常需要一个适当的电源和负载电阻以确保传感器的正常工作。
  • 传感器的校准是非常重要的,确保在使用之前进行适当的测试和校准,以提高检测的准确性。

图2-9 MQ 烟雾传感器实物图

2.10  MQ 烟雾传感器电路图

2.4.4 水位传感器

水位传感器可以采用超声波传感器或电阻式水位传感器,用于监测水体的水位。以下是水位传感器的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
超声波水位传感器(如HC-SR04) 通过超声波测量水位 数字信号输出 PA2 (Trig), PA3 (Echo)
电阻式水位传感器 通过电阻变化测量水位 模拟信号输出 PA4 (ADC)

详细说明

1. 超声波水位传感器(HC-SR04)

  • 功能:通过发射超声波并测量回波时间来计算水位,适用于水池、鱼缸等多种场景的水位检测。
  • 连接方式
    • Trig引脚用于触发超声波发射,连接至STM32的PA2引脚。
    • Echo引脚用于接收回波信号,连接至STM32的PA3引脚。

 

图2-11 HC-SR04 实物图

2. 电阻式水位传感器

  • 功能:通过浸入水中电阻的变化来检测水位,适用于简单的水位监测。
  • 连接方式:传感器的输出为模拟信号,连接至STM32的PA4引脚,用于ADC读取水位。

额外注意事项

  • 对于超声波传感器,确保传感器与水面保持适当距离,避免干扰。
  • 电阻式水位传感器应确保材料耐腐蚀,以适应水环境。
  • 校准传感器以确保测量准确性。

图 2.12 水位传感器实物图

2.4.5 压力传感器(HX711)

压力传感器(HX711)常用于重量测量,尤其是在与称重传感器(如应变片)结合使用时。以下是HX711模块的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
压力传感器(HX711) 用于测量重量 数字信号输出 SCK, DT

详细说明

  • 功能:HX711模块用于将称重传感器的模拟信号转换为数字信号,适合用于秤、天平等重量测量应用。
  • 连接方式:HX711模块通过数字信号与STM32进行连接,通常使用两个引脚。
  • 连接至STM32引脚
    • SCK(时钟引脚)连接至STM32的某个数字引脚(例如PA5)。
    • DT(数据引脚)连接至STM32的另一个数字引脚(例如PA6)。

额外注意事项

  • 确保HX711模块的供电电压符合规格(通常为2.7V至5.5V),以避免损坏。
  • 使用适当的库(如HX711库)进行数据采集和处理,以简化编程过程。
  • 对于称重传感器,使用前需进行校准,以确保测量的准确性。

 

 图2.13 HX711压力传感器实物图

图 2.14 HX711压力传感器电路图

2.4.6整体模块功能连接 

传感器名称 功能 连接方式 连接至STM32引脚
温湿度传感器(DHT11) 监测环境温度和湿度 GPIO数字信号 PA0
红外测温传感器(MLX90614) 非接触式温度测量 I2C通信接口 PB6 (SCL), PB7 (SDA)
有害气体传感器(MQ系列) 检测空气中有害气体浓度 模拟信号 PA1 (ADC)
水位传感器 检测水位高度(超声波或电阻式) 模拟信号 PA2 (ADC)
压力传感器(HX711) 测量物体重量 数字信号 PB0 (DT), PB1 (SCK)

功能:描述每个传感器的主要用途。

连接方式:传感器如何与STM32进行连接。

连接至STM32引脚:指定传感器连接到STM32开发板上的具体引脚。

2.5 显示模块

OLED显示屏: 

OLED显示屏是一种常用的显示设备,能够以高对比度和低功耗的方式显示各种信息。以下是OLED显示屏的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
OLED显示屏 显示温湿度、重量、水位等信息 I2C或SPI接口 I2C: SDA, SCL(如PB7, PB6)<br>SPI: MOSI, SCK, CS(如PB5, PB3, PA4)

详细说明

  • 功能:OLED显示屏可以用于实时显示温度、湿度、重量、水位等信息,适合用于智能设备和物联网应用。
  • 连接方式
    • I2C接口:通常使用两根引脚连接:
      • SDA(数据线)连接至STM32的PB7引脚。
      • SCL(时钟线)连接至STM32的PB6引脚。
    • SPI接口:通常使用三根引脚连接:
      • MOSI(主设备输出,从设备输入)连接至STM32的PB5引脚。
      • SCK(时钟线)连接至STM32的PB3引脚。
      • CS(片选线)连接至STM32的PA4引脚。

注意事项

  • 选择I2C或SPI接口时,要确保相应的引脚配置和库的支持。
  • OLED显示屏通常需要一个适当的供电电压(例如3.3V或5V),应根据具体型号选择。
  • 在编程时,可以使用相关的库(如Adafruit SSD1306或U8g2)来简化显示内容的设置和更新。

2.6 控制模块

2.6.1 继电器模块

继电器模块是用于控制高功率设备(如水泵)的重要组件,可以通过微控制器的GPIO引脚来控制其开关状态。以下是继电器模块的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
继电器模块 控制水泵的开关 GPIO控制 任意GPIO引脚(如PA0)

详细说明

  • 功能:继电器模块通过继电器的开关动作来控制水泵的启动和停止,适用于自动化控制系统。
  • 连接方式
    • 继电器模块通常有一个控制引脚、供电引脚和公共接点。
    • 控制引脚连接至STM32的任意GPIO引脚(例如PA0)。
    • 供电引脚通常连接至VCC(一般为5V)。
    • GND引脚连接至地。

注意事项

  • 确保继电器的额定电流和电压满足所控制水泵的需求。
  • 在设计电路时,注意使用二极管(如1N4001)来防止反向电流对GPIO引脚造成损害,通常连接在继电器的线圈两端。
  • 在编程时,通过控制GPIO引脚的高低电平来实现继电器的开关控制,例如设置引脚为高电平以启动水泵,低电平以停止水泵。

图2.15 继电器传感器实物图

2.6.2 蜂鸣器

蜂鸣器是一种常用的声响设备,可用于发出警报音或提示音。以下是蜂鸣器的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
蜂鸣器 发出警报音或提示音 GPIO控制 任意GPIO引脚(如PA1)

详细说明

  • 功能:蜂鸣器可用于发出警报声,适用于通知、提醒或警示用户,例如在温湿度超标或水位异常时发出声音提示。
  • 连接方式
    • 蜂鸣器有两个引脚,通常是正极和负极。
    • 将正极连接至STM32的任意GPIO引脚(如PA1),负极连接至地(GND)。

额外注意事项

  • 在选择蜂鸣器时,可以选择主动蜂鸣器(内置振荡器)或被动蜂鸣器(需要外部信号驱动),根据应用需求进行选择。
  • 在编程时,通过控制GPIO引脚的高低电平来控制蜂鸣器的发声,例如将引脚设置为高电平以启用蜂鸣器,低电平以关闭蜂鸣器。
  • 可以使用PWM信号来控制被动蜂鸣器的音调和音量。

 

 图2.16 蜂鸣器传感器实物图

 图2.16 蜂鸣器电路图

2.6.3 LED指示灯

LED指示灯是一种常用的指示设备,用于显示设备的工作状态或其他信息。以下是LED指示灯的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
LED指示灯 状态指示(如电源状态、工作状态等) GPIO控制 任意GPIO引脚(如PA2)

详细说明

  • 功能:LED指示灯用于实时显示设备的状态,例如正常工作、故障或待机状态。不同的颜色或闪烁方式可以表示不同的状态。
  • 连接方式
    • LED指示灯通常有两个引脚:阳极(正极)和阴极(负极)。
    • 将阳极连接至STM32的任意GPIO引脚(如PA2),阴极连接至GND。
    • 为了保护LED,可以在阳极和GPIO引脚之间串联一个限流电阻,通常为220Ω至1kΩ之间的电阻值。

额外注意事项

  • 在编程时,通过控制GPIO引脚的高低电平来控制LED的开关。例如,将引脚设置为高电平以点亮LED,设置为低电平以熄灭LED。
  • 可以通过PWM信号调节LED的亮度,适用于需要显示不同亮度的应用场景。
  • 可以组合多个LED指示灯,使用不同的引脚以指示不同状态。

 

 图2.18 LED实物图 

 图2.18 LED电路图 

2.7 用户输入模块

按键模块

按键模块是用于用户交互的重要组件,允许用户输入设置,例如时间和喂养参数。以下是按键模块的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
按键模块 用户设置时间和喂养参数 GPIO控制(按键扫描) 任意GPIO引脚(如PA3)

详细说明

  • 功能:按键模块允许用户通过按下按钮来设置相关参数,例如喂养时间和数量。这对于用户友好的设备操作非常重要。
  • 连接方式
    • 按键模块通常有多个按键,每个按键可以连接至一个GPIO引脚。
    • 按键的一个引脚连接至STM32的GPIO引脚(如PA3),另一个引脚连接至GND。
    • 当按键被按下时,GPIO引脚将读到低电平(接地),否则为高电平(上拉)。

额外注意事项

  • 常用的按键扫描方式有两种:
    • 单按键扫描:读取单个按键的状态,适合简单应用。
    • 多按键扫描:通过矩阵方式连接多个按键,可以减少引脚使用,适合复杂设置。
  • 在编程时,需要实现按键去抖动算法,以确保按键的稳定读数,避免因抖动导致多个触发。
  • 可以使用上拉或下拉电阻来稳定按键输入,通常在STM32内置上拉电阻功能。

 图2.19 按键实物图

 

 图2.20 按键电路图

2.8 外设接口

2.8.1 RTC模块(DS1302):

RTC模块(DS1302)是一种实时时间跟踪模块,广泛用于需要时间记录的应用。以下是DS1302 RTC模块的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
DS1302 RTC模块 实时时间跟踪 SPI接口 任意GPIO引脚(如PB5, PB6, PB7, PA4)

详细说明

  • 功能:DS1302模块用于记录当前日期和时间,提供年、月、日、时、分、秒等信息。它适用于需要时间数据的应用,如定时喂养和事件记录。
  • 连接方式
    • DS1302模块通常有三个主要引脚用于SPI通信:SCLK(时钟)、IO(数据)、CE(片选)。
    • 将这些引脚连接至STM32的GPIO引脚,例如:
      • SCLK连接到PB5
      • IO连接到PB6
      • CE连接到PB7
      • 接地(GND)和电源(VCC)引脚需要连接到相应的电源和地。

额外注意事项

  • DS1302模块通常需要一个备用电池,以在断电时保持时间。
  • 在编程时,可以使用SPI协议与DS1302进行通信,通过发送和接收数据来读取和设置时间。
  • 确保在使用中实现时间读取和设置的逻辑,提供用户设置和读取当前时间的功能。

 

 图2.21 DS1302模块实物图 

图2.22 DS1302模块电路图

2.8.2 语音模块

语音模块是一种用于播放语音或音效的设备,广泛应用于各种交互式电子项目。以下是语音模块的详细信息,包括功能说明、连接方式以及与STM32的连接引脚。

传感器名称 功能 连接方式 连接至STM32引脚
语音模块 播放语音或音效 PWM输出或DAC输出 任意GPIO引脚(如PA0, PA1)

详细说明

  • 功能:语音模块可用于播放提示音、语音信息或音效,增强设备的交互性和用户体验。
  • 连接方式
    • 语音模块支持PWM(脉冲宽度调制)或DAC(数字-模拟转换器)输出。
    • 如果使用PWM输出,将语音模块的输入引脚连接至STM32的相应GPIO引脚(如PA0),确保PWM信号能够控制音量和音调。
    • 如果使用DAC输出,可以将DAC引脚直接连接至STM32的DAC引脚(如PA4),以输出高质量的音频信号。

额外注意事项

  • 在编程时,需设置适当的PWM频率以匹配语音模块的要求,或者配置DAC以输出正确的电压范围。
  • 根据所使用的语音模块,可能需要特定的音频格式(如WAV或MP3),确保准备的音频文件与模块兼容。
  • 可以通过外部放大器连接扬声器以提高音频输出的音量。

 

图2.23 DS1302模块实物图  

2.9 电路连接示意

GPIO引脚:STM32的GPIO引脚连接各类传感器、继电器、蜂鸣器、LED和按键。

ADC引脚:连接有害气体传感器和水位传感器的模拟输出。

I2C/SPI引脚:连接OLED显示屏和红外测温传感器、RTC模块。

2.10 PCB设计

PCB布局:在设计PCB时,需要合理布置电路,确保信号完整性,减少干扰。电源线和信号线应分开布局,并使用适当的去耦电容减少电源噪声。

图2.24 PCB—2D制版图

图2.24 PCB—3D制版图 

2.11 实物整体效果

 图2.26 实物整体图

 图2.26 显示屏参数图

三、软件设计

完整的嵌入式系统程序,主要用于智能宠物喂养设备的功能实现,涉及多个传感器、模块和控制机制。以下是对这段代码的分析,分为主要模块、功能说明和流程图示意。

3.1 主要模块

  1. 初始化模块

    初始化各个传感器和模块,如延时、LED、按键、温湿度传感器、红外测温仪、音频模块、继电器、水位传感器、HX711等。
  2. 时间管理

    使用DS1302模块读取和设置实时时间,通过OLED显示。
  3. 传感器读取

    从红外测温传感器读取温度、从有害气体传感器读取浓度、从DHT11读取温湿度、从HX711读取物品重量、从水位传感器读取水位高度。
  4. 用户输入

    通过按键模块调整时间设置,进行特定的操控(如启动或停止喂食装置)。
  5. 控制逻辑

    根据传感器数据和用户输入控制水泵和蜂鸣器、LED灯的状态、通过PWM控制模块转动喂食装置。
  6. 报警机制

    当传感器数据超出阈值时,触发声光报警。

3.2 功能说明

  • 时间设置:用户可以通过按键设置时间,OLED实时显示当前时间。
  • 传感器数据展示:实时显示温度、湿度、有害气体浓度、物品重量和水位。
  • 水泵控制:根据水位传感器的读数控制水泵的开关。
  • 喂食控制:根据物品重量和设定时间自动喂食。
  • 声光报警:根据温度、湿度或有害气体浓度触发报警器。

3.3 分析

集成了多种传感器和控制模块,以满足智能宠物喂养的需求。系统通过实时读取环境数据和用户输入,控制喂食装置和报警机制,确保设备的高效和安全运行。

3.4 main函数代码:

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "mlx90614.h"
#include "oled.h"
#include "lux.h"
#include "dht11.h"
#include "ds1302.h"
#include "HX711.h"
#include "timer.h"
#include "Relay.h"

u8  PPM,Temperature,HUM;
int shi=0,fen=0,miao=0;
int  jishu=0;
extern u8 Flag_Error ;
extern unsigned long	Weight_Shiwu;
unsigned short int ADValue;
float Voltage=0;
double high=0;

//转动90度
void  run()
{
    PWM2=2500;
    delay_ms(10);
}

//恢复原来的位置
void  stop()
{
    PWM2=1500;
    delay_ms(10);
}

int main(void)
{
    vu8 key=0;
    u8 time[15];
    u16 Integer,test_adc;
    float temp=0.0;
    char humidity;
    char temperature;
    int shiwu=0;
    delay_init();	    	 //延时函数初始化
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
    Timer_SRD_Init(20000-1,72-1);	   //定时器配置
    BEEP_Init();	//蜂鸣器初始化
    LED_Init();	   //LED灯初始化
    KEY_Init();   //按键初始化
    Adc1_Init();   //有害气体初始化
    SMBus_Init();  //红外测温初始化
    DHT11_Init();    //温湿度传感器初始化
    music_Init();   //音乐模块初始化
    Relay_Init();//继电器控制水泵

    OLED_Init();	 //显示屏模块初始化
    OLED_Clear();
    OLED_P6x8Str(0,0,"Temp:");
    OLED_P6x8Str(42,0,".");
    OLED_P6x8Str(62,0,"C");
    OLED_P6x8Str(0,1,"Harmful gas:");
    OLED_P6x8Str(0,2,"T:");
    OLED_P6x8Str(50,2,"H:");
    OLED_P6x8Str(0,6,"Weight:");
    OLED_P6x8Str(80,6,"g");
    OLED_F6x8Str1(75,4,shi,2);
    OLED_P6x8Str(87,4,":");
    OLED_F6x8Str1(93,4,fen,2);
    OLED_P6x8Str(105,4,":");
    OLED_F6x8Str1(111,4,miao,2);
    OLED_P6x8Str(0,7,"Water:");
    OLED_P6x8Str(80,7,"mm");

    InitioHX711();        //压力传感器初始化
    Get_Maopi();
    delay_ms( 100 );
    Get_Maopi();
    DS1302_Init();	 //时间模块初始化
    DS1302_Write_Time();	//写入时间函数

    while(1)
    {
        //得到实时时间
        DS1302_Get_Time(time);
        OLED_F6x8Str1(0,3,time[0],1);
        OLED_F6x8Str1(6,3,time[1],1);
        OLED_F6x8Str1(12,3,time[2],1);
        OLED_F6x8Str1(18,3,time[3],1);
        OLED_P6x8Str(24,3,"-");
        OLED_F6x8Str1(30,3,time[4],1);
        OLED_F6x8Str1(36,3,time[5],1);
        OLED_P6x8Str(42,3,"-");
        OLED_F6x8Str1(48,3,time[6],1);
        OLED_F6x8Str1(54,3,time[7],1);
        OLED_P6x8Str(60,3,"-");
        OLED_F6x8Str1(66,3,time[8],1);

        OLED_F6x8Str1(0,4,time[9],1);
        OLED_F6x8Str1(6,4,time[10],1);
        OLED_P6x8Str(12,4,":");
        OLED_F6x8Str1(18,4,time[11],1);
        OLED_F6x8Str1(24,4,time[12],1);
        OLED_P6x8Str(30,4,":");
        OLED_F6x8Str1(36,4,time[13],1);
        OLED_F6x8Str1(42,4,time[14],1);
        //按键函数
        key=KEY_Scan(1);
        if(key)
        {
            switch(key)
            {
            case 1:
                if(jishu>3)
                    jishu=1;
                else
                    jishu=jishu+1;
                if(jishu==1)
                {
                    OLED_P6x8Str(75,3,"-");
                    OLED_P6x8Str(110,3," ");
                }
                if(jishu==2)
                {
                    OLED_P6x8Str(93,3,"-");
                    OLED_P6x8Str(75,3," ");
                }
                if(jishu==3)
                {
                    OLED_P6x8Str(110,3,"-");
                    OLED_P6x8Str(93,3," ");
                }
                break;
            case 2:
                if(jishu==1)
                {
                    if(shi>=24)
                        shi=24;
                    else
                        shi=shi+1;
                    OLED_F6x8Str1(75,4,shi,2);
                }
                if(jishu==2)
                {
                    if(fen>=60)
                        fen=60;
                    else
                        fen=fen+1;
                    OLED_F6x8Str1(93,4,fen,2);
                }
                if(jishu==3)
                {
                    if(miao>=60)
                        miao=60;
                    else
                        miao=miao+1;
                    OLED_F6x8Str1(111,4,miao,2);
                }
                break;
            case 3:
                if(jishu==1)
                {
                    if(shi<=0)
                        shi=0;
                    else
                        shi=shi-1;
                    OLED_F6x8Str1(75,4,shi,2);
                }
                if(jishu==2)
                {
                    if(fen<=0)
                        fen=0;
                    else
                        fen=fen-1;
                    OLED_F6x8Str1(93,4,fen,2);
                }
                if(jishu==3)
                {
                    if(miao<=0)
                        miao=0;
                    else
                        miao=miao-1;
                    OLED_F6x8Str1(111,4,miao,2);
                }
                break;
            case 4:
                run();
                break;
            case 5:
                stop();
                break;
            }
        }

        //得到红外测温传感器测量的数据
        temp=SMBus_ReadTemp();
        Integer=temp;
        OLED_F6x8Str1(30,0,Integer,2);	  //红外测温数据的整数
        temp-=Integer;
        temp*=100;
        OLED_F6x8Str1(47,0,temp,2);	//红外测温数据的小数

        //有害气体浓度数据
        test_adc = Get_Adc_Average1(1,20);//读取通道1的AD值,读取20次的平均值
        PPM=test_adc*99/4096;
        PPM = PPM >= 99? 99: PPM;
        OLED_F6x8Str1(70,1,PPM,2);	  //红外测温数据的整数
				
				//水位传感器
        ADValue=Get_Adc_Average1(2,20);
        Voltage=(float)ADValue*3.3*10000/33/4095;
        high = (Voltage-20)/1.2 ;    //总量程是4cm
				if(high<0)
					OLED_F6x8Str1(50,7,0,4);
				else
					OLED_F6x8Str1(50,7,high/10,4);
				//开启水泵
				if(high<250)
        {
            Relay_ON();
            delay_ms(50
					0);
            Relay_OFF();
        }
				
        //读取空气中的温度、湿度
        DHT11_Read_Data(&Temperature,&HUM);//读取温湿度值
        OLED_F6x8Str1(15,2,Temperature,2);
        OLED_F6x8Str1(65,2,HUM,2);

        //HX711压力传感器
        Get_Weight();  //得到物体重量
        if ( Flag_Error == 0 )
        {
            shiwu = Weight_Shiwu / 1000;
        }
        else
        {
            shiwu=0;
        }
        OLED_F6x8Str1(50,6,shiwu,4);
				
        //声光报警
        if((PPM>65)||(Temperature>35)||(HUM>75)||(Integer>30))
        {
            BEEP=1;
            LED=0;
        }
        else
        {
            BEEP=0;
            LED=1;
        }
        //时间计算对比
        if((time[9]==(shi/10))&&(time[10]==(shi%10))&&(time[11]==(fen/10))&&(time[12]==(fen%10))
                &&(time[13]==(miao/10))&&(time[14]==(miao%10)))
        {
            MUSIC=0;
            delay_ms(1);
//						MUSIC=1;
            if((0<shiwu)&&(shiwu<=1000))
            {
                run();
                delay_ms(500);
                delay_ms(500);
                stop();
            }
            else if((1000<shiwu)&&(shiwu<=2500))
            {
                run();
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                stop();
            }
            else if((2500<shiwu)&&(shiwu<=4000))
            {
                run();
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                stop();
            }
            else if((4000<shiwu)&&(shiwu<=5000))
            {
                run();
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                delay_ms(500);
                stop();
            }
            else
            {
                MUSIC=1;
                delay_ms(1);
            }
        }
    }
}

四、开发环境:

4.1 Keil uVision5 

Keil uVision5 是一款广泛使用的集成开发环境(IDE),专门用于开发基于 ARM、Cortex-M、8051、C166 和其他微控制器的嵌入式系统。它由 Arm 公司提供,支持多种编程语言,主要是 C 和汇编语言。uVision5 提供了一整套的工具,包括代码编辑器、编译器、调试器以及项目管理工具,使开发者能够高效地进行嵌入式应用的开发。

uVision5 提供了直观易用的用户界面,使得项目创建和管理变得方便。支持语法高亮、代码完成、代码折叠等功能,提高了开发效率。内置 C/C++ 编译器,支持多种优化选项,生成高效的可执行代码。支持多种调试器,包括仿真器和硬件调试器,提供断点设置、变量监视、实时跟踪等功能,帮助开发者快速排查问题。

图4-1 Keil uVision5开发环境

允许用户轻松地管理多个项目,支持库文件和外部文件的引用。提供软件仿真功能,允许在没有实际硬件的情况下测试和调试代码。提供了大量的示例代码和驱动库,帮助用户快速启动项目。支持多种微控制器架构和系列,适合不同类型的嵌入式开发。

uVision5 可以从 Arm 官网下载并安装,支持 Windows 操作系统。用户在安装后可以通过创建新项目、选择目标设备、编写代码并进行编译和调试来开始开发。Keil uVision5 是一个功能强大、易于使用的嵌入式开发环境,适用于各种嵌入式项目的开发和调试,特别是对于 ARM 和 Cortex-M 系列微控制器的开发。

4.2 Altium Designer

Altium Designer 是一款领先的电子设计自动化(EDA)软件,广泛用于电路设计、PCB(印刷电路板)设计以及嵌入式系统的开发。它由 Altium 公司开发,提供了一整套强大的工具和功能,旨在提高电子设计工程师的生产力和效率。

Altium Designer 提供了一个统一的设计环境,集成了电路原理图设计、PCB 布局、仿真和文档生成等功能。直观的图形用户界面使得设计流程更加流畅,用户可以轻松访问各种工具和功能。支持层次化设计和大型项目管理,允许用户轻松创建复杂的电路原理图。提供先进的布局和路由工具,包括自动布线、规则检查和设计验证,确保PCB设计的高效和准确。

支持实时的3D视图,用户可以在设计阶段可视化PCB,检查元件布局和间距。集成了多种仿真工具,支持电路仿真、信号完整性分析和热分析等,帮助工程师优化设计。提供强大的元件库管理功能,用户可以轻松管理和创建元件库,确保设计的一致性和准确性。支持团队协作功能,允许多个工程师同时工作,并提供版本控制,以便于跟踪设计更改。能够自动生成生产所需的文件,如Gerber文件、组装图和BOM(物料清单),简化生产准备流程。

图4-2 Altium Designer开发环境 

Altium Designer 可以从 Altium 官方网站下载并安装,支持 Windows 操作系统。安装后,用户可以通过创建新项目、进行原理图设计、PCB 布局和仿真来开始使用。

Altium Designer 是一个功能全面且强大的电子设计工具,适合从初学者到专业工程师的各种用户。它通过提供集成的设计环境和强大的功能,帮助用户提高设计效率,确保产品的高质量和可靠性。

详细资料源码:毕设&课设&项目&竞赛-基于STM32宠物喂养系统(源码+PCB+论文+完整设计材料资料).zip_fbp项目资源-CSDN文库

总目录:

 

AD软件打开电路图 

KEIL软件打开代码 

 电路图

 模块资料       

 屏幕说明+实物照片

上位机软件 

元器件清单 

源代码 

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-21 04:06:02       51 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-21 04:06:02       54 阅读
  3. 在Django里面运行非项目文件

    2024-07-21 04:06:02       44 阅读
  4. Python语言-面向对象

    2024-07-21 04:06:02       55 阅读

热门阅读

  1. 7.20工作笔记7 写定时器+Post方式的问题

    2024-07-21 04:06:02       19 阅读
  2. 2024.7.20刷题记录

    2024-07-21 04:06:02       19 阅读
  3. 力扣题解(零钱兑换II)

    2024-07-21 04:06:02       17 阅读
  4. Python学习-九大数据类型整合,详细讲解

    2024-07-21 04:06:02       15 阅读
  5. web前端 Vue 框架面试120题(三)

    2024-07-21 04:06:02       16 阅读
  6. 【C++】位运算与相关算法问题

    2024-07-21 04:06:02       19 阅读
  7. Vue Router的路由正则表达式

    2024-07-21 04:06:02       15 阅读
  8. C++编程:实现一个跨平台安全的定时器Timer模块

    2024-07-21 04:06:02       19 阅读
  9. CSS中object-fit: cover;

    2024-07-21 04:06:02       17 阅读