Taller de Arduino

  • Iniciador del tema Iniciador del tema jmcadsl
  • Fecha de inicio Fecha de inicio
Estado
Cerrado para nuevas respuestas.
Ya tengo mi Controlador terminado. ha costado pero para lo que yo lo quiero ya esta completo.

voy a hacer un resumen de lo que tengo y lo que hace:

-controlo 4 enchufes con la placa de 4 relés.
-controla la pantalla de leds: enciende y apaga gradualmente o de golpe.

este es mi esquema de las conexiones:

[TodoMarino.com] Taller de Arduino


en el esquema todos los cables de 5V, se puede decir que estan todos conectados entre sí. Pasa igual con todos los negros (GND).

-tengo dos sondas de temperatura: una me da la temperatura ambiente y la otra dentro del acuario. con ellas puedo controlar que se encienda-apague el enchufe que yo quiera y ahi poder poner ventiladores o calentador o lo que queramos.
-otro enchufe lo tengo temporizado para que se encienda y se apague cada 3 horas, para la bomba del reactor de zeolitas.
-En otro enchufe tengo la pantalla de luces maxspect. se enciende de golpe a una hora y se apaga a otra.
-El enchufe restante de momento esta libre.
-Por la pantalla lcd me da la temperatura, dia y hora.
-tengo temporizado el encendido y apagado gradual del resto de leds con los que hago el amanecer y anochecer, con una fuente meanwell 60-48P graduable.

los componentes son los que hemos usado todos en el taller. tengo varios pines libres, por lo que en un futuro voy a poner sensores de nivel, para poder parar la subida en caso de desborde, poner peristalticas y cosas asi. pero eso ya es la version 2.

tengo el código muy ordenadito y explicado, y es muy simple.
Si alguien me dice como lo puedo poner aqui en una ventanita (para hacer scroll... y que no sea un tocho) lo añado.
 
Enhorabuena bbq. Ya se empiezan a ver resultados por aquí. Gran aporte el tuyo. Supongo que con el tag CODE puedes poner código ordenado. Lo dicho, muchas gracias.
 
ahi va
a ver como se ve:

////////////////////////////////////////////////////////////////////////
//// CONTROLADOR LUCES, VENTILADOR, ENCHUFES ACUARIO (de momento...)////
////////////////////////////////////////////////////////////////////////



////////////////////////////////////////////////////////
//// DEFINICIONES DE PINS USADOS Y LIBRERIAS USADAS ////
////////////////////////////////////////////////////////
#include <OneWire.h> //libreria para temperatura
#include <DallasTemperature.h> //otra libreria para temperatura
#include <Wire.h> //libreria para el reloj
#include <SLCD.h> //libreria para el LCD serial

#define ONE_WIRE_BUS 7 // temperatura, pin de entrada el 7
OneWire oneWire(ONE_WIRE_BUS); // temperatura
DallasTemperature sensors(&oneWire);// temperatura

#define DS1307_I2C_ADDRESS 0x68 //reloj


#define numRows 2 //LCD numero de filas
#define numCols 16 //LCD numero de columnas
SLCD lcd = SLCD(numRows, numCols); //LCD

int Rele1 = 2; //rele1, de momento libre. pero lo activo luego.
int Rele2 = 3; //rele2, luces2 al pin digital 3
int Rele3 = 4; //rele3, zeolita al pin gitital 4
int Rele4 = 5; //rele4, ventilador al pin digital 5
int meanwell = 10; //pin 10 aqui va la meanwell para dimear.

////////////////////////////////////////////////////////////////////////
//// HORARIOS DE LUCES, CAMBIAR AQUI LAS HORAS DE ENCENDIDO-APAGADO ////
////////////////////////////////////////////////////////////////////////
const byte encendidoluz2 = 12;
const byte apagadoluz2 = 20;


///////////////
//// RELOJ ////
///////////////
byte decToBcd(byte val)
{return ( (val/10*16) + (val%10) );}
byte bcdToDec(byte val)
{return ( (val/16*10) + (val%16) );}
byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;


///////////////
//// setup ////
///////////////
void setup()
{
pinMode(Rele1, OUTPUT);
pinMode(Rele2, OUTPUT);
pinMode(Rele3, OUTPUT);
pinMode(Rele4, OUTPUT);
Wire.begin(); //RELOJ
lcd.init(); //LCD
Serial.begin(9600); //LCD
sensors.begin(); //Temperatura
}





///////////////////////////////
//// LOOP, BUCLE PRINCIPAL ////
///////////////////////////////
void loop ()
{
lcdoff();
getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year); // LEEMOS LA HORA
InfoLcd(); //MUESTRA LA INFORMACION EN EL LCD
Luces(); //COMPRUEBA EL PROGRAMA Luces Y ENCENDERA/APAGARA RELE2 SEGUN TOQUE
ventilador(); //COMPRUEBA EL PROGRAMA VENTILADOR Y ENCENDERA/APAGARA RELE4 SEGUN TOQUE
zeolita(); //COMPRUEBA EL PROGRAMADO DEL HORARIO DEL RELE3 PARA LA BOMBA DEL REACTOR DE ZEOLITA
digitalWrite (Rele1, HIGH);//lo dejo siempre encendido. para enchufar aqui lo que sea.
amanecida(); //PROGRAMA DE AMANECER ANOCHECER CON LA MEANWELL Y LOS 10 LEDS.
}




///////////////////////////////
//// funciones secundarias ////
///////////////////////////////

//Iniciar LCD
void Lcdini ()
{
lcd.brightness(99);
lcd.displayOn();
lcd.clear();
}

//Apagar LCD
void lcdoff()
{
lcd.displayOff();
lcd.brightness(0);
}

// Pausa 3 segundos
void p ()
{
delay (3000);
}



////////////////////////////
//// PROGRAMAS DE LUCES ////
////////////////////////////

//caso 1: luces controladas por meanwell
void amanecida()
{
if (hour == 11 && minute < 2) // como va a tardar 255 segundos no volvera a entrar
{
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1)
{analogWrite(meanwell, fadeValue);
delay(2000);}
}
if (hour == 21 && minute < 2) // Para anochecer
{
for(int fadeValue = 255 ; fadeValue <= 0; fadeValue -=1)
{analogWrite(meanwell, fadeValue);
delay(2000);}
}
}
//caso 2: resto de luces que se encienden y apagan de golpe
//PARA CAMBIAR LA HORA IR A LA CONSTANTE DEFINIDA AL PRINCIPIO
void Luces()
{
if (hour >= encendidoluz2 && hour < apagadoluz2)
{digitalWrite (Rele2,HIGH);}
else
{digitalWrite (Rele2,LOW);}
}




//////////////////////////////////////////////////////////////////////////////
//// para encender y apagar la bomba del reactor de zeolitas cada 3 horas ////
//////////////////////////////////////////////////////////////////////////////
void zeolita()
{
if (((hour >= 1)&&(hour<=3)) || ((hour >= 7)&&(hour<=9)) || ((hour >= 13)&&(hour<=15)) || ((hour >= 19)&&(hour<=21)))
{digitalWrite (Rele3,HIGH);}
else
{digitalWrite (Rele3,LOW);}
}


/////////////////////////////
//// PROGRAMA VENTILADOR ////
/////////////////////////////
//CAMBIAR AQUI LA TEMPERATURA A CONTROLAR

void ventilador()
{

sensors.requestTemperatures(); //COMPRUEBA TEMPERATURA
if (sensors.getTempCByIndex(1)>27.50) //entre parentesis (1). uno es el acuario y cero el ambiente.
{digitalWrite(Rele4,HIGH);}
if (sensors.getTempCByIndex(1)<27.00)
{digitalWrite(Rele4,LOW);}
}



///////////////
//// RELOJ ////
///////////////
//AQUI no se toca nada. si hay que poner en hora ir al sketch del reloj solo.
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{

Wire.beginTransmission(DS1307_I2C_ADDRESS);
Wire.send(0);
Wire.endTransmission();
Wire.requestFrom(DS1307_I2C_ADDRESS, 7);


*second = bcdToDec(Wire.receive() & 0x7f);
*minute = bcdToDec(Wire.receive());
*hour = bcdToDec(Wire.receive() & 0x3f);
*dayOfWeek = bcdToDec(Wire.receive());
*dayOfMonth = bcdToDec(Wire.receive());
*month = bcdToDec(Wire.receive());
*year = bcdToDec(Wire.receive());
}


//////////////////////////////////////
//// INOFORMACION EN PANTALLA LCD ////
//////////////////////////////////////

void InfoLcd ()
{

//Nombre del proyecto
Lcdini(); //poner aqui el nombre de tu controlador, del acuario, de tu madre,
lcd.print(" KICO'S REEF ", 0, 2); //de tu gato, o el modelo de aquella moto que nunca os pudisteis comrar
lcd.print(" VER 1.0", 1, 4); //o poner "te quiero" y se lo enseñais a la parienta en san valentin (polvete...)
p();


// ahora para mostrar fecha y hora
p();
Lcdini();
lcd.print("Hora:",0,1);
if (hour < 10) Serial.print("0");
Serial.print(hour, DEC);
Serial.print(":");
if (minute < 10) Serial.print("0");
Serial.print(minute, DEC);
Serial.print(":");
if (second < 10) Serial.print("0");
Serial.print(second, DEC);

switch (dayOfWeek)
{
case 1:
lcd.print("Lun , ",1,0);
break;
case 2:
lcd.print("Mar , ",1,0);
break;
case 3:
lcd.print("Mie , ",1,0);
break;
case 4:
lcd.print("Jue , ",1,0);
break;
case 5:
lcd.print("Vie , ",1,0);
break;
case 6:
lcd.print("Sab , ",1,0);
break;
case 7:
lcd.print("Dom , ",1,0);
break;
}
Serial.print(dayOfMonth, DEC);
Serial.print("/");
if (month < 10) Serial.print("0");
Serial.print(month, DEC);
Serial.print("/");
Serial.print("20");
if (year < 10) Serial.print("0");
Serial.print(year, DEC);

p();
Lcdini();
sensors.requestTemperatures();
lcd.print("Temp. Ambiente: ",0,1);
Serial.print(sensors.getTempCByIndex(0));
p();
//FadeLcd();
Lcdini();
lcd.print("Temp. Acuario: ",0,0);
Serial.print(sensors.getTempCByIndex(1));
p();
lcdoff();
}
 
bueno no se ve del todo como yo queria peo si lo copiais y lo pegais en el programa del arduino se ve mas claro.
 
Gracias a los del foro! que ahí no hay nada original mio!! pues no soy bueno yo copiando... jaja
bueno para no tener ni idea de informatica ni de programar no se me ha dao del todo mal!
bueno si el dibujito de los cables. ese si que es mio. que me ha quedao pa enmarcarlo!
 
hola bbq:

muy sencillo y eficiente. el mismo rele del ventilador utilizalo para la temperatura igual que has echo con el ventilador y asi la temperatura la tendras clavada a los grados que quieras.
 
Enhorabuena bbq, muy bien documentado, sobretodo el diagrama, genial :-)

La mayoría hemos tenido más problemas de pines libres porque hemos metido un menú de configuración en el propio aparato, con al menos 3 botones, así podemos interactuar con el controlador sin tener que llevarlo al PC y conectarlo.

En mi caso además menos pines libres porque tengo dos placas de relés, y controlo las bombas las luces del refugio, 3 peristálticas, etc.

Total que te ha quedado muy "redondito"

Por cierto ¿con qué programa has hecho el diagrama?
 
se llama fritzing. yo pensaba ¿como hace la gente esos diagramitas tan chulos con dibujos y demás? y esta mañana en la pagina oficial de arduino he visto un link a la pagina de ese programa. yo no creo que lo use mas, es para gente que haga cosas de electronica. pero me ha venido de perlas! jeje
yo he pasado de botones y demas: el cable del portatil me llega al arduino: modifico, enchufo, cargo y listo. hubiera quedado mejor como no voy a estar trasteando...
 
no tienes la carpeta SLCD (la libreria del lcd serial) dentro de la carpeta libraries del programa del arduino.

Resuelto! La slcd que tenia le faltaban archivos... jjajaja me baje una nueva y ahora todo perfecto. muchas gracias chicos.
bbp increible aporte!
 
Muchas gracias a todos por la informacion que estais compartiendo y tambien a los que la ordenais.

Bueno me han dicho que mi pedido ya esta en camino, los lcd que tiene un modulo para hacerlo serial se configuran bien o dan problemas?

Saludos
 
me acabo de dar cuenta de que en el codigo que puse en un pequeño error: hay que cambiar un < por un >.

buscar un trozo como este y tiene que estar así:
{if (hour == 20 && minute < 2)
{for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1)
{analogWrite(meanwell, fadeValue);
delay(2000);}}}
 
bbq, que sea la última vez que te equivocas ehhh juas juas juas juas juas.
muchas gracias por todo
 
no fui yo... ese cachito lo copie literalmente del que me puso jmcadsl (ojo, que le estoy muy agradecido) en el post de este hilo #785. que mamón. yo mirando la luz que nunca se apagaba. jajaja
me he tirao como una hora hasta descubrir que pasaba!!
yo creo que jmcadsl lo hace aposta, para ver si pasamos la prueba. nos pone pequeñas trampas ocultas. como la barra / que falta al final del primer código de poner en hora el reloj. Esa me tuvo horas llorando!
jajajajaja
Gracias Jmcadsl! sabes que es coña!
 
Nos vamos a juntar y le hacemos un piquete en la puerta de su casa jajajajaja
 
Holaaa-

YA he recibido las placas de Reles a 5 voltios.

Tardaron pero ya están aquí. LA verdad pensaba que serian mas grandes de tamaño, asi que mejor, tienen una pinta estupenda.

Ahora empieza el cacharreo con ellas. Este fin de semana empezare con el cableado.
 
yo creo que jmcadsl lo hace aposta, para ver si pasamos la prueba. nos pone pequeñas trampas ocultas. como la barra / que falta al final del primer código de poner en hora el reloj. Esa me tuvo horas llorando!


JAJAJAJAA me encanta la idea, así los que copian tienen que mirar con lupa antes el código, e incluso si se te ha escapado algo, ya tienes escusa. Genial
 
NO por dios! que los que no tenemos ni idea lo pasamos realmente mal! no paras de pensar y por que no va... y por que al tio este si le va y a mi no... jaja
 
Estado
Cerrado para nuevas respuestas.
Atrás
Arriba