Acuariofilia Madrid

Versión completa: Diseño de un programador básico de acuario con arduino
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
Bueno,por fin he conseguido leerme todo el tema y ya he pedido esta mañana lo que me faltaba, lo mas urgente el reloj y los reles, para lo demás tengo para ir probando, pero hasta que no tenga el reloj mal voy.
Solo deciros una cosa, espectacular el tema y las explicaciones de los expertos, espero ansioso que me lleguen las cosas e ir avanzando, mientras tanto seguiré disfrutando viendo vuestros montajes y avanzes
(02-03-2016, 11:27 AM)CeBeR escribió: [ -> ]Bueno,por fin he conseguido leerme todo el tema y ya he pedido esta mañana lo que me faltaba, lo mas urgente el reloj y los reles, para lo demás tengo para ir probando, pero hasta que no tenga el reloj mal voy.
Solo deciros una cosa, espectacular el tema y las explicaciones de los expertos, espero ansioso que me lleguen las cosas e ir avanzando, mientras tanto seguiré disfrutando viendo vuestros montajes y avanzes

Para practicar y hacer pruebas la placa arduino puede ser de diferente modelo pero pensando en colocar la instalación en un acuario compra ya un pro-micro, que en china están baratos (si te defiendes algo soldando). La fuente/regulador de alimentación lo mismo aunque eso con un poco de maña y un 7805 se solventa. El cablerio y varios con cualquier cosa se apaña.
(02-03-2016, 01:36 PM)ArturoS escribió: [ -> ]Para practicar y hacer pruebas la placa arduino puede ser de diferente modelo pero pensando en colocar la instalación en un acuario compra ya un pro-micro, que en china están baratos (si te defiendes algo soldando). La fuente/regulador de alimentación lo mismo aunque eso con un poco de maña y un 7805 se solventa. El cablerio y varios con cualquier cosa se apaña.

Muchas gracias ArturoS, si, voy a pedir todo mas o menos como lo estáis proponiendo, yo de momento tengo un kit Arduino que me trajeron los Reyes Magos aunque no lo he podido trastear mucho, solo hacer un par de montajes de muestra con leds y cosas así para ir calentando, de momento con lo que tengo (Arduino Uno, fuente y regulador de tensión, aunque este es de los de placa protoboard) solo me falta el reloj y los reles para ir trasteando y pedire todo lo demas para dejarlo fijo cuando lo monte en serio.
Para prácticas, la simulación de los relés, se puede hacer en la protoboard con unos led y unas resis, pero para el reloj, necesitas el modulo si o si.
(01-03-2016, 12:52 AM)ArturoS escribió: [ -> ]Pedro, para ir probando con el A Uno

Conecta el bus I2C entre el reloj DS3231 (patillas SDA, SCL ) y el Uno a los pines A4, A5 respectivamente.

Conecta los pines del Uno 4 a 7 (digitales) a la placa del relé

Alimenta desde el arduino desde V5 y GND a DS3231 y Reles (para pruebas de poco s min no hace falta poner la fuente, se alimentará desde el PC por el USB), obviamente a los pines V5 (o V+) y GND de ambos.

No es necesario que conectes nada a la salida de los reles, la placa lleva unos leds que te indicarán que reles se activan, y para pruebas vale.

En el PC, en el ide de Arduino en Herramientas > Placa selecciona el Arduino Uno

Conecta el USB desde el pc (espera o comprueba que reconozca la conexion USB del arduino) y prueba el programa que comenta Antonio PruLeds.ino.

Después puedes probar CAO_SETA_v1_0.ino que es el programa principal del PBAA.

De entrada abre el monitor serie (lupa arriba dcha) y pon en fecha/hora el reloj (la real o una que fijes para las pruebas)
Tecleando "a 29 02 16 23 10 00" (sin comillas y es a dd mm aa hh mm ss) e intro
También puede pulsar I e intro y ver un informe.

Posteriormente fíjate lo que comenta Antonio al principio del código y en la rutina void SetPinsProgram() que es donde se definen los pines a usar y la programación de los mismos.

Aparte de los ejemplos que incluye Antonio para probar, te dejo lo que tengo yo puesto como programador de tres luces

Código:
void SetPinsProgram(){
    // Activacion de los pines
    ProgPins.ConfigurarPin(4, HIGH); // luz 1
    ProgPins.ConfigurarPin(5, HIGH); // luz 2
    ProgPins.ConfigurarPin(6, HIGH); // reservado otro uso
    ProgPins.ConfigurarPin(7, HIGH); // luz noche

    // Crear pulsos programacion horaria
    ProgPins.CrearPulso(4, 14, 0, 0, 8, 0, 0); // Pin4 encender 2 pm durante 8 h - apaga 10 pm
    ProgPins.CrearPulso(5, 14, 30, 0, 8, 0, 0); // Pin5 encender 2:30 pm durante 8 h - apaga 10:30 pm
      //ProgPins.CrearPulso(6, 13, 30, 0, 8, 0, 0); // Pin6 encender 01:30 pm durante 8h  - apaga 09:30 pm
    ProgPins.CrearPulso(7, 12, 30, 0, 11, 30, 0); // Pin7 encender 12:30 pm durante 11:30 h - apaga 00:00 pm
    ProgPins.CrearPulso(7, 0, 0, 0, 1, 0, 0); // Pin7 encender 00:00 pm durante 1 h  - apaga 01:00 am
}

Ya ves lo sencillo que es establecer una programación horaria.



rbaby, en www.prometec.net encontras montajes y ejemplos en español de muchos de los modulos que te han llegado

perdona Arturo que quieres decir con conecta el i2c.: Blush
A ver si te comento lo que tengo montado hasta ahora:
modulo relés:
GND CON GND Arduino
1IN CON PIN 7 DIGITAL
2IN CON PIN 4 DIGITAL
VCC CON 5v arduino.

modulo reloj:
VCC CON 5v arduino.
GND CON GND Arduino
SDA CON A4
SCL CON A5
Creo que el bus I2C corresponde con los dos pines SDA y SCL
Ya lo he puesto en marcha, he compilado el CAO_SETA_V1 y si... se activa el led IN2
ahora estoy con luces pero mu despistao -pardon.gif

[Imagen: ja5u2Gt.jpg]
(02-03-2016, 08:17 PM)pedmar escribió: [ -> ]Ya lo he puesto en marcha, he compilado el CAO_SETA_V1 y si... se activa el led IN2
ahora estoy con luces pero mu despistao -pardon.gif

Puedes ejecutar con el Arduino enchufado por USB y no sé si has abierto alguna vez el monitor serial en el IDE. Inténtalo para comunicar Arduino con el PC y que dialoguen.

Te explico como va la programación, pero solo para que veas que se está ejecutando el programa.

Lo primero que se ejecuta en Arduino es la función siguiente:

Código:
void setup(){
    Wire.begin();
    Serial.begin(9600); // Intentamos inicializar a 9600 baudios
    [...]
    [...]
    HelpIntro();
}
El monitor Serial tiene este aspecto:
[Imagen: td_serial_1.png]
El ejemplo es de otro programa. Lo pongo solo por si todavía no lo has localizado el Terminal Serial.

Cuando abras el monitor Serial en el IDE empezarás a recibir la información que Arduino manda al PC por el puerto USB.

Concretamente la función setup() termina llamando a la función HelpIntro(); llena de instrucciones de escritura en el puerto Serial.

Código:
// *****************************************************************************************
// Ayuda a la introduccion de datos para puesta en hora
// *****************************************************************************************
void HelpIntro(){
    Serial.println();
    SerialPrintLnAsteriscos(); // ************************************************************
    Serial.print(F("CaoSeta: V1.0 (Beta). Ultima compilacion: "));
    Serial.print(__DATE__);
    Serial.print(' ');
    Serial.println(__TIME__);
    Serial.print(F("PRIMER_PIN="));
    Serial.print(PRIMER_PIN);
    Serial.print(F(", MAXNUM_PINS="));
    Serial.print(MAXNUM_PINS);
    Serial.print(F(", MAXNUM_PULSOS="));
    Serial.print(MAXNUM_PULSOS);
    Serial.print(F(", Memoria libre="));
    Serial.println(freeMemory());    
    SerialPrintLnAsteriscos(); // ************************************************************
    Serial.println(F("****                         M  E  N  U                            ****"));
    SerialPrintLnAsteriscos(); // ************************************************************
    Serial.println(F("1)  Para visualizar esta ayuda introduzca una 'H'."));
    Serial.println(F("2)  Para (A)justar fecha y hora del reloj interno introduzca una 'A'"));
    Serial.println(F("    seguida de un blanco y seis numeros separados por blancos. Por ejemplo:"));
    Serial.println(F("    'A 31 12 15 23 59 59' para  31/12/2015 23:59:59."));
    Serial.println(F("3)  Para visualizar un (I)nforme de diagnostico introduzca una 'I'."));
    Serial.println(F("4)  Para pasar de modo (V)erbose a noVerbose y viceversa introduzca 'V'."));
    SerialPrintLnAsteriscos(); // ************************************************************
    Serial.println();
}

Verás una linea para introducir datos que será leida dentro del bucle principal loop()
Código:
// *****************************************************************************************
// **** MAIN LOOP ****
// *****************************************************************************************
void loop(){
    GetMonitorSerial(); // Si hay conexion serial permite ajuste
    [...]
   [...]
}

GetMonitorSerial() es la función que mira si has introducido algo en esa línea (hay que terminar con la tecla <Intro>) y en caso de haber introducido algo mirará si es alguno de los comandos que el programa tiene previsto atender.
Lo del I2C, es lo que te han comentado, está bien conectado (si alguno lo quiere hacer sobre el pro-micro los pines a conectar son 2 y 3).

Los pines del relé han de conectarse preferiblemente seguidos, es decir
pin4 a 1IN
pin5 a 2IN
pin6 a 3IN
pin7 a 4IN
Demasiado literal te lo tomaste, mencionaba un tramo, así como lo has puesto solo controlas 2 relés

Y como dice Antonio, de momento no alimentes arduino con DC, que tome la alimentación por el USB, así conectado por USB podrás activar el monitor serie (la lupa del IDE), donde se puede ajustar fecha/hora, ver la configuración y ver (creo que cada 15 seg) el estado de los pines según avanza el tiempo.

Ya entonces haces pruebas con diferentes programaciones en SetPinsProgram()

Pero recuerda para cada pin/rele conectado tienes que tener una línea ProgPins.ConfigurarPin, donde se define/configura el pin.
(en esos módulos de rele he observado que hay que configurarlos High, para que en reposo se mantengan apagados)

Y para cada pulso definido sobre un pin se necesita una linea ProgPins.CrearPulso.
Aunque se pueden definir varias sobre el mismo pin (en el ejemplo que pusé anteriormente yo definía 2 consecutivas sobre el pin 7, para hacer continuo el fin del día ya que los pulsos todos acaban como máximo a fin de día)

Ya mas avanzado, puedes alimentar la protoboard (con el transfomador + el modulo regulador, o el regulador de protoboard) y tener el sistema funcionando independiente del USB del pc




¿Antonio, la revisión del código para el tema del While(!serial), la vas a colgar nueva o comentamos la modificación aquí para que se modifique manualmente?
(03-03-2016, 03:06 PM)ArturoS escribió: [ -> ]¿Antonio, la revisión del código para el tema del While(!serial), la vas a colgar nueva o comentamos la modificación aquí para que se modifique manualmente?

Pues al final se me olvidó comentarlo aquí. Gracias por recordármelo Arturo.

Como es poco lo que me parece más adecuado es publicar aquí el parche advirtiendo que solo lo van a necesitar los que usen Arduino Pro Micro .

Arduino UNO, Arduino Pro Mini, y Arduino Mega entre otros, no necesitan el parche.

Dado que el Arduino Pro Micro se quedaría esperando eternamente si se usa sin conexión al PC por USB, lo mejor es conceder 5 segundos de gracia para que el usuario conecte el monitor Serial y si no lo hace proseguir sin conexión Serial.

El parche es muy sencillito y las novedades las pongo en rojo. Se añade una línea antes se la función setup() y dentro de la función setup() se hacen algunas cosas más según puede verse a continuación:

#define TIMEOUT_SERIAL 5000 // Esperamos como máximo 5 segundos a la conexion Serial

void setup(){
Serial.begin(9600); // Intentamos inicializar a 9600 baudios
int t1=millis(); // Tomamos referencia del tiempo en t1
// Mientras no transcurran TIMEOUT_SERIAL milisegundos
while (millis()-t1<TIMEOUT_SERIAL){
if (Serial) // Si se ha logrado conexión...
break; // forzamos la salida del bucle
}
// Se permite continuar con conexión o sin ella.



Lo que ocurre con Arduino UNO, Arduino Pro Mini, y Arduino Mega entre otros, es que no lo necesitan, porque si no hay conexión arrancan sin conexión Serial y si esta conexión se establece más tarde, lo hacen correctamente reiniciando el programa y así no se pierde información, pero Arduino Pro Micro se comporta de forma distinta.

Esto no debe de extrañarnos porque para cada tipo de chip controlador el IDE genera un código diferente y por eso hay que seleccionar el modelo correcto en el IDE.
Perdona que sea pesao Arturo tu has eliminado esta parte del codigo

Código:
void SetPinsProgram(){
    ProgPins.ConfigurarPin(4, LOW);
    ProgPins.ConfigurarPin(5, HIGH);
    // Para pruebas modifique HH y MM a valores cercanos a la hora actual.
    int HH=17; // Hora para pruebas
    int MM=56;  // Minuto para pruebas
    // Crear 8 pulsos de 3 segundos (a las HH:MM:00,HH:MM:06,HH:MM:12, ... ,HH:MM:48)
    // (Eso provocaría intervalos de 3 segungos a HIGH y 3 segundos a LOW
    for (int j=0; j<8; j++){
        ProgPins.CrearPulso(4, HH, MM, j*6,  0, 0, 3); // en el pin 6
    }
    ProgPins.CrearPulso(5, 17, 59+0, 0,  0, 0,30); // Crear un pulso de 15 segundos a las HH:MM en el pin 5
    ProgPins.CrearPulso(5, HH, MM+1, 0,  0, 1, 0); // Crear un pulso de 1 minuto a las HH:MM+1 en el pin 5
}

Y has puesto estos otros códigos no?

Código:
void SetPinsProgram(){
    // Activacion de los pines
    ProgPins.ConfigurarPin(4, HIGH); // luz 1
    ProgPins.ConfigurarPin(5, HIGH); // luz 2
    ProgPins.ConfigurarPin(6, HIGH); // reservado otro uso
    ProgPins.ConfigurarPin(7, HIGH); // luz noche

    // Crear pulsos programacion horaria
    ProgPins.CrearPulso(4, 14, 0, 0, 8, 0, 0); // Pin4 encender 2 pm durante 8 h - apaga 10 pm
    ProgPins.CrearPulso(5, 14, 30, 0, 8, 0, 0); // Pin5 encender 2:30 pm durante 8 h - apaga 10:30 pm
      //ProgPins.CrearPulso(6, 13, 30, 0, 8, 0, 0); // Pin6 encender 01:30 pm durante 8h  - apaga 09:30 pm
    ProgPins.CrearPulso(7, 12, 30, 0, 11, 30, 0); // Pin7 encender 12:30 pm durante 11:30 h - apaga 00:00 pm
    ProgPins.CrearPulso(7, 0, 0, 0, 1, 0, 0); // Pin7 encender 00:00 pm durante 1 h  - apaga 01:00 am
}
Pedro, la rutina SetPinsProgram es la que contiene la progamación, y solo ha de contener eso.

En el código que facilitó Antonio, incluye las sentencias para un ejemplo o prueba que actúa sobre dos pines y genera 8 pulsos de 3 seg a ejecutar en hora/min que defines en las variables HH y MM.

El código que puse yo es la programación que le he puesto a mi sistema, 4 pines definidos y programo 4 pulsos distintos (uno de los pines no le asigno ningún pulso y a otro dos). Los horarios de actuación están en los comentarios

Tu puedes usar uno u otro para hacer pruebas, pero definitivamente en tu código has de dejar definitivamente tu programación, y no poner nada de los ejemplos.

Es decir algo como así:
Código:
void SetPinsProgram(){
    // Definir pines
    ProgPins.ConfigurarPin(4, HIGH); // 1º rele
    .......

    // Definir pulsos de programacion
    ProgPins.CrearPulso(4, 14, 0, 0, 8, 0, 0);  // a tal hora tanto tiempo
   .......
}

Y no te olvides realizar las modificaciones del código que comentó Antonio en el post 280. Si no, el programa con el pro-micro se queda atascado cuando se usa con alimentación y sin estar conectado al Pc:

En el programa Cao_Seta.ino al principio tras los #include añades la línea:
#define TIMEOUT_SERIAL 5000 // Esperamos como máximo 5 segundos a la conexion Serial

Y la rutina setup la sustituyes por esta:
Código:
void setup(){
   Serial.begin(9600); // Intentamos inicializar a 9600 baudios
   int t1=millis(); // Tomamos referencia del tiempo en t1
  // Mientras no transcurran TIMEOUT_SERIAL milisegundos
  while (millis()-t1<TIMEOUT_SERIAL){
      if (Serial) // Si se ha logrado conexión...
      break; // forzamos la salida del bucle
  }
   SetPinsProgram();
   Turn.EveryMillis(1000);
   HelpIntro();
}




Por complicarlo un poco mas, pero para cuando todo lo anterior lo tengas claro

Antonio dotó al programador de una cierta programación semanal, permitiendo definir en que días de la semana es activable un pin, de tal forma que los pulsos definidos para un horario solo se activan los días habilitados. Esto te puede ser muy útil si por ejemplo quieres activar tu sistema de cambio automático de agua un día de la semana.

La función ConfigurarPin está sobrecargada (esto quiere decir que usando la función con distintos argumentos su funcionamiento puede ser distinto)

La función admite la siguiente sintaxis:
void ConfigurarPin(int Pin, int EstadoPorDefecto, bool L, bool M, bool X, bool J, bool V, bool S, bool D);

Tal que si configuras el pin 4 así: ProgPins.ConfigurarPin(4, HIGH, 0, 0, 0, 0, 0, 0, 1); los pulsos definibles para el pin 4 solo se activan los domingos (valor 0 desactivado, otro valor activado). Por defecto el Cao_Seta tiene los 7 días activos.
Creo que Arturo ha comentado cosas que complementan de forma bastante acertada la documentación que yo incluí y no se me ocurre nada más que más añadir.

Yo creo que configurarlo o programarlo es más difícil de explicar que de hacerlo una vez que se entiende, y para eso yo creo que basta con ver como se hacen un par de ejemplos paso a paso.
buenas

a ver que pasa con las fotos de los montajes
aqui no suelta prenda nadie.......venga que me quiero copiar -nosweat.gif


a mi me continua faltando el arduino
pero voy pensando como colocarlo dentro de la caja.

la idea es mas o menos esta

[Imagen: fee0zd.jpg]


no tengo decidido que conectores voy a poner
los de encastrar o los de soldar a la placa
[Imagen: 2mrfgbm.jpg]

en la caja quiero meter un termometro de 12v que tengo
[Imagen: NeEroUH.jpg]


una cosilla
seria posible poner encastrada en la caja una entrada usb
para no tener que abrir la caja cada vez que se quiera
cambiar la hora de encendido.

un saludo
Yo suelo sujetar el Arduino a la caja con las entradas USB pegadas a la pared de la caja y a la caja la hago un agujerito con el tamaño y forma adecuada para meter el enchufe. Siempre suele hacer falta mecanizar la caja con algunos agujeros.

Encastrar conectores queda muy estético, pero cuando abres la caja puedes tener alguna incomodidad con los cables. Si ya tienes un conector soldado en la PCB, lo más recomendable es aprovecharlo.

No optimices mucho el espacio. Más vale que sobre, a que falte algo de espacio por poco que sea.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29