Compare commits

...

6 Commits

2 changed files with 54 additions and 64 deletions

View File

@ -4,6 +4,8 @@ pHmtero - CoSensores (Sensores Comunitarios)
Adaptación del codigo de DFRobot Gravity: Analog pH Sensor / Meter Kit V2, SKU:SEN0161-V2 Adaptación del codigo de DFRobot Gravity: Analog pH Sensor / Meter Kit V2, SKU:SEN0161-V2
https://wiki.dfrobot.com/Gravity__Analog_pH_Sensor_Meter_Kit_V2_SKU_SEN0161-V2 https://wiki.dfrobot.com/Gravity__Analog_pH_Sensor_Meter_Kit_V2_SKU_SEN0161-V2
https://github.com/DFRobot/DFRobot_PH https://github.com/DFRobot/DFRobot_PH
La adaptación fue mejorada durante la Residencia de la ReGOSH realizada en UNCUYO, Mendoza.
*****************************************************/ *****************************************************/
@ -26,9 +28,9 @@ DFRobot_PH::DFRobot_PH()
{ {
this->_temperature = 25.0; this->_temperature = 25.0;
this->_phValue = 7; this->_phValue = 7;
this->_acidVoltage = 3830.0; //buffer pH=4.01 a 25^C this->_acidVoltage = 2032.44; //buffer pH=4.00 a 25^C
this->_neutralVoltage = 3305.0; //buffer pH=6.86 a 25^C this->_neutralVoltage = 1500.00; //buffer pH=7.00 a 25^C
this->_voltage = 1500.0; this->_voltage = 1500.00;
} }
DFRobot_PH::~DFRobot_PH() DFRobot_PH::~DFRobot_PH()
@ -38,35 +40,26 @@ DFRobot_PH::~DFRobot_PH()
void DFRobot_PH::begin() void DFRobot_PH::begin()
{ {
EEPROM_read(PHVALUEADDR, this->_neutralVoltage); //carga el voltaje correspondiente al pH neutro en el EEPROM (pH = 6.86) EEPROM_read(PHVALUEADDR, this->_neutralVoltage); //carga el voltaje correspondiente al pH neutro en el EEPROM (pH = 7.00)
//Serial.print("_neutralVoltage:"); //Serial.print("_neutralVoltage:");
//Serial.println(this->_neutralVoltage); //Serial.println(this->_neutralVoltage);
if(EEPROM.read(PHVALUEADDR)==0xFF && EEPROM.read(PHVALUEADDR+1)==0xFF && EEPROM.read(PHVALUEADDR+2)==0xFF && EEPROM.read(PHVALUEADDR+3)==0xFF){ if(EEPROM.read(PHVALUEADDR)==0xFF && EEPROM.read(PHVALUEADDR+1)==0xFF && EEPROM.read(PHVALUEADDR+2)==0xFF && EEPROM.read(PHVALUEADDR+3)==0xFF){
this->_neutralVoltage = 3305.0; //nuevo EEPROM this->_neutralVoltage = 1500.0; //nuevo EEPROM
EEPROM_write(PHVALUEADDR, this->_neutralVoltage); EEPROM_write(PHVALUEADDR, this->_neutralVoltage);
} }
EEPROM_read(PHVALUEADDR+4, this->_acidVoltage);//carga el voltaje correspondiente al pH acido en el EEPROM (pH = 4.01) EEPROM_read(PHVALUEADDR+4, this->_acidVoltage);//carga el voltaje correspondiente al pH acido en el EEPROM (pH = 4.00)
//Serial.print("_acidVoltage:"); //Serial.print("_acidVoltage:");
//Serial.println(this->_acidVoltage); //Serial.println(this->_acidVoltage);
if(EEPROM.read(PHVALUEADDR+4)==0xFF && EEPROM.read(PHVALUEADDR+5)==0xFF && EEPROM.read(PHVALUEADDR+6)==0xFF && EEPROM.read(PHVALUEADDR+7)==0xFF){ if(EEPROM.read(PHVALUEADDR+4)==0xFF && EEPROM.read(PHVALUEADDR+5)==0xFF && EEPROM.read(PHVALUEADDR+6)==0xFF && EEPROM.read(PHVALUEADDR+7)==0xFF){
this->_acidVoltage = 3830.0; //nuevo EEPROM this->_acidVoltage = 2032.44; //nuevo EEPROM
EEPROM_write(PHVALUEADDR+4, this->_acidVoltage); EEPROM_write(PHVALUEADDR+4, this->_acidVoltage);
} }
} }
float DFRobot_PH::readPH(float voltage, float temperature) float DFRobot_PH::readPH(float voltage, float temperature)
{ {
float slope = (6.86-4.01)/((this->_neutralVoltage-1500.0)/3.0 - (this->_acidVoltage-1500.0)/3.0); // calibracio'n de dos puntos:_neutralVoltage,6.86 y _acidVoltage,4.01 float slope = (7.00-4.00)/((this->_neutralVoltage-1500.0)/3.0 - (this->_acidVoltage-1500.0)/3.0); // calibracio'n de dos puntos:_neutralVoltage,7.00 y _acidVoltage,4.00
float intercept = 6.86 - slope*(this->_neutralVoltage-1500.0)/3.0; float intercept = 7.00 - slope*(this->_neutralVoltage-1500.0)/3.0;
Serial.print(voltage,0);
Serial.print("mV ");
Serial.print("A:");
Serial.print(slope,4);
Serial.print(" B:");
Serial.println(intercept);
Serial.println();
this->_phValue = slope*(voltage-1500.0)/3.0+intercept; //pH = A*voltaje + B this->_phValue = slope*(voltage-1500.0)/3.0+intercept; //pH = A*voltaje + B
return _phValue; return _phValue;
@ -78,8 +71,9 @@ void DFRobot_PH::calibration(float voltage, float temperature,char* cmd)
{ {
this->_voltage = voltage; this->_voltage = voltage;
this->_temperature = temperature; this->_temperature = temperature;
strupr(cmd); String sCmd = String(cmd);
phCalibration(cmdParse(cmd)); // si recibe el CMD por el monitor serial entra al modo calibracio'n sCmd.toUpperCase();
phCalibration(cmdParse(sCmd.c_str())); // si recibe el CMD por el monitor serial entra al modo calibracio'n
} }
@ -89,7 +83,10 @@ void DFRobot_PH::calibration(float voltage, float temperature)
this->_temperature = temperature; this->_temperature = temperature;
if(cmdSerialDataAvailable() > 0){ if(cmdSerialDataAvailable() > 0){
phCalibration(cmdParse()); // si recibe el CMD por el monitor serial entra al modo calibracio'n phCalibration(cmdParse()); // si recibe el CMD por el monitor serial entra al modo calibracio'n
Serial.print(voltage);
Serial.println("mV ");
} }
} }
@ -121,9 +118,9 @@ boolean DFRobot_PH::cmdSerialDataAvailable()
byte DFRobot_PH::cmdParse(const char* cmd) byte DFRobot_PH::cmdParse(const char* cmd)
{ {
byte modeIndex = 0; byte modeIndex = 0;
if(strstr(cmd, "CALIBRAR") != NULL){ if(strstr(cmd, "ENTRARPH") != NULL){
modeIndex = 1; modeIndex = 1;
}else if(strstr(cmd, "SALIR") != NULL){ }else if(strstr(cmd, "SALIRCAL") != NULL){
modeIndex = 3; modeIndex = 3;
}else if(strstr(cmd, "PHCAL") != NULL){ }else if(strstr(cmd, "PHCAL") != NULL){
modeIndex = 2; modeIndex = 2;
@ -134,9 +131,9 @@ byte DFRobot_PH::cmdParse(const char* cmd)
byte DFRobot_PH::cmdParse() byte DFRobot_PH::cmdParse()
{ {
byte modeIndex = 0; byte modeIndex = 0;
if(strstr(this->_cmdReceivedBuffer, "CALIBRAR") != NULL){ if(strstr(this->_cmdReceivedBuffer, "ENTRARPH") != NULL){
modeIndex = 1; modeIndex = 1;
}else if(strstr(this->_cmdReceivedBuffer, "SALIR") != NULL){ }else if(strstr(this->_cmdReceivedBuffer, "SALIRCAL") != NULL){
modeIndex = 3; modeIndex = 3;
}else if(strstr(this->_cmdReceivedBuffer, "PHCAL") != NULL){ }else if(strstr(this->_cmdReceivedBuffer, "PHCAL") != NULL){
modeIndex = 2; modeIndex = 2;
@ -154,47 +151,44 @@ void DFRobot_PH::phCalibration(byte mode)
case 0: case 0:
if(enterCalibrationFlag){ if(enterCalibrationFlag){
Serial.println(F(">>>error<<<")); Serial.println(F(""));
} }
break; break;
case 1: case 1:
enterCalibrationFlag = 1; enterCalibrationFlag = 1;
phCalibrationFinish = 0; phCalibrationFinish = 0;
Serial.println(); Serial.println();
//Serial.println(F(">>>calibrando<<<")); Serial.println ("Entró al modo calibración");
Serial.println(F("buffer 4.01 o 6.86")); Serial.println("Introduzca buffer 4.00");
Serial.println(); Serial.println("Dejar estabilizar");
Serial.println(); Serial.println("Presione pHCAL");
Serial.println(); Serial.println();
break; break;
case 2: case 2:
if(enterCalibrationFlag){ if(enterCalibrationFlag){
if((this->_voltage>3000)&&(this->_voltage<3500)){ // buffer solution:6.86{ if((this->_voltage>1022)&&(this->_voltage<1678)){ // buffer solution:7.00{
Serial.println(); Serial.println();
Serial.print(F("buffer 6.86")); Serial.print(F("Buffer: 7.00"));
this->_neutralVoltage = this->_voltage; this->_neutralVoltage = this->_voltage;
//Serial.println(F(",SALIR para guardar y salir<<<")); Serial.println(F("Presione GUARDAR"));
Serial.println();
Serial.println();
Serial.println(); Serial.println();
phCalibrationFinish = 1; phCalibrationFinish = 1;
}else if((this->_voltage>3501)&&(this->_voltage<4000)){ //buffer solution:4.01 }else if((this->_voltage>1854)&&(this->_voltage<2500)){ //buffer solution:4.01
Serial.println(); Serial.println();
Serial.print(F("buffer 4.01")); Serial.println(F("Buffer: 4.00"));
this->_acidVoltage = this->_voltage; this->_acidVoltage = this->_voltage;
//Serial.println(F(",SALIR para guardar y salir<<<")); Serial.println(F("Pase al buffer 7.00"));
Serial.println(); Serial.println("Dejar estabilizar");
Serial.println(); Serial.println("Presione pHCAL");
Serial.println(); Serial.println();
phCalibrationFinish = 1; phCalibrationFinish = 1;
}else{ }else{
Serial.println(); Serial.println();
Serial.print(F(">>>error<<<")); Serial.print(F(">>Error, pruebe nuevamente.<<<"));
Serial.println(); // not buffer solution or faulty operation Serial.println(); // not buffer solution or faulty operation
Serial.println();
Serial.println();
phCalibrationFinish = 0; phCalibrationFinish = 0;
} }
} }
@ -204,17 +198,15 @@ void DFRobot_PH::phCalibration(byte mode)
if(enterCalibrationFlag){ if(enterCalibrationFlag){
Serial.println(); Serial.println();
if(phCalibrationFinish){ if(phCalibrationFinish){
if((this->_voltage>3000)&&(this->_voltage<3500)){ if((this->_voltage>1022)&&(this->_voltage<1678)){
EEPROM_write(PHVALUEADDR, this->_neutralVoltage); EEPROM_write(PHVALUEADDR, this->_neutralVoltage);
}else if((this->_voltage>3501)&&(this->_voltage<4000)){ }else if((this->_voltage>1854)&&(this->_voltage<2500)){
EEPROM_write(PHVALUEADDR+4, this->_acidVoltage); EEPROM_write(PHVALUEADDR+4, this->_acidVoltage);
} }
Serial.print(F(">>>calibrado")); Serial.print(F(">>>Calibración exitosa"));
}else{ }else{
Serial.print(F(">>>fallo")); Serial.print(F(">>>Falló la calibración"));
} }
Serial.println(F(",salir<<<"));
Serial.println();
Serial.println(); Serial.println();
Serial.println(); Serial.println();
phCalibrationFinish = 0; phCalibrationFinish = 0;

View File

@ -7,20 +7,20 @@ https://gitlab.com/cosensores
https://www.facebook.com/cosensores/ https://www.facebook.com/cosensores/
https://www.instagram.com/cosensores/ https://www.instagram.com/cosensores/
Somos miembros de Universidades Nacionales trabajando junto a comunidades organizadas Somos miembros de Universidades Nacionales trabajando junto a comunidades organizadas en el desarrollo de métodos para evaluar la presencia de contaminantes de manera sencilla en el territorio, acompañando acciones y procesos reivindicativos.
en el desarrollo de métodos para evaluar la presencia de contaminantes
de manera sencilla en el territorio, acompañando acciones y procesos reivindicativos.
***************************************************** *****************************************************
Adaptación del codigo de DFRobot Gravity: Analog pH Sensor / Meter Kit V2, SKU:SEN0161-V2 Adaptación del codigo de DFRobot Gravity: Analog pH Sensor / Meter Kit V2, SKU:SEN0161-V2
https://wiki.dfrobot.com/Gravity__Analog_pH_Sensor_Meter_Kit_V2_SKU_SEN0161-V2 https://wiki.dfrobot.com/Gravity__Analog_pH_Sensor_Meter_Kit_V2_SKU_SEN0161-V2
https://github.com/DFRobot/DFRobot_PH https://github.com/DFRobot/DFRobot_PH
La adaptación fue mejorada durante la Residencia de la ReGOSH realizada en UNCUYO, Mendoza.
1. El codigo fue evaluado en Arduino Uno - IDE 1.0.5 1. El codigo fue evaluado en Arduino Uno - IDE 1.0.5
2. Para calibrar: 2. Para calibrar:
CALIBRAR -> ingresa al modo calibracio'n ENTRARPH -> ingresa al modo calibracio'n
PHCAL -> calibracio'n de dos puntos en buffer pH=4.01 y pH=6.86 PHCAL -> calibracio'n de dos puntos en buffer pH=4.00 y pH=7.00
SALIR -> guarda los parametros y sale del modo de calibracio'n SALIRCAL -> guarda los parametros y sale del modo de calibracio'n
**************************************************** ****************************************************
Librerias control sensor temperatura: ds18b20 Librerias control sensor temperatura: ds18b20
@ -67,7 +67,7 @@ float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
//pH //pH
static unsigned long timepoint = millis(); static unsigned long timepoint = millis();
if(millis()-timepoint>30U){ //intervalo de tiempo 30seg if(millis()-timepoint>1500U){ //intervalo de tiempo 1500mseg
timepoint = millis(); timepoint = millis();
temperature = temp; //comentar para no levantar temperatura temperature = temp; //comentar para no levantar temperatura
analogBuffer[analogBufferIndex] = analogRead(PH_PIN)/1024.0*5000; //lee el voltaje y lo guarda en el buffer cada 40ms analogBuffer[analogBufferIndex] = analogRead(PH_PIN)/1024.0*5000; //lee el voltaje y lo guarda en el buffer cada 40ms
@ -80,18 +80,17 @@ float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
//imprime //imprime
Serial.print(" >>> "); Serial.print("Temperatura: ");
Serial.print(temperature,1); Serial.print(temperature,1);
Serial.println(" ^C <<<"); Serial.println(" °C");
Serial.print(" >>> pH: "); Serial.print("pH: ");
Serial.print(phValue,2); Serial.println(phValue,2);
Serial.println(" <<<");
Serial.println(); Serial.println();
Serial.println(); Serial.println();
} }
ph.calibration(voltage,temperature); //proceso de calibracio'n por CMD serial
ph.calibration(voltage,temperature); //proceso de calibracio'n por CMD serial
} }
@ -121,4 +120,3 @@ int getMedianNum(int bArray[], int iFilterLen)
bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2; bTemp = (bTab[iFilterLen / 2] + bTab[iFilterLen / 2 - 1]) / 2;
return bTemp; return bTemp;
} }