library for SEN0169 ph probe from DFRobot

Dependents:   2022_TICE_Electrolyse

Committer:
jsanchez
Date:
Tue Jan 11 15:01:35 2022 +0000
Revision:
0:f17189a32558
v.1.0

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jsanchez 0:f17189a32558 1 #include "lib_SEN0169.h"
jsanchez 0:f17189a32558 2
jsanchez 0:f17189a32558 3
jsanchez 0:f17189a32558 4 SEN0169::SEN0169(PinName data_pin) : _datapin(data_pin)
jsanchez 0:f17189a32558 5 {
jsanchez 0:f17189a32558 6 this->_phValue = 7.0f;
jsanchez 0:f17189a32558 7 this->_voltage = 1500.0f;
jsanchez 0:f17189a32558 8 }
jsanchez 0:f17189a32558 9
jsanchez 0:f17189a32558 10 void SEN0169::calibration(uint8_t ph_tampon)
jsanchez 0:f17189a32558 11 {
jsanchez 0:f17189a32558 12 float avg_voltage, buf_[20], temp_;
jsanchez 0:f17189a32558 13
jsanchez 0:f17189a32558 14 for(int i=0; i<20; i++) {
jsanchez 0:f17189a32558 15 buf_[i]=_datapin.read();
jsanchez 0:f17189a32558 16 ThisThread::sleep_for(10ms);
jsanchez 0:f17189a32558 17 }
jsanchez 0:f17189a32558 18 for(int i=0; i<19; i++) {
jsanchez 0:f17189a32558 19 for(int j=i+1; j<20; j++) {
jsanchez 0:f17189a32558 20 if(buf_[i]>buf_[j]) {
jsanchez 0:f17189a32558 21 temp_=buf_[i];
jsanchez 0:f17189a32558 22 buf_[i]=buf_[j];
jsanchez 0:f17189a32558 23 buf_[j]=temp_;
jsanchez 0:f17189a32558 24 }
jsanchez 0:f17189a32558 25 }
jsanchez 0:f17189a32558 26 }
jsanchez 0:f17189a32558 27 avg_voltage = 0.0f;
jsanchez 0:f17189a32558 28 for(int i=5; i<15; i++) avg_voltage += buf_[i];
jsanchez 0:f17189a32558 29 avg_voltage = avg_voltage*3.3/10.0f;
jsanchez 0:f17189a32558 30
jsanchez 0:f17189a32558 31
jsanchez 0:f17189a32558 32 switch (ph_tampon) {
jsanchez 0:f17189a32558 33 case 4 :
jsanchez 0:f17189a32558 34 this->_params[ACIDE] = avg_voltage;
jsanchez 0:f17189a32558 35 break;
jsanchez 0:f17189a32558 36
jsanchez 0:f17189a32558 37 case 7 :
jsanchez 0:f17189a32558 38 this->_params[NEUTRE] = avg_voltage;
jsanchez 0:f17189a32558 39 break;
jsanchez 0:f17189a32558 40
jsanchez 0:f17189a32558 41 case 10 :
jsanchez 0:f17189a32558 42 this->_params[BASIC] = avg_voltage;
jsanchez 0:f17189a32558 43 break;
jsanchez 0:f17189a32558 44
jsanchez 0:f17189a32558 45 default :
jsanchez 0:f17189a32558 46 break;
jsanchez 0:f17189a32558 47 }
jsanchez 0:f17189a32558 48 }
jsanchez 0:f17189a32558 49
jsanchez 0:f17189a32558 50 float* SEN0169::get_parameters(void)
jsanchez 0:f17189a32558 51 {
jsanchez 0:f17189a32558 52 return _params;
jsanchez 0:f17189a32558 53 }
jsanchez 0:f17189a32558 54
jsanchez 0:f17189a32558 55 float SEN0169::read_voltage(void)
jsanchez 0:f17189a32558 56 {
jsanchez 0:f17189a32558 57 this->_voltage = _datapin.read()*3.3;
jsanchez 0:f17189a32558 58 return _voltage;
jsanchez 0:f17189a32558 59 }
jsanchez 0:f17189a32558 60
jsanchez 0:f17189a32558 61 float SEN0169::read_ph(void)
jsanchez 0:f17189a32558 62 {
jsanchez 0:f17189a32558 63 float avg_voltage, buf_[10], temp_;
jsanchez 0:f17189a32558 64
jsanchez 0:f17189a32558 65 for(int i=0; i<10; i++) { // take 10 samples of voltage
jsanchez 0:f17189a32558 66 buf_[i]=_datapin.read();
jsanchez 0:f17189a32558 67 ThisThread::sleep_for(10ms);
jsanchez 0:f17189a32558 68 }
jsanchez 0:f17189a32558 69 for(int i=0; i<9; i++) { // sort the voltages from small to large
jsanchez 0:f17189a32558 70 for(int j=i+1; j<10; j++) {
jsanchez 0:f17189a32558 71 if(buf_[i]>buf_[j]) {
jsanchez 0:f17189a32558 72 temp_=buf_[i];
jsanchez 0:f17189a32558 73 buf_[i]=buf_[j];
jsanchez 0:f17189a32558 74 buf_[j]=temp_;
jsanchez 0:f17189a32558 75 }
jsanchez 0:f17189a32558 76 }
jsanchez 0:f17189a32558 77 }
jsanchez 0:f17189a32558 78 avg_voltage = 0.0f;
jsanchez 0:f17189a32558 79 for(int i=2; i<8; i++) avg_voltage += buf_[i]; // supress the 2 smallest and 2 largest samples
jsanchez 0:f17189a32558 80 avg_voltage = avg_voltage*3.3/6.0f;
jsanchez 0:f17189a32558 81
jsanchez 0:f17189a32558 82 this->_voltage = avg_voltage;
jsanchez 0:f17189a32558 83 this->_params[SLOPE] = ((3.0f*(4.0f*_params[ACIDE]+7.0f*_params[NEUTRE]+10.0f*_params[BASIC]))-(21.0f*(_params[ACIDE]+_params[NEUTRE]+_params[BASIC])))/54.0f;
jsanchez 0:f17189a32558 84 // Slope = [3*sum(xy)-sum(x)*sum(y)]/[3*sum(x²)-sum(x)²]
jsanchez 0:f17189a32558 85 this->_params[INTERCEPT] = ((_params[ACIDE] + _params[NEUTRE] + _params[BASIC])/3.0f) - (_params[SLOPE] * 7.0f);
jsanchez 0:f17189a32558 86 this->_phValue = (avg_voltage*1000.0 - _params[INTERCEPT]) / _params[SLOPE];
jsanchez 0:f17189a32558 87
jsanchez 0:f17189a32558 88 return _phValue;
jsanchez 0:f17189a32558 89 }