基于STM32的智能鱼缸设计
1. 前言
為了緩解學習、生活、工作帶來的壓力,提升生活品質,許多人喜歡在家中、辦公室等場所養魚。為節省魚友時間、勞力、增加養魚樂趣;為此,本文基于STM32單片機設計了一款智能魚缸。該魚缸可以實現水溫檢測、水質檢測、自動或手動換水、氛圍燈燈光變換和自動或手動喂食等功能為一體的控制系統,可通過控制鍵進行一鍵控制。
從功能上分析,需要用到的硬件如下:
(1)STM32系統板
(2)水溫溫度檢測傳感器: 測量水溫
(3)水質檢測傳感器: 測量水中的溶解性固體含量,反應水質。
(4)步進電機: 作為魚飼料投食器
(5)RGB氛圍燈: 采用RGB 3色燈,給魚缸照明。
(6)抽水電動馬達: 用來給魚缸充氧,換水,加水等。
水產養殖水質常規檢測的傳感器有哪些?水產養殖水質常規檢測的傳感器有水質ph傳感器、溶解氧傳感器和溫度傳感器。
(1)水質ph傳感器:
ph傳感器是高智能化在線連續監測儀,由傳感器和二次表兩部分組成??膳淙龔秃匣騼蓮秃想姌O,以滿足各種使用場所。配上純水和超純水電極,可適用于電導率小于3μs/cm的水質(如化學補給水、飽和蒸氣、凝結水等)的pH值測量。
(2)溶解氧傳感器:
氧氣的消耗量與存在的氧含量成正比,而氧是通過可透膜擴散進來的。傳感器與專門設計的監測溶氧的測量電路或電腦數據采集系統相連。 溶解氧傳感器能夠空氣校準,一般校準所需時間較長,在使用后要注意保養。如果在養殖水中工作時間過長,就必須定期地清洗膜,對其進行額外保養。
在很多水產養殖中,每天測幾次溶氧就可以了解溶氧情況。對池塘和許多水槽養殖系統。溶氧水平不會變化很快,池塘一般每天檢測2~3次。 對于較高密度養殖系統,增氧泵故障發生可能不到1h就會造成魚蝦等大面積死亡。這些密度高的養殖系統要求有足夠多的裝備或每小時多次自動測量溶氧。
(3)溫度傳感器:
溫度傳感器有多種結構,包括熱電偶、電阻溫度傳感器和熱敏電阻。熱電偶技術成熟,應用領域廣,貨源充足。選擇熱電偶必須滿足溫度范圍要求,且其材料與環境相容。 電阻溫度傳感器(RTDs)的原理為金屬的電阻隨溫度的改變而改變。大多電阻溫度傳感器(RTDs)由鉑、鎳或鎳合金制成,其線性度比熱電偶好,熱切更加穩定,但容易破碎。 熱敏電阻是電阻與溫度具有負相關關系的半導體。熱敏電阻比RTD和熱電偶更靈敏,也更容易破碎,不能承受大的溫差,但這一點在水產養殖中不成問題。
2. 硬件選型
2.1 STM32開發板
主控CPU采用STM32F103RCT6,這顆芯片包括48 KB SRAM、256 KB Flash、2個基本定時器、4個通用定時器、2個高級定時器、51個通用IO口、5個串口、2個DMA控制器、3個SPI、2個I2C、1個USB、1個CAN、3個12位ADC、1個12位DAC、1個SDIO接口,芯片屬于大容量類型,配置較高,整體符合硬件選型設計。當前選擇的這款開發板自帶了一個1.4寸的TFT-LCD彩屏,可以顯示當前傳感器數據以及一些運行狀態信息。
2.2 杜邦線
2.3 PCB板
2.4 步進電機
2.5 抽水馬達
2.6 水溫檢測傳感器
測溫采用DS18B20,DS18B20是常用的數字溫度傳感器,其輸出的是數字信號,具有體積小,硬件開銷低,抗干擾能力強,精度高的特點。
DS18B20數字溫度傳感器接線方便,封裝成后可應用于多種場合,如管道式,螺紋式,磁鐵吸附式,不銹鋼封裝式,型號多種多樣,有LTM8877,LTM8874等等。
主要根據應用場合的不同而改變其外觀。封裝后的DS18B20可用于電纜溝測溫,高爐水循環測溫,鍋爐測溫,機房測溫,農業大棚測溫,潔凈室測溫,彈藥庫測溫等各種非極限溫度場合。耐磨耐碰,體積小,使用方便,封裝形式多樣,適用于各種狹小空間設備數字測溫和控制領域。
2.7 水質檢測傳感器
TDS (Total Dissolved Solids)、中文名總溶解固體、又稱溶解性固體、又稱溶解性固體總量、表明1升水腫容有多少毫克溶解性固體、一般來說、TDS值越高、表示水中含有溶解物越多、水就越不潔凈、雖然在特定情況下TDS并不能有效反映水質的情況、但作為一種可快速檢測的參數、TDS目前還可以作為有效的在水質情況反映參數來作為參考。常用的TDS檢測設備為TDS筆、雖然價格低廉、簡單易用、但不能把數據傳給控制系統、做長時間的在線監測、并做水質狀況分析、使用專門的儀器、雖然能傳數據、精度也高、但價格很貴、為此這款TDS傳感器模塊、即插即用、使用簡單方便、測量用的激勵源采用交流信號、可有效防止探頭極化、延長探頭壽命的同時、也增加了輸出信號的穩定性、TDS探頭為防水探頭、可長期侵入水中測量、該產品可以應用于生活用水、水培等領域的水質檢測、有了這個傳感器、可輕松DIY–套TDS檢測儀了、輕松檢測水的潔凈程度。
溫度校正系數T修正計算公式如下:T修正=1+0.02*(T-25>其中T位正為溫度校正系數,T為待測溶液測量溫度。
注:
(1)TDS 的測量單位有時也用mg/L表示,與ppm 的換算關系為1mgL=1ppm;
(2)TDS 和電導率往往存在一種相通的關系,有時候TDS也可以用來表示電導率,兩者的關系: 1ppm =2uS/cm,中 uS/am為電導率的單位。
(3)國家標準GB5749-2006《生活飲用水衛生標準》中規定飲用自來水的TDS 有限量要求:溶解性總固體=1000ppm
校準方法
由于TDS探頭的個體差異或者未進行溫度補償等原因,會導致測量值有較大的誤差。因此,為獲得更精確的TDS 值,在測量之前,必須進行校準。另外,建議連接溫度傳感器,進行溫度補償,以提高測量精度。具體操作方法介紹如下。
第一步: 連接TDS探針與溫度傳感器;
第二步: 記錄標準TDS 溶液或用TDS筆測量待測溶液的TDS值,記錄為TDS標i準值o
第三步: 給TDS傳感器模塊供電,將TDS 探針和溫度傳感器放入TDS標準溶液或已知 TDS值的待測溶液中,測試傳感器模塊AO口輸出電壓值,記錄為V測s。測量當前測試溶液為值記錄為T 就t將測量得到電壓值V 測出和T測試代入TDS標準曲線公式和溫度修正系數計算公式。
3. STM32程序設計
3.1 硬件連線
硬件連接方式: 1. TFT 1.44 寸彩屏接線 GND 電源地 VCC 接5V或3.3v電源 SCL 接PC8(SCL) SDA 接PC9(SDA) RST 接PC10 DC 接PB7 CS 接PB8 BL 接PB112. 板載LED燈接線 LED1---PA8 LED2---PD23. 板載按鍵接線 K0---PA0 K1---PC5 K2---PA154. DS18B20溫度傳感器接線 DQ->PC6 + : 3.3V - : GND5. 步進電機 ULN2003控制28BYJ-48步進電機接線: ULN2003接線:IN-D: PB15 dIN-C: PB14 cIN-B: PB13 bIN-A: PB12 a + : 5V - : GND6. 抽水電機 GND---GND VCC---5V AO----PA47. 水質檢測傳感器 AO->PA1 + : 3.3V - : GND8. RGB燈 PC13--R PC14--G PC15--B3.2 硬件原理圖
3.3 漢字取模
3.3 程序下載
下載軟件在資料包里。點擊開始編程之后,點擊開發板的復位鍵即可下載程序進去。
3.4 mian.c代碼
需要完整代碼和資料包的可以去這里下載:https://download.csdn.net/download/xiaolong1126626497/85896081
#include "stm32f10x.h" #include "led.h" #include "delay.h" #include "key.h" #include "usart.h" #include <string.h> #include "timer.h" #include "oled.h" #include <string.h> #include <stdlib.h> #include "font.h" #include "motor.h" #include "ds18b20.h" #include "rtc.h" #include "adc.h"/**//* 函數功能: 更新時間框架顯示,在RTC中斷里調用 */ char TimeBuff[20]; void Update_FrameShow(void) {//繪制電子鐘時間Gui_DrawFont_GBK16(0,0,RED,0,(u8*)" "); sprintf(TimeBuff,"%d/%d/%d %d:%d:%d",rtc_clock.year,rtc_clock.mon,rtc_clock.day,rtc_clock.hour,rtc_clock.min,rtc_clock.sec);Gui_DrawFont_GBK16(0,0,RED,0,(u8*)TimeBuff); }//JTAG模式設置,用于設置JTAG的模式 //mode:jtag,swd模式設置;00,全使能;01,使能SWD;10,全關閉; #define JTAG_SWD_DISABLE 0X02 #define SWD_ENABLE 0X01 #define JTAG_SWD_ENABLE 0X00 void JTAG_Set(u8 mode) {u32 temp;temp=mode;temp<<=25;RCC->APB2ENR|=1<<0; //開啟輔助時鐘 AFIO->MAPR&=0XF8FFFFFF; //清除MAPR的[26:24]AFIO->MAPR|=temp; //設置jtag模式 }u16 DS18B20_data=0; //加熱芯的溫度 u16 DS18B20_temp; char data_buff[100]; u16 adc_data=0; //水質檢測int main1() {USART1_Init(115200); //串口1初始化-打印調試信息Moto_Init(); //步進電機初始化while(1){Motorcw_ring(1,300); //電機正轉1圈delay_ms(5000);printf("電機轉動...\r\n");} }int main() {u8 key=0;u32 time_cnt=0;u32 time_rgb=0;u32 time1=0; //定時換水u32 time2=0; //定時投喂食物JTAG_Set(JTAG_SWD_DISABLE); //釋放PA15LED_Init(); //LED燈初始化KEY_Init(); //按鍵初始化USART1_Init(115200); //串口1初始化-打印調試信息Lcd_Init(); //LCD初始化Lcd_Clear(0); //清屏為黑色LCD_LED_SET; //通過IO控制背光亮 DS18B20_Init(); //DA18B20溫度傳感器Moto_Init(); //步進電機初始化AdcInit(); //水質傳感器printf("DS18B20檢測:%d\r\n",DS18B20_Check());//實時水溫顯示LCD_ShowChineseFont(0,16*2,16,HZ_FONT_16[0],RED,0);LCD_ShowChineseFont(16,16*2,16,HZ_FONT_16[1],RED,0);LCD_ShowChineseFont(16*2,16*2,16,HZ_FONT_16[2],RED,0);LCD_ShowChineseFont(16*3,16*2,16,HZ_FONT_16[3],RED,0);//實時水質顯示LCD_ShowChineseFont(0,16*3,16,HZ_FONT_16[4],RED,0);LCD_ShowChineseFont(16,16*3,16,HZ_FONT_16[5],RED,0);LCD_ShowChineseFont(16*2,16*3,16,HZ_FONT_16[6],RED,0);LCD_ShowChineseFont(16*3,16*3,16,HZ_FONT_16[7],RED,0);printf("正在初始化RTC實時時鐘.\r\n");// RTC_Init();//RTC初始化,一定要初始化成功 while(1){//按鍵可以手動控制開啟窗簾和LED燈key=KEY_Scan();if(key){printf("key=%d\r\n",key);}//手動投喂食物if(key==2){printf("手動投喂食物.\r\n");LED2=0;Motorcw_ring(1,300); //電機正轉1圈LED2=1;} //手動換水if(key==1){printf("手動換水.\r\n");//抽水3秒MOTOR=1;delay_ms(3000);MOTOR=0;}//輪詢時間到達if(time_cnt>200){time_cnt=0;LED1=!LED1;//讀取加熱芯溫度DS18B20_temp=DS18B20_Read_Temp();printf("水溫:%d.%d\r\n",DS18B20_temp>>4,DS18B20_temp&0xF);sprintf(data_buff,"%d.%d",DS18B20_temp>>4,DS18B20_temp&0xF); //LCD屏實時顯示Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)" ");Gui_DrawFont_GBK16(72,16*2,RED,0,(u8*)data_buff);//水質檢測adc_data=GetAdcCHxDATA(1);sprintf(data_buff,"%d",adc_data);printf("水質質量:%s\r\n",data_buff);Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)" ");Gui_DrawFont_GBK16(72,16*3,RED,0,(u8*)data_buff); }DelayMs(10);time_cnt++;time2++;time1++;time_rgb++;if(time_rgb>=100 && time_rgb<=200){printf("模式1\r\n");RGB_R=1;RGB_G=0;RGB_B=0;}else if(time_rgb>=200 && time_rgb<=300){printf("模式2\r\n");RGB_R=0;RGB_G=1;RGB_B=0;}else if(time_rgb>=300 && time_rgb<=400){printf("模式3\r\n");RGB_R=0;RGB_G=0;RGB_B=1;}else if(time_rgb>=400){time_rgb=0;}//定時投喂食物//5個小時投喂一次if(time2>100*60*60*5){time2=0;Motorcw_ring(1,300); //電機正轉1圈}//定時換水,2天換一次水if(time1>100*60*60*24*2){time1=0;MOTOR=1;delay_ms(3000);MOTOR=0;}} }總結
以上是生活随笔為你收集整理的基于STM32的智能鱼缸设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内核系统架构介绍
- 下一篇: 手机是怎么确定位置信息的?