problema con el funcionamiento de varios sensores al mismo tiempo

Hola,tengo un problema que me lleva de cabeza mas de 2 meses.Primero decir que no soy un genio en esto de arduino,todo lo que hecho a sido a base de videos y buscar informacion y por supuesto a mucho fallar.
Mi proyecto es para controlar un acuario y poder ver los parametros de tds,ph,temperatura y un sensor de humedad por si tuviera alguna fuga ,todo lo veo en una pantalla de 20 x 4 y controlo tres tubos de leds con 3 reles con un modulo reloj.Todo lo alimento con una fuente de 5 v y el arduino con tranformador de 6,5 v.
Lo que me ocurre es que la sonda de ph los valores me fructua mucho (1 grado o mas),el resto me funciona correctamente,creo.
haber si me podeis ayudar,muchas gracias.
Por cierto es un arduino mega.

Si he cometido algun error en el foro lo siento,me lo comunicais.

#include <GravityTDS.h>
#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
#include <DallasTemperature.h>
#include <OneWire.h>
#include <EEPROM.h>

#define RELAY_ON 0 //PRUEBAS
#define RELAY_OFF 1 //PRUEBAS

#define TdsSensorPin A12 // sensor tds

LiquidCrystal_I2C lcd(0x27,20,4);
RTC_DS1307 RTC;
GravityTDS gravityTds; //sensor tds

const byte pinDatosDQ = 22; // sensor temperatura

float temperature = 25,tdsValue = 0;

const int analogInPin = A8; // sensor ph
int sensorValue = 0; // sensor ph
unsigned long int avgValue; // sensor ph
float b; // sensor ph
int buf[10],temp; // sensor ph

OneWire oneWireObjeto(pinDatosDQ);
DallasTemperature sensorDS18B20(&oneWireObjeto);

void setup () {

gravityTds.setPin(TdsSensorPin); //sensor tds
gravityTds.setAref(5.0); //sensor tds voltaje 5v
gravityTds.setAdcRange(1024); //sensor tds 1024 a 10 bit ADC; 4096 a 12 bit ADC
gravityTds.begin(); //iniciar sensor tds

sensorDS18B20.begin(); //sensor temperatura

Wire.begin(); // Inicia el puerto I2C
RTC.begin(); // Inicia la comunicaci¢n con el RTC
//RTC.adjust(DateTime(DATE, TIME)); // Establece la fecha y hora (Comentar una vez establecida la hora)
//el anterior se usa solo en la configuracion inicial

lcd.init();
lcd.backlight();
lcd.clear();

digitalWrite(32,RELAY_OFF); //PRUEBAS
digitalWrite(36,RELAY_OFF); //PRUEBAS
digitalWrite(40,RELAY_OFF); //PRUEBAS

pinMode(32,OUTPUT);
pinMode(36,OUTPUT);
pinMode(40,OUTPUT);

}

void loop(){

DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC

lcd.setCursor(0,0);
lcd.print("H:");
lcd.print(now.day(), DEC);
lcd.print("/");
lcd.print(now.month(), DEC);
lcd.print("/");
lcd.print(now.year(), DEC);
lcd.print(" ");
lcd.setCursor(13,0);
lcd.print("T:");
lcd.print(now.hour(), DEC);
lcd.print(":");
lcd.print(now.minute(), DEC);

int hora =now.hour();
int minuto =now.minute();
int segundo = now.second();
if(hora >=11 && hora <=21){ //amanecer
digitalWrite(32,RELAY_ON);
}
else {
digitalWrite(32,RELAY_OFF);
}

if(hora >=21 && hora <=22){ //noche
digitalWrite(36,RELAY_ON);
}
else {
digitalWrite(36,RELAY_OFF);
{
if(hora >=12 && hora <=20){ //dia
digitalWrite(40,RELAY_ON);
}
else {
digitalWrite(40,RELAY_OFF);
}
delay(1000); // La informaci¢n se actualiza cada 1 seg.

for(int i=0;i<10;i++) //sensor ph
{
buf*=analogRead(analogInPin); *

  • delay(10);*
  • }*
  • for(int i=0;i<9;i++)*
  • {*
  • for(int j=i+1;j<10;j++)*
  • {*
    _ if(buf*>buf[j])_
    _
    {_
    _ temp=buf;
    buf=buf[j];
    buf[j]=temp;
    }
    }
    }
    avgValue=0;
    for(int i=2;i<8;i++)
    avgValue+=buf;
    float pHVol=(float)avgValue5.0/1024/6;

    float phValue = -5.70 * pHVol + 21.34;
    * lcd.setCursor(12,3);
    lcd.print("PH:");
    lcd.print(phValue); //sensor ph*

    * delay(2000);*_

* int lectura = analogRead (A15); //sensor de humedad *

* lcd.setCursor(0,2); //sensor de humedad*
* lcd.print("HUMEDAD:"); //sensor de humedad*

* if (lectura >=900){ //entre 1000 y 1023 sensor humedad*
* lcd.print("SECO");*

}
* else if (lectura < 900 && lectura >=500){ //entre 1000 y 600 sensor humedad*
* lcd.print("HUMEDO");*
}
* else if (lectura < 500){ //entre 600 y 0 sensor humedad*
* lcd.print("MOJADO");*
* }*
* //temperature = readTemperature(); // leer temperatura del sensor*
* gravityTds.setTemperature(temperature); // conpensar temperatura del sensor*
* gravityTds.update(); //sample and calculate*
* tdsValue = gravityTds.getTdsValue(); // obtener el valor de tds*
* lcd.setCursor(0,3);*
* lcd.print("TDS:");*
* lcd.print(tdsValue,0);*
* lcd.print(" PPM"); //sensor tds*
* lcd.setCursor(0,1); //sensor temperatura*
* lcd.print("TEMPERATURA:"); //sensor temperatura*
* sensorDS18B20.requestTemperatures(); //sensor temperatura*
* lcd.print(sensorDS18B20.getTempCByIndex(0)+1); //sensor temperatura*
* lcd.print(" C "); //sensor temperatura*

* }*
* }*
}
completo_5.ino (4.78 KB)

Primero tu codigo debe ir encasillado, lee las normas del foro para que veas como.

Asi a simple vista tu problema esta en los ciclos For y el uso del delay de 2s.

Como el conteo de los ciclos es corto no creo que afecte.

Tu problema es el uso del delay, recuerda que ese delay esta pausando durante 2s completos tu programa.
Busca mejor como usar millis() y lo mas probable es que con eso se resuelva.

hola Luis,voy hacer la prueba haber si asi lo soluciono.
Gracias.

Moderador
Gracias @Luiz_3110 por colaborar!!

Por favor @ciclido, edita tu post usando etiquetas de código, y no te quedes simplemente en lo que necesitas. Si vienes al foro primero cumple con sus normas y luego aprovecha las respuestas para resolver tu problema, no al revés.

Lee las Normas del foro

Como bien te dice @Luiz_3110, el problema esta en el delay() y cuando lo usas Arduino o cualquier micro deja de hacer cosas para perder el tiempo, cuanto tiempo? El que le digas entre paréntesis.
2000 mseg = 2seg haciendo NADA!!

La solución es millis()
Ve a Documentación => indice de temas tutoriales => millis() tienes 4 o 5 tutoriales para entenderlo y usarlo.

El flujo pasará de estar detenido a hacer lo que necesitas cuando corresponda. Pero te advierto, su uso no es complicado pero hay que modificar el código para que trabaje de otro modo y solo las tareas afectadas a los retardos se hagan en esos momentos.