STM32项目分享:智能鱼缸/水族箱/水产养殖系统

描述

项目成品图片:


 

OLED

 


 

01

项目简介


 

1.功能详解


 

STM32智能鱼缸/水族箱/水产养殖系统

功能如下:


 

可检测温度,水位,以及TDS水质,同时将数据显示到OLED屏幕上

当温度过高时,继电器1吸合散热,温度过低时继电器2吸合加热。异常下蜂鸣器触发报警

当水位过低时,继电器3工作,模拟进水操作。当水位过高时继电器4工作放水。

当TDS水质过高时,继电器3和4相继工作模拟换水。

可计时喂食时间,倒计时结束后,舵机转动模拟喂食操作。

阈值可通过按键调节

连接手机APP,远程查看数据信息,控制LED开关,阈值调节等


 


 

2.材料清单

STM32F103C8T6单片机
 

OLED 屏幕
 

DS18B20温度传感器
 

ESP8266-01S  WiFi模块
 

TDS电导率传感器
 

超声波传感器
 

继电器
 

舵机
 

大功率LED灯模块
 

有源蜂鸣器


 


 

02


 

原理图设计


 

OLED


 

03


 

PCB硬件设计


 

   PCB图

OLEDOLED


 

04

程序设计


 

  •  

#include "stm32f10x.h"
#include "sys.h"#include "led.h"#include "bmp.h"#include "oled.h"#include "adc.h"#include "ds18b20.h"#include "timer.h"#include "delay.h"#include "usart.h"#include "usart2.h"#include "cJSON.h"#include "sr04.h"
int LED_STATUS = 0;int FAN_STATUS = 0;
char WIFIName[] = "ESP8266-WIFI";char WIFIpwd[] = "12345678";
int temp_up = 35,temp_down = 15;     // 温度上下限int tds_up = 90,tds_down = 0;      // 水质上下限int level_up = 5,level_down = 60;  // 水位上下限
int maxHighLevel = 5;                // 换水最高水位
int feedTime = 30;               // 喂食时间int cacheFeedTime = 30;          // 缓存喂食时间     int sendDataTime = 3;            // 数据发送时间int cacheSendTime = 3;           // 缓存数据发送时间

#define LED   PAout(2)     // LED#define BUZZ  PAout(4)     // 蜂鸣器
#define JD1PAout(8)     // 继电器1-抽水#define JD2   PAout(5)// 继电器2-放水#define JD3   PAout(6)// 继电器3-加热#define JD4   PAout(7)     // 继电器4-降温
#define KEY_EDIT PBin(13)   // 设置按钮#define KEY_NEXT PBin(14)  // 切换按钮#define KEY_SWIT PBin(15)  // 下一页按钮#define KEY_ADD  PAin(11)  // 加一按钮#define KEY_DEC  PBin(12)  // 减一按钮
#define TEST PCout(13)
#define SG90_CLOSE  175    // 舵机关闭#define SG90_OPEN   185    // 舵机打开
// 上位机数据处理int connectFlag = 0;       // 连接成功标志位int handleFlag = 0;        // 判断上位机发送的数据需要处理哪一个int sendFlag = 0;          // 定时器时间到了该位置一表示发送数据int initFlag = 0;          // ESP8266初始化成功标志位int paramFlag = 1;         // 是否开启参数检查int changeWaterFlag = 0;   // 换水标志位
int feedFlag = 0;          // 是否喂食int feedEndFlag = 0;       // 喂食结束

unsigned char temp = 0,level = 0; // 温度,湿度
void paramCheck( void );             // 检查参数是否超过void handleData( void );             // 上位机数据处理void co2Process(void);               // CO2数据处理void DisplayUI( void );              // 固定页面UI渲染void paramEdit( void );              // 阈值参数设置void editUiDisplay( int pageIndex ); // 设置页面UI初始化void runAlter(int cursor,int count); // 执行参数修改
extern char *USARTx_RX_BUF;         // 串口数据缓存extern float TDS_value;
int main(void){int time;delay_init();LED_Init();  OLED_Init();Adc_Init();DS18B20_Init();                  // 温度初始化HC_SR04Config();                  // 超声波初始化  uart_init(115200);  timeInit(4999,7199);              // 72M 0.1ms 500ms 串口数据初始化、timeSendInit(9999,7199);          // 72m 0.1ms 1s    发送数据定时  timePwmInit(199,7199);            // PWM-> CH3->PA2  CH4->PA3  (调脉宽)TIM_SetCompare4(TIM2,100);TIM_SetCompare4(TIM2,SG90_CLOSE); // 关闭喂食OLED_ShowChLength(38,16,47,3);    // 显示启动中ESP8266Init(WIFIName,WIFIpwd);OLED_Clear();while(1){DisplayUI();if( time++ > 5 ){time = 0;temp  =  getTemperture();           // 获取温度delay_ms(1000);delay_ms(1000);temp  =  getTemperture();           // 获取温度TDS_Value_Conversion();             // 获取TDS水质值}level =  Getlength();         // 获取水位OLED_ShowNum(45,0,temp,2,16,1);OLED_ShowNum(45,16,level,3,16,1);OLED_ShowNum(45,32,TDS_value,3,16,1);OLED_ShowNum(76,48,cacheFeedTime,3,16,1);OLED_Refresh();
// 开始喂食  if( feedFlag ){TIM_SetCompare4(TIM2,SG90_OPEN);// 等待喂食结束if( feedEndFlag ){feedFlag = 0;feedEndFlag = 0;  feedTime = cacheFeedTime;TIM_SetCompare4(TIM2,SG90_CLOSE);}}
    // 进入设置页面if( !KEY_EDIT ){      while( !KEY_EDIT ); // 防抖paramEdit();        // 进入参数设置// 刷新参数提示按钮(每次进入设置以后出来这个按钮没有,需要更新一下)if( !paramFlag ) OLED_ShowChLength(105,2,62,1);else OLED_ShowString(105,2,"  ",16,1);}
// 切换参数提醒设置if( !KEY_NEXT ){      while( !KEY_NEXT );paramFlag = !paramFlag;  if( !paramFlag ){   // 关闭提示JD2 = 0;JD3 = 0;JD4 = 0;JD1 = 0;BUZZ = 0;OLED_ShowChLength(105,2,62,1);}else{OLED_ShowString(105,2,"  ",16,1);}      OLED_Refresh();}
// 上位机更改数据if( handleFlag ) handleData();
// 3s上传一次数据if( sendFlag && 1){      ESP8266Pub(temp,level,TDS_value);sendFlag = 0;                 // 重置标志位sendDataTime = cacheSendTime; // 刷新发送时间}// 检查参数是否超出范围(开启了参数检查)if( paramFlag ) paramCheck();   
delay_ms(100);}}


 

05

实验效果


 

OLEDOLED

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分