新版电导率仪-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 429|回复: 0

新版电导率仪

[复制链接]
发表于 2022-1-5 00:35 | 显示全部楼层 |阅读模式

123.jpg

  1. //开发板为DOIT ESP32 DEVKIT V1//
  2. #include "DS18b20forESP.h"
  3. #include "ADS1115custom.h"

  4. #define DIRPIN 25
  5. #define PULPIN 26


  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  _kvalue = 0.779, 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.   DS18b20Init();
  15.   ADS1115init();
  16.   pinMode(PULPIN, OUTPUT); // steps:脉冲个数
  17.   pinMode(DIRPIN, OUTPUT); // dir:为方向控制
  18. }

  19. void loop()
  20. { if(Serial.read()=='1'){//串口接收到1时运行以下函数
  21.   n = 0;//记录循环次数,
  22.   for (i = 0; i < 1000000000000000; i++)//当不发送0时一直循环
  23.   {n++;
  24.   if(Serial.read()=='0'){break;}//串口接收到0时跳出循环
  25.   
  26.   ////////采集温度率数据/////////////////
  27.   celsius=DS18b20GetTemp();
  28.   
  29.   ////////采集电导率数据/////////////////
  30.   ecValue_sum=0;
  31.   nn=100;
  32.   for (k = 0; k < nn; k++){ECdata();ecValue_t[k]=ecValue;delay(10);}//间隔10ms采集一个数据
  33.   sort();//数据排序
  34.   N=0;
  35.   for (k = 20; k < 80; k++){ecValue_sum=ecValue_sum+ecValue_t[k];N++;}//去掉前后20个数据
  36.   ecValue_aver=ecValue_sum/N;//取剩下数据平均值
  37.   
  38.   ////////控制步进电机添加溶液/////////////////
  39.   motor();//添加溶液
  40.   
  41. ////////////////输出四个参数///////////////
  42.   Serial.print(celsius); Serial.print(' '); //串口输出温度
  43.   Serial.print(celsius); Serial.print(' ');
  44.   Serial.print(ecValue_aver,4); Serial.print(' '); //口输出电导率
  45.   Serial.println(n*0.01389*1.1429); //串口输出体积  
  46. }}
  47. }
  48. //////////////////数据排序////////////////////////
  49. void sort()
  50. {int ii,jj;
  51. float temp1;
  52.     for(ii=0;ii<nn-1;ii++)
  53.     {for(jj=0;jj<nn-1-ii;jj++)
  54.         {if(ecValue_t[jj]>ecValue_t[jj+1])
  55.             {   temp1=ecValue_t[jj];
  56.                 ecValue_t[jj]=ecValue_t[jj+1];
  57.                 ecValue_t[jj+1]=temp1;
  58.             }
  59.         }
  60.     }
  61. }

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


  72. void ECdata()
  73. {
  74.   ADS1115GetAdcValue();
  75.   voltage=adc_value[1]*0.125;//电压毫伏
  76.   rawEC = 1000 * voltage / 820.0 / 196.0;//原始电导率,电压与电导率的线性比列关系,有先前实验得到
  77.   value = rawEC * _kvalue;//校正机械误差后的电导率,_kvalueLow和_kvalueHigh由实际的电导率比上测试得到的电导率
  78.   temperature = celsius; //dht.getTemperature();//校正后的电导率
  79.   ecValue = value / (1.0 + 0.0185 * (temperature - 25.0));//修正后的电导率,修正完以后都是25摄氏度下的数据,因此用除
  80. }
复制代码

  1. #include <Wire.h>
  2. #include <Adafruit_ADS1X15.h>

  3. Adafruit_ADS1115 ads;  /* Use this for the 16-bit version */

  4. int adc_value[4];


  5. void ADS1115init(void)
  6. {
  7. ads.setGain(GAIN_ONE);        // 1x gain   +/- 4.096V  1 bit = 2mV      0.125mV
  8.   ads.begin();
  9. }

  10. void ADS1115GetAdcValue(void)
  11. {
  12.   adc_value[1] = ads.readADC_SingleEnded(1);
  13. }

  14. void ADS1115GetAdcValueWithFiller()  //带平均值滤波的获取
  15. {
  16.   unsigned long sum1 = 0;
  17.   unsigned char i = 0;
  18.   for (i = 0; i < 10; i++);
  19.   {
  20.     sum1 += ads.readADC_SingleEnded(1);
  21.     delayMicroseconds(10);
  22.   }
  23.   adc_value[1] = sum1/10;
  24. }
复制代码

  1. #include <OneWire.h>
  2. #include <DallasTemperature.h>

  3. // 定义DS18B20数据口连接ESP32的4号IO上
  4. #define ONE_WIRE_BUS 4

  5. // 初始连接在单总线上的单总线设备
  6. OneWire oneWire(ONE_WIRE_BUS);
  7. DallasTemperature sensors(&oneWire);

  8. void DS18b20Init()
  9. {
  10.   sensors.begin();
  11. }

  12. float DS18b20GetTemp()
  13. {
  14.   float temp;
  15.   sensors.requestTemperatures(); // 发送命令获取温度
  16.   temp = sensors.getTempCByIndex(0);
  17.   return temp;

  18. }
复制代码


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

本版积分规则

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

GMT+8, 2024-11-28 00:43 , Processed in 0.107234 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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