Pages: [1] 2   Go Down
Author Topic: Mi controlador de acuario. (Ayuda).  (Read 3580 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

« Last Edit: January 27, 2013, 12:54:46 pm by martinrv84 » Logged

Alicante (España)
Offline Offline
Full Member
***
Karma: 13
Posts: 233
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

que error?
Logged

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 958
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

¿Has probado por separado?

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

Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-razz smiley-lol 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:
#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);
  }

}
« Last Edit: January 29, 2013, 07:41:47 pm by martinrv84 » Logged

0
Offline Offline
Edison Member
*
Karma: 17
Posts: 1413
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

* Si preguntas, pon el código de tu programa, hace mucho mas fácil ayudarte. Y me ahorro un mensaje pidiendo que lo hagas.
* Si consigues solucionar tu problema, dedica unos minutos a explicar en tu post como lo conseguiste para beneficio de todos.
* Cambia el 'Subject' de tu hilo y añade 'SOLUCIONADO' cuando hayas llegado a una solución al problema que planteaste.
* Utiliza un 'Subject' para tu hilo que explique de que va el hilo.
Si estas empezando:
* Comienza a usar Arduino
* Guías de iniciación a Arduino
* Ejemplos
* Referencia del Lenguaje
* Conceptos básicos
Guia de usuario de arduino
Tutoriales en Ingles
Si necesitas que alguien te escriba el código: http://www.freelancer.com/  o esta  http://www.guru.com/

Spain
Offline Offline
God Member
*****
Karma: 25
Posts: 958
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

Barcelona
Offline Offline
Newbie
*
Karma: 0
Posts: 12
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Jr. Member
**
Karma: 3
Posts: 88
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: April 16, 2013, 02:27:35 pm by jray » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 31
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Y si uso una libreria LiquidCristal_I2C???
Logged

Pages: [1] 2   Go Up
Jump to: