Mi controlador de acuario. (Ayuda).

Hola. En vista de que los proyectos que me encontre por internet no se adaptaban a mis necesidades he decidido montarme el mio propio.
Pero me he encontrado con algun que otro problemilla. Os cuento:

Al copilar no me da ningun error y cargo el sketch. Al alimentar el Arduino en la pantalla solo se enciende la retroiluminacion pero solo se ve unos cuadrados en la fila superior de la pantalla. Si miro el monitor serial si que veo lo que hace pero me da error continuamente por que me dice que no me detecta ninguna de las 2 sondas de temperatura.

Alguien me puede orientar para saber lo que estoi haciendo mal? Muchas gracias.

Los componentes son los siguientes:

-2 DS18B20.
-1 LCD 16*02 Serial IIC/I2C/TWI SPI
-1 Arduino Uno R3
-1 RTC DS1307
-1 Placa reles 4CH

El esquema:

Tened piedad de mi que es la primera vez que dibujo un esquema.

Y el sketck:

#include <LiquidCrystal.h>
#include <Wire.h>
#include <RelojDS1307.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define LUZ 3
#define LUZ_LUNA 9
#define TEMP 5
#define ALARMA 6
#define CAL_1 7
#define CAL_2 8

LiquidCrystal lcd(0);
RelojDS1307Class Reloj;
OneWire oneWire( TEMP );
DallasTemperature sensors(&oneWire);

DeviceAddress ACUARIO, GAMBARIO;

void setup()
{
Serial.begin(115200);
Wire.begin();
lcd.setBacklight(HIGH);
Reloj.SetDateTime( 27, 01, 13, 17, 37, 00 );

lcd.begin(16, 2);
lcd.setBacklight(HIGH);

pinMode(LUZ, OUTPUT);
pinMode(LUZ_LUNA, OUTPUT);
pinMode(ALARMA, INPUT);
pinMode(CAL1, OUTPUT);
pinMode(CAL2, OUTPUT);
pinMode(TEMP, INPUT);
pinMode(NIVEL, INPUT);

}

void loop()
{
sensors.begin();
if (sensors.getDeviceCount() < 2);
{
Serial.println("Fallo en sensores de temperatura");
lcd.setCursor(0,0);
lcd.print( "Fallo Temp1" );
}
if (!sensors.getAddress(GAMBARIO, 0));
{
Serial.println("Fallo en sensor Gambario");
lcd.setCursor(0,0);
lcd.print( "Fallo Temp2" );
}

if (!sensors.getAddress(ACUARIO, 1));
{
Serial.println("Fallo en sensor Acuario");
lcd.setCursor(0,0);
lcd.print( "Fallo Temp1" );
}

float TEMP1 = sensors.getTempC(ACUARIO);
float TEMP2 = sensors.getTempC(GAMBARIO);

lcd.setCursor(4,0);
lcd.print(Reloj.Time());

lcd.setCursor(0,1);
lcd.print("Acuario: ");
lcd.print(TEMP1, 0);
lcd.print("C");
delay(3000);
lcd.setCursor(0,1);
lcd.print("Gambario: ");
lcd.print(TEMP2, 0);
lcd.print("C");

if(TEMP1 < 25)
{
digitalWrite (CAL_1, HIGH);
}

if(TEMP1 > 25)
{
digitalWrite (CAL_1, LOW);
}

if(TEMP2 < 25)
{
digitalWrite (CAL_2, HIGH);
}

if(TEMP2 > 25)
{
digitalWrite (CAL_2, LOW);
}

if(Reloj.IsLater(10, 0))
{
digitalWrite(LUZ, HIGH);
digitalWrite(LUZ_LUNA, LOW);
}

if(Reloj.IsLater(20, 0))
{
digitalWrite(LUZ, LOW);
digitalWrite(LUZ_LUNA, HIGH);
}
}

¿Has probado cada componente por separado para familiarizarte con su uso?. Primero el LCD solo con Arduino y luego los demás.
Es lo que haría yo.

Jopapa

que error?

¿Has probado por separado?

¿Has probado esta conexion de la sonda y el ejemplo del playground para salir de dudas?

Jopapa:
¿Has probado cada componente por separado para familiarizarte con su uso?. Primero el LCD solo con Arduino y luego los demás.
Es lo que haría yo.

Jopapa

Hola. Ya he trabajado con todos los componentes a excepcion de las sondas de temperatura conectadas por I2C

Sergegsx:
que error?

Si te refieres a los que me muestra por el monitor serial, me dice lo que le pedi en caso de error en las sondas de temperatura:

Fallo en sensores de temperatura
Fallo en sensor Gambario
Fallo en sensor Acuario...................... (se repite continuamente)

Heke:
¿Has probado por separado?

¿Has probado esta conexion de la sonda y el ejemplo del playground para salir de dudas?

Pues la verdad es que no. Me esperaba un error en el sketch por que tampoco es que sea un entendido aunque me valla montando algun proyecto desde 0. Por si las moscas lo provare a ver que pasa.

Gracias a todos. Os seguire informando.

Respecto al estado actual del cableado y del sketch teneis algo que decirme (que este mal o que falte))

desconecta todo. conecta solo las sondas de temperatura.
prueba diferentes codigos y librerias hasta que funcoinen las sondas de tempertura.

por cierto, no son I2C las sondas. ah y conecta solo una, luego cuando funcione, conecta otra.

Hola de nuevo.
Hoy os traigo buenas noticias... ya se me ven las temperaturas de 2 ds18b20 en el lcd pero con esto me asalta otra dudilla :stuck_out_tongue: XD :blush:.... Como puedo hacer para que solo se me vean en la pantalla las temperaturas con 1 decimal?

El codigo es casi todo nuevo al menos en lo que se refiere a las sondas de temperatura.

Otra cosa que tampoco soy capaz de hacer funcionar son los reles de la iluminacion (LUZ y LUZLUNA), van condicionados por la hora pero no se encienden nunca, mientras que los de calefaccion van perfectos pues se encienden y apagan al calentar o enfriar las sondas.

#include <LiquidCrystal.h>
#include <RelojDS1307.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

#define TEMP           7
#define LUZ            8
#define LUZLUNA        4
#define CAL1           5
#define CAL2           6


#define PRECISION      9

OneWire oneWire(TEMP);
DallasTemperature sensors(&oneWire);
DeviceAddress ACUARIO, GAMBARIO;
LiquidCrystal lcd(0);
RelojDS1307Class Reloj;

void setup(void)
{
  Serial.begin(9600);
  
  //Reloj.SetDateTime( 30, 01, 13, 00, 31, 20 );

  sensors.begin();
  lcd.begin(16, 2);
  lcd.setBacklight(HIGH);
  
  pinMode(LUZ, OUTPUT);
  pinMode(LUZLUNA, OUTPUT);
  pinMode(CAL1, OUTPUT);
  pinMode(CAL2, OUTPUT);


  Serial.print("Localizando sondas de temperatura: ");
  Serial.print("Encontradas  ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" sondas.");

  if (!sensors.getAddress(ACUARIO, 0)) Serial.println("INCAPAZ DE ENCONTRAR SONDA ACUARIO"); 
  if (!sensors.getAddress(GAMBARIO, 1)) Serial.println("INCAPAZ DE ENCONTRAR SONDA GAMBARIO"); 

}

  

void printTemperature(DeviceAddress deviceAddress)
{
  float AGUA1 = sensors.getTempC(ACUARIO);
  float AGUA2 = sensors.getTempC(GAMBARIO);
  Serial.print("A: ");
  Serial.print(AGUA1);
  Serial.print("  ");
  Serial.print("G: ");
  Serial.print(AGUA2);
  Serial.print("  ");
  lcd.setCursor(4,0);
  lcd.print(Reloj.Time());
  lcd.setCursor(0,1);
  lcd.setCursor(0,1);
  lcd.print("A:");
  lcd.print(AGUA1);
  lcd.setCursor(9,1);
  lcd.print("G:");
  lcd.print(AGUA2);


}


void printData(DeviceAddress deviceAddress)
{
  printTemperature(deviceAddress);
  Serial.println();
}

void loop(void)
{ 
  Serial.print("Recibiendo temperaturas...");
  sensors.requestTemperatures();
  Serial.println("OK");

  printData(ACUARIO);
  printData(GAMBARIO);
  
  float AGUA1 = sensors.getTempC(ACUARIO);
  float AGUA2 = sensors.getTempC(GAMBARIO);
  if(AGUA1 < 25)
  {
    digitalWrite (CAL1, HIGH);
  }
  
  if(AGUA1 > 25)
  {
    digitalWrite (CAL1, LOW);
  }
  
  if(AGUA2 < 25)
  {
    digitalWrite (CAL2, HIGH);
  }
  
  if(AGUA2 > 25)
  {
    digitalWrite (CAL2, LOW);
  }
  
  
  if(Reloj.IsLater(10, 00) && Reloj.IsPrevious(20, 00))
  {
    digitalWrite(LUZ, HIGH);
    digitalWrite(LUZLUNA, LOW);
  }
   
   
  if(Reloj.IsLater(20, 00) && Reloj.IsPrevious(10, 00))
  {
    digitalWrite(LUZ, LOW);
    digitalWrite(LUZLUNA, HIGH);
  }

}

olvidate de los leds, pon un println dentro de la condición if y mira a ver si entra en la condición

if(Reloj.IsLater(20, 00) && Reloj.IsPrevious(10, 00))

nunca he usado la funcion isLater, puede que no funcione bien o que estes haciendo algo mal.

Pon como lo has solucionado y asi ayudas a cualquiera que se vea en la misma situacion y llegue a este post.

Hola,

Respecto al DS18B20, tengo unas preguntillas:

  • ¿A qué distancia máxima se le puede poner desde el Arduino?
  • ¿Sería necesario usar cable con blindaje (apantallamiento interno) para largas distancias (30mts) ?

Gracias por vuestra ayuda.

En poco sunire todo el proyecto una vez finalizado.
Yo con los ds18b20 que vienen encapsulados a prueba de agua, me apaño con el cable que tienen. Para tu caso ya no tengo ni idea.

Hol. Despues de un tiempo "fuera de combate" por motivos de trabajo continuo con este proyecto pues el LCD de 16x04 se me antojaba algo pequeño y me acabo de pillar un Lcd de 20x04 pero no consigo hacerla funcionar con el codigo de la 16x04 y no se lo que hago mal.
Os adjunto el sketch de la 16x04 que funciona:

#include <LiquidCrystal.h>
#include <RelojDS1307.h>
#include <Wire.h>
#include <OneWire.h>
#include <DallasTemperature.h>

/*Definimos los PINS*/
#define TEMP           7
#define LUZ            8
#define LUZLUNA        4
#define CAL1           5
#define CAL2           6


OneWire oneWire(TEMP);
DallasTemperature sensors(&oneWire);
DeviceAddress ACUARIO, GAMBARIO;
LiquidCrystal lcd(0);
RelojDS1307Class Reloj;

void setup(void)
{
  Serial.begin(9600);
  
  //Reloj.SetDateTime( 30, 01, 13, 17, 25, 00 );

  sensors.begin();
  lcd.begin(16, 2);
  lcd.setBacklight(HIGH);
  
  pinMode(LUZ, OUTPUT);
  pinMode(LUZLUNA, OUTPUT);
  pinMode(CAL1, OUTPUT);
  pinMode(CAL2, OUTPUT);

/*Cmiramos si estan todas las sondas conectadas mediante el serial monitor*/
  Serial.print("Localizando sondas de temperatura: ");
  Serial.print("Encontradas  ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" sondas.");

}





void loop(void)
{ 
  Serial.print("Recibiendo temperaturas...");
  sensors.requestTemperatures();
  Serial.println("OK");

  printData(ACUARIO);
  printData(GAMBARIO);
  
  float AGUA1 = sensors.getTempC(ACUARIO);
  float AGUA2 = sensors.getTempC(GAMBARIO);
 
 
 
 //Configuracion de las temperaturas
  if(AGUA1 < 24)
  {
    digitalWrite (CAL1, HIGH);
  }
  
  if(AGUA1 > 25)
  {
    digitalWrite (CAL1, LOW);
  }
  
  if(AGUA2 < 24)
  {
    digitalWrite (CAL2, HIGH);
  }
  
  if(AGUA2 > 25)
  {
    digitalWrite (CAL2, LOW);
  }
  
  
  //Configuracion del encedido y apagado de las luces
  if(Reloj.IsLater(9, 59) && Reloj.IsPrevious(21, 59))
  {
    digitalWrite(LUZ, HIGH);
    digitalWrite(LUZLUNA, LOW);
  }
   
  else
  {
    digitalWrite(LUZ, LOW);
    digitalWrite(LUZLUNA, HIGH);
  }
  
 
 /*Con esto mostraremos un error en el lcd en el lugar de la temperatura correspondiente*/
  if (!sensors.getAddress(ACUARIO, 0))
 { 
  Serial.println("INCAPAZ DE ENCONTRAR SONDA ACUARIO");
  lcd.setCursor(2,1);
  lcd.print("ERROR");
 } 
  if (!sensors.getAddress(GAMBARIO, 1)) 
  {
  Serial.println("INCAPAZ DE ENCONTRAR SONDA GAMBARIO");
  lcd.setCursor(11,1);
  lcd.print("ERROR");
  }
}



void printData(DeviceAddress deviceAddress)
{
  printTemperature(deviceAddress);
  Serial.println();
}


void printTemperature(DeviceAddress deviceAddress)
{
  float AGUA1 = sensors.getTempC(ACUARIO);
  float AGUA2 = sensors.getTempC(GAMBARIO);
  Serial.print("A: ");
  Serial.print(AGUA1);
  Serial.print("  ");
  Serial.print("G: ");
  Serial.print(AGUA2);
  Serial.print("  ");
  lcd.setCursor(4,0);
  lcd.print(Reloj.Time());
  lcd.setCursor(0,1);
  lcd.setCursor(0,1);
  lcd.print("A:");
  lcd.print(AGUA1);
  lcd.setCursor(7,1);
  lcd.print("  G:");
  lcd.print(AGUA2);


}

El LCD que me he comprado viene a ser uno como este (aunque no es exactamente el mismo vendedor):

http://www.ebay.es/itm/Arduino-Serial-IIC-I2C-TWI-2004-204-Character-LCD-Module-Display-/200764158676?pt=LH_DefaultDomain_0&hash=item2ebe79f2d4

Alguien me puede ayudar para saber en que difiere la prgramacion de la 16x02 de la 20x04?

EA3BIL:
Hola,
Respecto al DS18B20, tengo unas preguntillas:

  • ¿A qué distancia máxima se le puede poner desde el Arduino?
  • ¿Sería necesario usar cable con blindaje (apantallamiento interno) para largas distancias (30mts) ?

Gracias por vuestra ayuda.

Por poderse se pueden llegar a poner muy lejos, otra cosa que sea fácil, porque los cables se empiezan a comportar como cables :grin: y los circuitos de interfaz con el controlador se complican, no vale la simple resistencia y el sensor en modo parásito.
Pista: Dallas habla de cable de par trenzado en sus application note, pero no blindado.
El tema da para un post dedicado.

Respecto al tema del este post, veo que tus problemas con el DS18B20 se limitaban al uso de la biblioteca DallasTemperature. No es una biblioteca sencilla de entender ni me acaba de gustar, aunque es bastante completa. También me costó un poco ponerl a a funcionar.

La pantalla del chino ¿no es I2C? que me corrijan si meto la pata, pero me suena que la biblioteca de Arduino no es adecuada para este tipo de pantallas, sino para las que llevan el chip HD44780, por ej: http://www.ebay.es/itm/Character-LCD-Module-LCM-JHD404A-Y-YG-HD44780-/200545027053?pt=LH_DefaultDomain_0&hash=item2eb16a43ed

Y si uso una libreria LiquidCristal_I2C???

Nuevo sketch funcionando pero esta vez para un LCD 2004 I2C. Solo tuve que cambiar la libreria y un par de detalles. Luego hay otros cambios pero para colocar cada cosa en su sitio en el LCD.

#include <DallasTemperature.h>
#include <OneWire.h>
#include <RelojDS1307.h>
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>

/*Definimos los PINS*/
#define TEMP           7
#define LUZ            8
#define LUZLUNA        4
#define CAL1           5
#define CAL2           6

LiquidCrystal_I2C lcd(0x27,20,4);
OneWire oneWire(TEMP);
DallasTemperature sensors(&oneWire);
DeviceAddress ACUARIO, GAMBARIO;
RelojDS1307Class Reloj;

void setup()
{
  Serial.begin(9600);
  lcd.init();
  lcd.backlight();
  
  pinMode(LUZ, OUTPUT);
  pinMode(LUZLUNA, OUTPUT);
  pinMode(CAL1, OUTPUT);
  pinMode(CAL2, OUTPUT);
  
  /*Cmiramos si estan todas las sondas conectadas mediante el serial monitor*/
  Serial.print("Localizando sondas de temperatura: ");
  Serial.print("Encontradas  ");
  Serial.print(sensors.getDeviceCount(), DEC);
  Serial.println(" sondas.");
}

void loop()

{ 
  Serial.print("Recibiendo temperaturas...");
  sensors.requestTemperatures();
  Serial.println("OK");

  printData(ACUARIO);
  printData(GAMBARIO);
  
  float AGUA1 = sensors.getTempC(ACUARIO);
  float AGUA2 = sensors.getTempC(GAMBARIO);
 
 
 
 //Configuracion de las temperaturas
  if(AGUA1 < 24)
  {
    digitalWrite (CAL1, HIGH);
  }
  
  if(AGUA1 > 25)
  {
    digitalWrite (CAL1, LOW);
  }
  
  if(AGUA2 < 24)
  {
    digitalWrite (CAL2, HIGH);
  }
  
  if(AGUA2 > 25)
  {
    digitalWrite (CAL2, LOW);
  }
  
  
  //Configuracion del encedido y apagado de las luces
  if(Reloj.IsLater(9, 59) && Reloj.IsPrevious(21, 59))
  {
    digitalWrite(LUZ, HIGH);
    digitalWrite(LUZLUNA, LOW);
  }
   
  else
  {
    digitalWrite(LUZ, LOW);
    digitalWrite(LUZLUNA, HIGH);
  }
  
 
 /*Con esto mostraremos un error en el lcd en el lugar de la temperatura correspondiente*/
  if (!sensors.getAddress(ACUARIO, 0))
 { 
  Serial.println("INCAPAZ DE ENCONTRAR SONDA ACUARIO");
  lcd.setCursor(0,1);
  lcd.print("FALLO S1");

 } 
  if (!sensors.getAddress(GAMBARIO, 1)) 
  {
  Serial.println("INCAPAZ DE ENCONTRAR SONDA GAMBARIO");
  lcd.setCursor(10,1);
  lcd.print("FALLO S2");

  }
}



void printData(DeviceAddress deviceAddress)
{
  printTemperature(deviceAddress);
  Serial.println();
}


void printTemperature(DeviceAddress deviceAddress)
{
  float AGUA1 = sensors.getTempC(ACUARIO);
  float AGUA2 = sensors.getTempC(GAMBARIO);
  Serial.print("ACUARIO: ");
  Serial.print(AGUA1);
  Serial.print("  ");
  Serial.print("GAMBARIO: ");
  Serial.print(AGUA2);
  Serial.print("  ");
  lcd.setCursor(0,0);
  lcd.print(Reloj.DateTime());
  lcd.setCursor(0,2);
  lcd.print("ACUARIO:  ");
  lcd.print(AGUA1);
  lcd.setCursor(0,3);
  lcd.print("GAMBARIO: ");
  lcd.print(AGUA2);
}

Pues mira, nunca he usado un LCD I2C pero en vista de lo práctico que me parece su uso y lo que me gustan los integrados I2C, me guardo tu ejemplo.

jray:
Pues mira, nunca he usado un LCD I2C pero en vista de lo práctico que me parece su uso y lo que me gustan los integrados I2C, me guardo tu ejemplo.

Me alegro que te sirva de ayuda.

Hola amigos me podeis ayudar?
Yo quiero este controlador de acuario que se me adapta a la perfeccion. El problema que tengo es que no me lo compila me da errores en las librerias, entre otros
El caso es que uso practicamente lo mismo o eso creo
Arduino UNO
Lcd i2c (YwRobot Arduino LCM1602 IIC V1) 20×4
Reloj ds1307
Sonda DS1820
Y modulo de 4 reles
Me echariais una mano?

Hola amigos me podeis ayudar?
Yo quiero este controlador de acuario que se me adapta a la perfeccion. El problema que tengo es que no me lo compila me da errores en las librerias, entre otros
El caso es que uso practicamente lo mismo o eso creo
Arduino UNO
Lcd i2c (YwRobot Arduino LCM1602 IIC V1) 20×4
Reloj ds1307
Sonda DS1820
Y modulo de 4 reles
Me echariais una mano?