library for SEN0169 ph probe from DFRobot
Dependents: 2022_TICE_Electrolyse
lib_SEN0169.cpp@0:f17189a32558, 2022-01-11 (annotated)
- Committer:
- jsanchez
- Date:
- Tue Jan 11 15:01:35 2022 +0000
- Revision:
- 0:f17189a32558
v.1.0
Who changed what in which revision?
User | Revision | Line number | New 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 | } |