电导率滴定仪-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 553|回复: 0

电导率滴定仪

[复制链接]
发表于 2021-11-3 19:35 | 显示全部楼层 |阅读模式
  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++;}
  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. }
复制代码


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

本版积分规则

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

GMT+8, 2024-11-30 23:54 , Processed in 0.163575 second(s), 15 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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