項目成品圖片:
01
—
項目簡介
1.功能詳解
功能如下:
可檢測溫度,水位,以及TDS水質,同時將數據顯示到OLED屏幕上
當溫度過高時,繼電器1吸合散熱,溫度過低時繼電器2吸合加熱。異常下蜂鳴器觸發報警
當水位過低時,繼電器3工作,模擬進水操作。當水位過高時繼電器4工作放水。
當TDS水質過高時,繼電器3和4相繼工作模擬換水。
可計時喂食時間,倒計時結束后,舵機轉動模擬喂食操作。
閾值可通過按鍵調節
連接手機APP,遠程查看數據信息,控制LED開關,閾值調節等
2.材料清單
STM32F103C8T6單片機
OLED 屏幕
DS18B20溫度傳感器
ESP8266-01S WiFi模塊
TDS電導率傳感器
超聲波傳感器
繼電器
舵機
大功率LED燈模塊
有源蜂鳴器
02
—
原理圖設計
03
—
PCB硬件設計
PCB圖
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"
intLED_STATUS =0;intFAN_STATUS =0;
charWIFIName[] ="ESP8266-WIFI";charWIFIpwd[] ="12345678";
inttemp_up =35,temp_down =15; // 溫度上下限inttds_up =90,tds_down =0; // 水質上下限intlevel_up =5,level_down =60; // 水位上下限
intmaxHighLevel =5; // 換水最高水位
intfeedTime =30; // 喂食時間intcacheFeedTime =30; // 緩存喂食時間 intsendDataTime =3; // 數據發送時間intcacheSendTime =3; // 緩存數據發送時間
#defineLED PAout(2) // LED#defineBUZZ PAout(4) // 蜂鳴器
#defineJD1PAout(8) // 繼電器1-抽水#defineJD2 PAout(5)// 繼電器2-放水#defineJD3 PAout(6)// 繼電器3-加熱#defineJD4 PAout(7) // 繼電器4-降溫
#defineKEY_EDIT PBin(13) // 設置按鈕#defineKEY_NEXT PBin(14) // 切換按鈕#defineKEY_SWIT PBin(15) // 下一頁按鈕#defineKEY_ADD PAin(11) // 加一按鈕#defineKEY_DEC PBin(12) // 減一按鈕
#defineTEST PCout(13)
#defineSG90_CLOSE 175 // 舵機關閉#defineSG90_OPEN 185 // 舵機打開
// 上位機數據處理intconnectFlag =0; // 連接成功標志位inthandleFlag =0; // 判斷上位機發送的數據需要處理哪一個intsendFlag =0; // 定時器時間到了該位置一表示發送數據intinitFlag =0; // ESP8266初始化成功標志位intparamFlag =1; // 是否開啟參數檢查intchangeWaterFlag =0; // 換水標志位
intfeedFlag =0; // 是否喂食intfeedEndFlag =0; // 喂食結束
unsignedchartemp =0,level =0;// 溫度,濕度
voidparamCheck(void); // 檢查參數是否超過voidhandleData(void); // 上位機數據處理voidco2Process(void); // CO2數據處理voidDisplayUI(void); // 固定頁面UI渲染voidparamEdit(void); // 閾值參數設置voideditUiDisplay(intpageIndex );// 設置頁面UI初始化voidrunAlter(intcursor,intcount);// 執行參數修改
externchar*USARTx_RX_BUF; // 串口數據緩存externfloatTDS_value;
intmain(void){inttime;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);elseOLED_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
—
實驗效果
-
OLED
+關注
關注
119文章
6280瀏覽量
227786 -
STM32
+關注
關注
2292文章
11029瀏覽量
363910 -
養殖業
+關注
關注
0文章
88瀏覽量
1916
發布評論請先 登錄
基于單片機的智能水族箱控制系統設計
【云智易申請】基于stm32的智能水族箱
UVC-LED在水族箱中的應用
它憑什么號稱“世界上最先進的智能水族箱照明系統”?
自制簡易的水族箱溫控器

評論