引言
本项目设计了一个基于STM32的智能鱼缸自动喂食系统,能够按照预设的时间间隔自动投放饲料,同时监测鱼缸内的水温和光照情况。该系统通过电机控制喂食器的旋转来实现饲料投放,用户还可以通过按键实现手动喂食。该项目展示了STM32在定时控制、传感器监测和电机驱动中的应用。
环境准备
1. 硬件设备
- STM32F103C8T6 开发板(或其他 STM32 系列)
- 步进电机(用于驱动饲料盒旋转)
- 步进电机驱动模块(如 ULN2003)
- DS18B20 水温传感器
- 光敏电阻(用于检测光照强度)
- 按键(用于手动喂食控制)
- OLED 显示屏(用于显示状态)
- 面包板和杜邦线
- USB-TTL 串口调试工具
2. 软件工具
- STM32CubeMX:用于初始化 STM32 外设。
- Keil uVision 或 STM32CubeIDE:用于编写和下载代码。
- ST-Link 驱动程序:用于下载程序到 STM32。
项目实现
1. 硬件连接
- 步进电机连接:将步进电机的四个线圈引脚连接到 ULN2003 驱动模块的输入端,驱动模块的输出端连接 STM32 的 GPIO(如 PA0, PA1, PA2, PA3)。
- 水温传感器连接:将 DS18B20 的数据引脚连接到 STM32 的 GPIO(如 PA4),并接一个4.7kΩ上拉电阻。
- 光敏电阻连接:将光敏电阻的输出引脚连接到 STM32 的 ADC 引脚(如 PA5),用于检测光照强度。
- 按键连接:将按键连接到 STM32 的 GPIO(如 PA6),用于手动触发喂食。
- OLED 显示屏连接:将 OLED 的 SDA 和 SCL 引脚连接到 STM32 的 I2C 接口(如 PB6 和 PB7),用于显示水温、光照和系统状态。
2. STM32CubeMX 配置
- 打开 STM32CubeMX,选择你的开发板型号。
- 配置系统时钟为 HSI,确保系统稳定运行。
- 配置 GPIO 引脚用于步进电机驱动和按键控制。
- 配置 ADC 用于读取光敏电阻数据。
- 配置 I2C 用于 OLED 显示屏通信。
- 配置定时器用于定时喂食功能。
- 生成代码,选择 Keil 或 STM32CubeIDE 作为工具链。
3. 编写主程序
在生成的项目基础上,编写水温监测、光照强度检测、定时喂食控制以及步进电机驱动的代码。以下是智能鱼缸自动喂食系统的基本代码示例:
#include "stm32f1xx_hal.h"
#include "ds18b20.h"
#include "oled.h"
#include "stepper.h"
// 喂食时间间隔(单位:秒)
#define FEED_INTERVAL 3600 // 每小时喂食一次
// 定义引脚
#define BUTTON_PIN GPIO_PIN_6
#define BUTTON_PORT GPIOA
// 函数声明
void Feed_Fish(void);
uint8_t Check_Button(void);
uint32_t Measure_LightIntensity(void);
void Display_Status(float temperature, uint32_t light_intensity, uint8_t feeding);
void System_Init(void);
// 初始化系统
void System_Init(void)
{
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_ADC1_Init();
MX_I2C1_Init();
OLED_Init();
Stepper_Init();
DS18B20_Init();
OLED_ShowString(0, 0, "Fish Feeder Ready");
}
// 鱼缸喂食
void Feed_Fish(void)
{
OLED_ShowString(0, 1, "Feeding...");
// 控制步进电机旋转一圈投放饲料
Stepper_Step(2048); // 步进电机旋转2048步,相当于一圈
OLED_ShowString(0, 1, "Feeding Done ");
}
// 检查按键输入(手动喂食)
uint8_t Check_Button(void)
{
return HAL_GPIO_ReadPin(BUTTON_PORT, BUTTON_PIN) == GPIO_PIN_RESET;
}
// 读取光照强度
uint32_t Measure_LightIntensity(void)
{
uint32_t light_value = 0;
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK)
{
light_value = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
return light_value;
}
// 显示当前系统状态
void Display_Status(float temperature, uint32_t light_intensity, uint8_t feeding)
{
OLED_Clear();
OLED_ShowString(0, 0, "Temp:");
OLED_ShowFloat(48, 0, temperature, 1);
OLED_ShowString(0, 1, "Light:");
OLED_ShowNumber(48, 1, light_intensity, 4);
if (feeding)
{
OLED_ShowString(0, 2, "Feeding: Yes");
}
else
{
OLED_ShowString(0, 2, "Feeding: No ");
}
}
int main(void)
{
System_Init();
uint32_t last_feed_time = 0;
uint32_t current_time = 0;
while (1)
{
// 读取当前时间
current_time = HAL_GetTick();
// 读取水温
float temperature = DS18B20_ReadTemperature();
// 读取光照强度
uint32_t light_intensity = Measure_LightIntensity();
// 显示当前系统状态
Display_Status(temperature, light_intensity, 0);
// 检查手动喂食按键
if (Check_Button())
{
Feed_Fish();
}
// 定时自动喂食
if (current_time - last_feed_time >= FEED_INTERVAL * 1000)
{
Feed_Fish();
last_feed_time = current_time;
}
HAL_Delay(1000); // 每秒更新一次状态
}
}
4. 水温传感器读取
以下是 DS18B20 水温传感器的读取代码示例:
#include "ds18b20.h"
// 初始化 DS18B20
void DS18B20_Init(void)
{
// 初始化 GPIO 和 DS18B20 引脚
}
// 读取水温
float DS18B20_ReadTemperature(void)
{
float temperature = 0.0;
// 模拟读取水温
temperature = 26.5; // 假设读取到26.5摄氏度
return temperature;
}
5. 光照强度检测
使用光敏电阻读取环境光照强度:
#include "adc.h"
// 读取光照强度
uint32_t Measure_LightIntensity(void)
{
uint32_t light_value = 0;
HAL_ADC_Start(&hadc1);
if (HAL_ADC_PollForConversion(&hadc1, HAL_MAX_DELAY) == HAL_OK)
{
light_value = HAL_ADC_GetValue(&hadc1);
}
HAL_ADC_Stop(&hadc1);
return light_value;
}
6. 步进电机控制喂食器
步进电机控制喂食器旋转投放饲料:
#include "stepper.h"
// 初始化步进电机
void Stepper_Init(void)
{
// GPIO 初始化和电机控制引脚配置
}
// 控制步进电机旋转
void Stepper_Step(uint16_t steps)
{
// 控制步进电机按指定步数旋转
for (uint16_t i = 0; i < steps; i++)
{
// 模拟步进电机每一步的控制
HAL_Delay(2); // 每一步延时
}
}
⬇帮大家整理了单片机的资料
包括stm32的项目合集【源码+开发文档】
点击下方蓝字即可领取,感谢支持!⬇
点击领取更多嵌入式详细资料
问题讨论,stm32的资料领取可以私信!
7. 自动喂食系统工作原理
- 定时喂食:系统通过内置的定时器,在预设的时间间隔内自动执行喂食操作,驱动步进电机旋转饲料盒。
- 手动喂食:用户可以通过按键实现手动喂食功能,方便即时投放饲料。