Go Down

Topic: Mi controlador de acuario. (Ayuda). (Read 4179 times) previous topic - next topic

martinrv84

Jan 27, 2013, 06:52 pm Last Edit: Jan 27, 2013, 06:54 pm by martinrv84 Reason: 1
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:

Quote

#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);
  }
}
 


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

Sergegsx


Heke

¿Has probado por separado?

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

CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

martinrv84


¿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


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)



¿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.

martinrv84

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

Sergegsx

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.

martinrv84

#7
Jan 30, 2013, 12:30 am Last Edit: Jan 30, 2013, 01:41 am by martinrv84 Reason: 1
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 :P XD :smiley-red:.... 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.

Code: [Select]
#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);
  }

}

Sergegsx

olvidate de los leds, pon un println dentro de la condición if y mira a ver si entra en la condición
Quote
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.

Heke

Pon como lo has solucionado y asi ayudas a cualquiera que se vea en la misma situacion y llegue a este post.
CUIDADO !! MIS POST NO SON APTOS PARA MENORES. SI ERES MENOR DE 14 AÑOS DEBES DE LEERLOS ACOMPAÑADO DE UN ADULTO

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.

martinrv84

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.

martinrv84

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:

Code: [Select]

#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?

jray

#13
Apr 16, 2013, 09:21 pm Last Edit: Apr 16, 2013, 09:27 pm by jray Reason: 1

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  :smiley-mr-green: 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

martinrv84

Y si uso una libreria LiquidCristal_I2C???

Go Up