电导率在线采集-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 732|回复: 0

电导率在线采集

[复制链接]
发表于 2021-11-5 10:07 | 显示全部楼层 |阅读模式
  1. #include <OneWire.h>
  2. #define pH_PIN A5
  3. #define EC_PIN A4
  4. int DS18B20_Pin = D3; //DS18B20信号引脚在D3上
  5. OneWire ds(DS18B20_Pin);  //配置数字引脚D3

  6. int x,i=0, n = 0,j=0,k,nn,N;
  7. float voltage, ecValue,ecValue_sum,ecValue_aver,ecValue_t[500], temperature = 25.0;
  8. float _kvalueLow = 0.820756, _kvalueHigh = 1.003577, _kvalue = 0.987, rawEC, valueTemp, value;
  9. float celsius, fahrenheit;
  10. float Temp_Buffer = 0, vv = 0;
  11. float val = 0, EV = 0, strain = 0, pH = 0;

  12. void setup()
  13. { Serial.begin(9600);
  14.   pinMode(pH_PIN, INPUT);
  15.   pinMode(EC_PIN, INPUT);
  16.   pinMode(D6, OUTPUT); // Enable: EN可以使用单片机端口控制,也可以直接连接GND使能
  17.   pinMode(D5, OUTPUT); // steps:脉冲个数
  18.   pinMode(D4, OUTPUT); // dir:为方向控制
  19. digitalWrite(D6, LOW); // Enable处于低电平或悬空时能够正常运行
  20. //  pinMode(D8, OUTPUT);digitalWrite(D8, HIGH);
  21. //  pinMode(D9, OUTPUT);digitalWrite(D9, HIGH);
  22. //  pinMode(D10, OUTPUT);digitalWrite(D10, HIGH);


  23.   while(j < 1){celsius=getTemp();j++;}
  24. }

  25. void loop()
  26. { if(Serial.read()=='1'){//串口接收到1时运行以下函数
  27.   n = 0;
  28.   for (i = 0; i < 10000000000000; i++)
  29.   {n++;
  30.   if(Serial.read()=='0'){break;}//串口接收到0时跳出循环
  31.   
  32.   celsius=getTemp();
  33.   Serial.print(celsius); Serial.print(' '); //串口输出温度
  34.    
  35.   //pHval();//测量pH
  36.   
  37.   ecValue_sum=0;
  38.   nn=100;
  39.   for (k = 0; k < nn; k++){ECdata();ecValue_t[k]=ecValue;delay(10);}
  40.   sort();//数据排序
  41.   N=0;
  42.   for (k = 20; k < 80; k++){ecValue_sum=ecValue_sum+ecValue_t[k];N++;}//去掉前后20个数据
  43.   ecValue_aver=ecValue_sum/N;//取剩下数据平均值
  44.   
  45.   Serial.print(voltage,4); Serial.print(' '); //串口输出pH
  46.   Serial.print(ecValue_aver,4); Serial.print(' '); //口输出电导率
  47.   
  48.   motor();//添加溶液
  49.   Serial.println(n*0.01389*1.1429); //串口输出体积
  50. }}
  51. }

  52. void sort()
  53. {int ii,jj;
  54. float temp1;
  55.     for(ii=0;ii<nn-1;ii++)
  56.     {for(jj=0;jj<nn-1-ii;jj++)
  57.         {if(ecValue_t[jj]>ecValue_t[jj+1])
  58.             {   temp1=ecValue_t[jj];
  59.                 ecValue_t[jj]=ecValue_t[jj+1];
  60.                 ecValue_t[jj+1]=temp1;
  61.             }
  62.         }
  63.     }
  64. }


  65. void motor() {//控制42步进电机
  66.   digitalWrite(D4, HIGH); // Set Dir high
  67.   for (x = 0; x < 200; x++) // 300个脉冲数
  68.   { digitalWrite(D5, HIGH); // Output high
  69.     delayMicroseconds(600); // Wait 1/2 a ms
  70.     digitalWrite(D5, LOW); // Output low
  71.     delayMicroseconds(600); // Wait 1/2 a ms
  72.   }
  73. }

  74. void pHval() {
  75.   val = analogRead(pH_PIN); //传感器接到模拟口A0
  76.   EV = val * 3.3/ 4096;
  77.   pH = 16.7935 -5.7124 * EV;
  78. }

  79. void ECdata()
  80. { voltage = analogRead(EC_PIN)*3300 / 4096;//电压毫伏
  81.   rawEC = 1000 * voltage / 820.0 / 196.0;//原始电导率,电压与电导率的线性比列关系,有先前实验得到
  82. //  value = rawEC * _kvalue;//初始不计算仪器引起的误差
  83. //  if (value > 2.5) {
  84. //    _kvalue =0.97268554323* _kvalueHigh;//高校正值
  85. //  }
  86. //  else if (value < 2.0) {
  87. //    _kvalue = 0.58245127484*_kvalueLow;//低校正值
  88. //  }
  89.   value = rawEC * _kvalue;//校正机械误差后的电导率,_kvalueLow和_kvalueHigh由实际的电导率比上测试得到的电导率
  90.   temperature = celsius; //dht.getTemperature();//校正后的电导率
  91.   ecValue = value / (1.0 + 0.0185 * (temperature - 25.0));//修正后的电导率,修正完以后都是25摄氏度下的数据,因此用除
  92. }



  93. float getTemp(){//获取DS18B20温度数据
  94.   byte data[12];//定义一个12位的字节的字符变量,每个字节有8位构成
  95.   byte addr[8];//定义一个8位的字节的字符变量
  96.   if ( !ds.search(addr)) {//若无传感器继续搜索   
  97.       ds.reset_search();
  98.       Serial.println("CRC is not valid!");
  99.       return -1000;
  100.   }
  101.   if ( OneWire::crc8( addr, 7) != addr[7]) {
  102.       Serial.println("CRC is not valid!");
  103.       return -1000;
  104.   }
  105.   if ( addr[0] != 0x10 && addr[0] != 0x28) {//开始的 8 位是产品类型编码(DS18B20 是 0x10)
  106.       Serial.print("Device is not recognized");
  107.       return -1000;
  108.   }
  109.   ds.reset();
  110.   ds.select(addr);//
  111.   ds.write(0x44,1); //开始转换

  112.   byte present = ds.reset();
  113.   ds.select(addr);   
  114.   ds.write(0xBE); //读暂存寄存器
  115.   
  116.   for (int i = 0; i < 9; i++) { //读取9个字节
  117.     data[i] = ds.read();//读取数据
  118.   }
  119.   
  120.   ds.reset_search();
  121.   
  122.   byte MSB = data[1];//高8位,第2个字节
  123.   byte LSB = data[0];//低8位,第1个字节
  124.   float tempRead = ((MSB << 8) | LSB);
  125.   float TemperatureSum = tempRead / 16;
  126.   return TemperatureSum;
  127.   
  128. }
复制代码
  1. function varargout = EC_GUI(varargin)
  2. gui_Singleton = 1;
  3. gui_State = struct('gui_Name',       mfilename, ...
  4.                    'gui_Singleton',  gui_Singleton, ...
  5.                    'gui_OpeningFcn', @EC_GUI_OpeningFcn, ...
  6.                    'gui_OutputFcn',  @EC_GUI_OutputFcn, ...
  7.                    'gui_LayoutFcn',  [] , ...
  8.                    'gui_Callback',   []);
  9. if nargin && ischar(varargin{1})
  10.     gui_State.gui_Callback = str2func(varargin{1});
  11. end

  12. if nargout
  13.     [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
  14. else
  15.     gui_mainfcn(gui_State, varargin{:});
  16. end
  17. end

  18. %% 主要函数
  19. function EC_GUI_OpeningFcn(hObject, eventdata, handles, varargin)
  20. edit3_Callback(hObject, eventdata, handles)
  21. handles.output = hObject;
  22. guidata(hObject, handles);
  23. end
  24. function varargout = EC_GUI_OutputFcn(hObject, eventdata, handles)
  25. varargout{1} = handles.output;
  26. end

  27. %% 用来从GUI的edit传递参数到m文件的变量,此处传递的是串口名称
  28. function edit3_Callback(hObject, eventdata, handles)
  29. global come12;
  30. come12='COM10';%(COM4是默认值)
  31. str1=get(handles.edit3,'string');
  32. come12=str1;
  33. end
  34. function edit3_CreateFcn(hObject, eventdata, handles)
  35. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
  36.     set(hObject,'BackgroundColor','white');
  37. end
  38. end

  39. %% 用于链接串口
  40. function pushbutton4_Callback(hObject, eventdata, handles)
  41. global Port;
  42. global come12;
  43. Port=serial(come12);%定义串口对象可能会出现错误,根据提示修改即可
  44. fclose(instrfind);
  45. set(Port,'BaudRate',9600);%设置波特率
  46. set(Port,'DataBits',8);%8位数据位
  47. set(Port,'StopBits',1);%1位停止位
  48. fopen(Port); %打开串口
  49. global nn
  50. nn=0;
  51. global samplename2
  52. samplename2=[];
  53. end

  54. %% 用来从GUI传递参数到m文件中的变量,此处传递的是样本名称
  55. function edit1_Callback(hObject, eventdata, handles)
  56. global samplename1
  57. global samplename2
  58. global nn
  59. global val1
  60. %samplename1='new';%(a是初始值)
  61. %val1=get(handles.edit1,'string');
  62. samplename1=get(handles.edit1,'string');%样本名称
  63. nn=nn+1;
  64. samplename2{nn}=val1;
  65. %legend(samplename2{:});
  66. end
  67. function edit1_CreateFcn(hObject, eventdata, handles)
  68. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
  69.     set(hObject,'BackgroundColor','white');
  70. end
  71. end
  72. %% 用来从GUI传递参数到m文件中的变量,此处传递的是_BaCl2浓度
  73. function edit9_Callback(hObject, eventdata, handles)
  74. global BaCl2;
  75. BaCl2=get(handles.edit9,'string');%(a是初始值)
  76. end
  77. function edit9_CreateFcn(hObject, eventdata, handles)
  78. if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
  79.     set(hObject,'BackgroundColor','white');
  80. end
  81. end

  82. %% 开始启动并采集数据的按钮
  83. function pushbutton1_Callback(hObject, eventdata, handles)
  84. global Port;
  85. global nn;
  86. global samplename1;
  87. global BaCl2;
  88. global excel_name;
  89. global write_sheet;
  90. global x1;
  91. global x2;
  92. global x3;
  93. global x4;
  94. global xt;

  95. fprintf(Port,'1');

  96. %%%%%%%%%%%%%%%%%%%%%%%可能需修改%%%%%%%%%%%%%%%%%%%%%%
  97. interval = 10000; %可能需要修改
  98. passo = 1;t = 1;
  99. file_address1='D:\';%数据存放文件路径
  100. %% 文件的创建

  101. if (t==1)
  102. %% 获取当前时间
  103. now=fix(clock);
  104. time=strcat(num2str(now(1)),'_',num2str(now(2)),'_',num2str(now(3)));%年月日   
  105. mkdir(strcat(file_address1,'Ion_Test'));%新建大文件名
  106. file_address=strcat(file_address1,'Ion_Test\');
  107. mkdir(strcat(file_address,time));%新建大文件名
  108. File1=strcat(file_address,time);%大文件路径

  109. mkdir(strcat(File1,'\','EC'));%新建EC文件
  110. File_EC=strcat(File1,'\','EC\');%EC文件路径
  111. mkdir(strcat(File_EC,samplename1));%新建样本文件
  112. File_EC_sample=strcat(File_EC,samplename1,'\');%样本文件路径

  113. % mkdir(strcat(File1,'\','pH'));%新建pH文件
  114. % File_pH=strcat(File1,'\','pH\');
  115. % mkdir(strcat(File_pH,samplename1));%新建样本文件
  116. % File_pH_sample=strcat(File_pH,samplename1,'\');
  117. %% 根据时间命名文件名
  118. TIME=strcat('(',num2str(now(4)),'_',num2str(now(5)),')');%时分
  119. samplename=strcat(TIME,samplename1);%样本名
  120. end
  121. %% 线条颜色调整
  122. % nrgb=1000;
  123. % for i=nrgb:10*nrgb
  124. %     rgb=64/i;
  125. %     mycolormap_r=interp1([1 8 24 40 56 64],[0 0 0 1 1  1 ],1:rgb:64);
  126. %     mycolormap_g=interp1([1 8 24 40 56 64],[0 0 1 1 0  0  ],1:rgb:64);
  127. %     mycolormap_b=interp1([1 8 24 40 56 64],[0 1 1 0 0  0  ],1:rgb:64);
  128. %     if length(mycolormap_r)>=nrgb
  129. %         break
  130. %     end
  131. % end
  132. % mycolor=[mycolormap_r',mycolormap_g',mycolormap_b'];
  133. % colormap(mycolor);
  134. % hco = colorbar ;

  135. set(0,'defaultfigurecolor','w');%设定背景颜色为白色
  136. %x1=0;x2=0;x3=0;x4=0;
  137. vv='The test has been started'  
  138. while(t<interval)

  139.    
  140. b = str2num(fgetl(Port));%读取串口数据,当出现终止符(换行符)停止。
  141. if(t==1)
  142.   x4=0;  
  143. end
  144. x4 = [x4,b(4)];%取串口第4个数据并进行串联


  145. if(t==1)
  146.   x1=b(1);
  147. end
  148. x1 = [x1,b(1)];%取串口第1个数据并进行串联
  149. % plot(handles.axes9,x4,x1,'-','linewidth',2);
  150. % xlabel(handles.axes9,'V(ml)');
  151. % ylabel(handles.axes9,'T(\circC)');

  152. if(t==1)
  153.   x2=b(2);
  154. end
  155. x2 = [x2,b(2)];%取串口第2个数据并进行串联
  156. % plot(handles.axes8,x4,x2,'-','linewidth',2);%plot(handles.axes8,x4,x2,'-','linewidth',2,'color',mycolor(nn,:));hold on
  157. % xlabel(handles.axes8,'V(ml)');
  158. % ylabel(handles.axes8,'pH');

  159. if(t==1)
  160.   x3=b(3);
  161. end
  162. x3 = [x3,b(3)];%取串口第3个数据并进行串联
  163. plot(handles.axes5,x4,x3,'-','linewidth',2);
  164. xlabel(handles.axes5,'V(ml)');
  165. ylabel(handles.axes5,'EC(ms\cdotcm^{-1})');

  166. now=fix(clock);
  167. if(t==1)
  168.   x40=now(4);
  169.   x50=now(5);
  170.   x60=now(6);
  171.   x00=x40*3600+x50*60+x60;
  172.   xt=0;
  173. end
  174. xt1=now(4)*3600+now(5)*60+now(6)-x00;
  175. xt=[xt,xt1];
  176. tt=[t,xt1]
  177. %% 数据的保存
  178. savefig(strcat(File_EC_sample,samplename,'.fig'));%保存fig数据格式
  179. saveas(gcf, strcat(File_EC_sample,samplename,'.tif'));%保存tif数据格式

  180. excel_name=strcat(File_EC_sample,samplename);
  181. excel_name=strcat(excel_name,'.xls');
  182. write_sheet='sheet1';
  183. if(t==1)
  184. xlswrite(excel_name,{'样本名'},write_sheet,'A1');%写入样本名
  185. xlswrite(excel_name,{samplename1},write_sheet,'A2');%写入样本名
  186. xlswrite(excel_name,{'BaCl2浓度(mol/l)'},write_sheet,'A3');%写入BaCl2浓度
  187. xlswrite(excel_name,{BaCl2},write_sheet,'A4');%写入BaCl2浓度

  188. xlswrite(excel_name,{'V(ml)'},write_sheet,'B1');%写入样本名
  189. xlswrite(excel_name,{'EC(ms.cm^{-1})'},write_sheet,'C1');%写入样本名
  190. xlswrite(excel_name,{'voltage(mV)'},write_sheet,'D1');%写入样本名
  191. xlswrite(excel_name,{'T(。C)'},write_sheet,'E1');%写入样本名
  192. xlswrite(excel_name,{'time(s)'},write_sheet,'F1');%写入样本名
  193. end



  194. t = t+passo;
  195. drawnow;
  196. end

  197. end
  198. %% 用于停止运行的按钮
  199. function pushbutton2_Callback(hObject, eventdata, handles)
  200. global Port;
  201. global excel_name;
  202. global write_sheet;
  203. global x1;
  204. global x2;
  205. global x3;
  206. global x4;
  207. global xt;
  208. for ij=1:20
  209. fprintf(Port,'0');
  210. end
  211. vv='The test has been terminated'
  212. xlswrite(excel_name,x4',write_sheet,'B2');%写入滴定体积
  213. xlswrite(excel_name,x3',write_sheet,'C2');%写入EC
  214. xlswrite(excel_name,x2',write_sheet,'D2');%写入pH
  215. xlswrite(excel_name,x1',write_sheet,'E2');%写入T
  216. xlswrite(excel_name,xt',write_sheet,'F2');%写入pH
  217. fprintf(Port,'0');
  218. hold off


  219. end
复制代码


您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 02:30 , Processed in 0.132832 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表