引言
本项目设计了一个基于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. 自动喂食系统工作原理
- 定时喂食:系统通过内置的定时器,在预设的时间间隔内自动执行喂食操作,驱动步进电机旋转饲料盒。
- 手动喂食:用户可以通过按键实现手动喂食功能,方便即时投放饲料。