久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2160|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

電賽 簡易智能液體容器制作 附TDS傳感器STM32單片機程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:1083442 發(fā)表于 2023-7-15 22:07 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
本設(shè)計以STM32F1單片機為控制核心,設(shè)計并制作了簡易多功能液體容器.設(shè)計主要包括單片機控制模塊、電源模塊、超聲波測距模塊、TDS傳感器模塊、壓力傳感器模塊、顯示模塊。該設(shè)計利用超聲波測量液體液位,壓力傳感器測量液體重量;TDS傳感器可檢測水中含有的溶解物,利用TDS值,可以區(qū)分不同濃度的鹽水、不同的液體種類。再由兩個OLED屏幕顯示液體液位、重量、濃度、種類等參數(shù)。經(jīng)測試,系統(tǒng)基本完成了要求。

一、系統(tǒng)方案
本系統(tǒng)主要由單片機控制模塊、電源模塊、超聲波測距模塊、TDS傳感器模塊、壓力傳感器模塊、顯示模塊組成。
1.1單片機控制模塊的論證與選擇
方案一:采用STC89C51單片機為主控芯片,單片機只有32個IO口、2個定時器和2個外部中斷,內(nèi)部RAM為128字節(jié),速度和性能比較低,功能較少,所需外圍電路較多,不考慮此方案。
方案二:采用STM32F103C8T6單片機作為控制芯片。由 ST 廠商推出的 STM32 系列單片機,功能強大,性價比高。STM32F103C8T6最小系統(tǒng)板集成了工作頻率為72 MHz的高性能ARM Cortex -M3 32位RISC內(nèi)核、高速嵌入式存儲器(最高128字節(jié)的閃存和最高20k字節(jié)的SRAM),以及連接到兩條APB總線的各種增強型I/o和外設(shè)。所有器件都提供兩個12位ADC、三個通用16位定時器和一個PWM定時器,以及標準和高級通信接口:最多兩個I2C和SPI、三個USARTs、一個USB和一個CAN。在可行性與精確度指標上比較過后,決定采用方案二。
1.2顯示模塊的論證與選擇
方案一:采用LCD1602顯示。LCD1602是字符型液晶,顯示字母和數(shù)字比較方便,控制簡單,成本較低。內(nèi)部含有日文平假名、英文字母、數(shù)字和一些常用符號字庫,沒有中文字庫。但可以自定義的顯示字符,只有兩行顯示。
方案二:采用OLED顯示。OLED即有機發(fā)光二極管,具有自發(fā)光,不需背光源、對比度高、厚度薄、視角廣、反應(yīng)速度快等優(yōu)點,與LCD1602相比,OLED引腳較少,只有4個引腳,使用簡單,方便。
在可行性上比較過后,決定采用方案二。
1.3測距模塊的論證與選擇
方案一:超聲波測距。本系統(tǒng)采用超聲波傳感器進行液位測距,超聲波具有易于定向發(fā)射、方向性好、強度易控制、與被測量物體不需要直接接觸的特點。超聲波對液體、固體的穿透本領(lǐng)很大,尤其是在不透明的固體中,超聲波碰到雜質(zhì)或分界面會產(chǎn)生顯著反射,形成反射回波使得超聲波測距有較高的準確性。
方案二:光電液位傳感器測距。光電傳感器內(nèi)部包含一個近紅外發(fā)光二極管和一個光敏接收器。發(fā)光二極管所發(fā)出的光被導(dǎo)入傳感器頂部的透鏡。當液體浸沒光電液位開關(guān)的透鏡時,則光折射到液體中,從而使接收器收不到或只能接收到少量光線。光電液位開關(guān)通過感應(yīng)這一變化,接收器可以驅(qū)動內(nèi)部的電氣開關(guān),從而啟動外部報警或控制電路。但光電液位傳感器需要接觸液體,容易受到環(huán)境損壞。
在可行性上比較過后,決定采用方案一。
1.4液體濃度和種類檢測的論證與選擇
方案一:TDS傳感器。TDS傳感器可準確測量水中含有的溶解物,水中含有的溶解物越多,TDS值越高。可利用TDS值區(qū)分鹽水濃度、不同液體的種類。TDS傳感器配合8 位高性價比單片機,內(nèi)部已做 AD采集,并通過算法計算出對應(yīng)的TDS值。
方案二::PH傳感器。PH傳感器可檢測溶液中的PH值,不同的PH值對應(yīng)不同的輸出信號。PH傳感器配合8位單片機處理器,通過此單片機的10位ADC對放大后的傳感器信號采樣,板載電位器調(diào)節(jié)輸出信號的量程,并通過最小二乘法軟件算法計算出信號與PH值得線性函數(shù)關(guān)系式,進而采用線性函數(shù)關(guān)系式求出信號對應(yīng)的PH值。但不同濃度的鹽水溶液中PH值差別不大,不能滿足要求。在可行性上比較過后,決定采用方案一。

制作出來的實物圖如下:


單片機源程序如下:
  1. #include "stm32f10x.h"
  2. #include <string.h>
  3. #include "delay.h"
  4. #include "stdio.h"
  5. #include "bsp_SysTick.h"
  6. #include "math.h"
  7. #include "Key.h"
  8. #include "OLED.h"
  9. #include "bsp_adc.h"
  10. #include "ds18b20.h"
  11. #include "timer.h"
  12. #include "bsp_usart1.h"
  13. #include "bsp_usart2.h"

  14.    
  15. volatile uint32_t time = 0; // ms 計時變量
  16. uint32_t a = 0;
  17. uint32_t b = 0;
  18. uint32_t sta= 0;
  19. ////定義變量

  20. GPIO_InitTypeDef  GPIO_InitStructure;
  21. unsigned char AD_CHANNEL=0;


  22. float TDS=0.0,TDS_voltage;
  23. float TDS_value=0.0,voltage_value;
  24. float compensationCoefficient=1.0;//溫度校準系數(shù)
  25. float compensationVolatge;
  26. float kValue=1.67;
  27. float TEMP_Value=0.0;
  28. float averageVoltage=0;
  29. //char  TEMP_Buff[5];   //溫度存放數(shù)組
  30. char  TDS_Buff[6];




  31. extern  u8 SET_Flag,SET_Count; //設(shè)置標志位
  32. extern u8 CLC_Flag; //清屏標志位
  33. extern u8 Warning_flag;
  34. u8 Warning_count=0;




  35. // ADC1轉(zhuǎn)換的電壓值通過MDA方式傳到SRAM
  36. extern __IO uint8_t ADC_ConvertedValue[4];

  37. // 用于保存轉(zhuǎn)換計算后的電壓值          
  38. float ADC_ConvertedValueLocal[4];




  39. void GPIO_Configuration(void)
  40. {
  41. //        GPIO_InitTypeDef GPIO_InitStructure;
  42.        
  43.         /* Enable the GPIO  Clock */                                                        
  44.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC| RCC_APB2Periph_AFIO,ENABLE);
  45.        
  46.         //GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable,ENABLE);                //屏蔽所有作為JTAG口的GPIO口
  47.         GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);                //屏蔽PB口上IO口JTAG功能


  48. }

  49. ///**************溫度采集函數(shù)***************/
  50. //void TEMP_Value_Conversion()
  51. //{
  52. //       
  53. //          TEMP_Value=DS18B20_Get_Temp();
  54. //       
  55. //          TEMP_Buff[0]=(int)(TEMP_Value)%1000/100+'0';       
  56. //          TEMP_Buff[1]=(int)(TEMP_Value)%100/10+'0';
  57. //          TEMP_Buff[2]='.';
  58. //          TEMP_Buff[3]=(int)(TEMP_Value)%10+'0';
  59. //}


  60. /**************TDS值采集函數(shù)***************/
  61. float TDS_Value_Conversion()
  62. {
  63.           u32 ad=0;
  64.           u8 i;

  65.           float compensationCoefficient;
  66.           float compensationVolatge;
  67.           float temperature=25.0;//假設(shè)溫度是25度,進行溫度補償,如果有18B20,則采集溫度后,更新這個溫度值
  68.           
  69.                
  70.           ad=0;
  71.           for(i=0;i<50;i++)//讀取50次的AD數(shù)值取其平均數(shù)較為準確       
  72.                 {
  73.                         ADC_SoftwareStartConvCmd(ADC1, ENABLE);
  74.                         while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));//轉(zhuǎn)換結(jié)束標志位
  75.                         ad=ad+ADC_GetConversionValue(ADC1);//返回最近一次ADCx規(guī)則組的轉(zhuǎn)換結(jié)果               
  76.                 }
  77.                 ad=ad/50;
  78.         //ADC_ConvertedValueLocal[0]=(float)ad/4096*3.3; //AD轉(zhuǎn)換
  79.          averageVoltage        =(float)ad/4096*3.3; //AD轉(zhuǎn)換
  80.                
  81.         // averageVoltage = getMedianNum(analogBufferTemp, SCOUNT) * (float)VREF / 1024.0; // read the analog value more stable by the median filtering algorithm, and convert to voltage value
  82.          compensationCoefficient = 1.0 + 0.02 * (temperature - 25.0); //temperature compensation formula: fFinalResult(25^C) = fFinalResult(current)/(1.0+0.02*(fTP-25.0));
  83.    compensationVolatge = averageVoltage / compensationCoefficient; //temperature compensation
  84.    TDS_value = (133.42 * compensationVolatge * compensationVolatge * compensationVolatge - 255.86 * compensationVolatge * compensationVolatge + 857.39 * compensationVolatge) * 0.5; //convert voltage value to tds value       
  85.                 
  86.                
  87.                
  88.                
  89.                
  90.        
  91.         /*顯示EC*/
  92.         TDS_Buff[0]=(int)(TDS_value)/1000+'0';
  93.         TDS_Buff[1]=(int)(TDS_value)%1000/100+'0';
  94.         TDS_Buff[2]=(int)(TDS_value*100)%100/10+'0';       
  95.         TDS_Buff[3]=(int)(TDS_value*100)%10+'0';

  96.         return TDS_value ;
  97. }
  98. ///*************數(shù)據(jù)顯示函數(shù)***************/
  99. //void Display_Data()
  100. //{
  101. //        //OLED_ShowStr(24,2,TEMP_Buff,2);//測試6*8字符
  102. //        //OLED_ShowStr(36,4,TDS_Buff,2);//測試6*8字符
  103. //}
  104.         float TDS_Bugg1[2];
  105.   uint8_t Num = 0;
  106.   uint32_t Num1=0;


  107. void text1()
  108. {       
  109.                                         a=0;
  110.                             delay_ms(100);
  111.                             TDS_Value_Conversion();//TDS
  112.                             delay_ms(100);
  113.                                         TDS_Bugg1[0]=TDS_Value_Conversion();
  114.                                         delay_ms(10);       
  115.           OLED_ShowNum(2,1,TDS_Bugg1[0],3);
  116. }

  117. void text2()
  118. {
  119.                                         a=1;
  120.                 delay_ms(100);
  121.                             TDS_Value_Conversion();//TDS
  122.                             delay_ms(100);
  123.                                         TDS_Bugg1[1]=TDS_Value_Conversion();
  124.                                         delay_ms(10);       
  125.           OLED_ShowNum(3,1,TDS_Bugg1[1],3);
  126.                 if( TDS_Bugg1[0] < TDS_Bugg1[1])
  127.                       {
  128.                               OLED_ShowString(1,5,"thick water");
  129.                                         }
  130.                                                 else       
  131.                                {
  132.                                 OLED_ShowString(2,5,"light water");
  133.                             
  134.               }
  135. }
  136. void text3()
  137. {
  138.                                                                 a=2;
  139.                       delay_ms(10);
  140.                                   TDS_Value_Conversion();//TDS
  141.                                   delay_ms(10);
  142.                                                                          OLED_ShowNum(4,1,TDS_Value_Conversion(),3);
  143.                                                                          if(TDS_Value_Conversion()>=686||TDS_Value_Conversion()<700)
  144.                                                                          {
  145.                                                                                   OLED_ShowString(3,5,"water");
  146.                                                                          }
  147. }



  148. /**
  149.   * @brief  主函數(shù)
  150.   * @param  無
  151.   * @retval 無
  152.   */
  153. int main(void)
  154. {         

  155.         GPIO_Configuration(); //IO口配置
  156.     /* 配置USART1 */
  157.     USART1_Config();
  158.        
  159.     /* 配置USART2 */
  160.     USART2_Config();
  161.    
  162.     /* 初始化系統(tǒng)定時器 */
  163.     SysTick_Init();
  164.    
  165.                 Key_Init();
  166.        
  167.           TIM3_Init();                 //初始化配置TIM
  168.        
  169.                 //I2C_Configuration(); //I2C初始化
  170.           OLED_Init();  //OLED初始化
  171.           ADCx_Init();                // ADC 初始化
  172.           adc_init();
  173.                
  174.     OLED_Clear();//清屏
  175.        

  176.     OLED_ShowString(1,1,"TDS:");
  177.        
  178. //TDS 接A1
  179. //接上串口模塊 A9-RX   A10-TX
  180. //波特率115200
  181. //接好后,直接打開串口軟件看輸出TDS值。
  182. //注意,如果啟用溫度補償,需要解開”溫度數(shù)據(jù)轉(zhuǎn)換“調(diào)用,然后把讀到的值更新到TDS溫度補償值中即可。
  183. //其他OLED顯示是屏蔽了,要是OLED顯示,解開初始和調(diào)用函數(shù)屏蔽即可。

  184.   while(1)
  185.         {       
  186.                
  187.                         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0 && a==0 && sta ==0)
  188.                         {       
  189.                                         text1();       
  190.                                 sta = 1;
  191.                         }
  192.                         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0 && a==0 && sta ==1)
  193.                         {       
  194.                                         text2();       
  195.                                 sta = 2;
  196.                         }
  197.                         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0 && a==1 && sta ==2)
  198.                         {       
  199.                                         text3();       
  200.                                         sta = 3;
  201.                         }
  202.                        
  203.        
  204.                         if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1) == 0 && sta==3 )
  205.                         {       
  206.                                         text3();       
  207.                                 sta = 3;                               
  208.                         }
  209.                
  210.                
  211.         }
  212. }       


  213. /*********************************************END OF FILE**********************/
復(fù)制代碼


Keil代碼下載: TDS使用版 源程序.7z (253.46 KB, 下載次數(shù): 28)
HZ711+hcsor04源程序.7z (198.11 KB, 下載次數(shù): 20)

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏3 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 一区二区在线看 | 99re国产精品 | 亚洲一区不卡在线 | 午夜影院操 | 亚洲成人免费在线观看 | 久久免费小视频 | 国产精品明星裸体写真集 | 日韩成人在线看 | 日本激情视频在线播放 | 国产精品99久久久久久久vr | 欧美成人精品在线 | 国产内谢 | 国产精品久久 | 久久99精品久久久久久噜噜 | 北条麻妃99精品青青久久 | 中文字幕亚洲精品 | 久久久91精品国产一区二区三区 | av香蕉 | 自拍偷拍视频网 | 一区二区三区四区不卡视频 | 国产小视频精品 | 国产精品久久久久久久久久久免费看 | 婷婷色国产偷v国产偷v小说 | 亚洲精品1 | 久久99精品久久久久久噜噜 | 综合久久综合久久 | 一级毛片视频免费观看 | 久久精品日产第一区二区三区 | 中文字幕在线观看一区 | 精品香蕉一区二区三区 | 国产精品伦理一区二区三区 | 国产精品欧美一区二区三区 | 一区二区三区影院 | 91在线精品秘密一区二区 | 精品国产一区二区三区久久久蜜月 | 日本精品一区二区在线观看 | 久久精品视频网站 | 久久久久久久av | 免费人成在线观看网站 | 精品成人佐山爱一区二区 | 99热精品在线观看 |