Concurso de fotografía AM

Temática: «Una panorámica de tu acuario».
Ya esta abierto el plazo para presentar fotografías.

Más info
image01

¿Aún no conoces AMA?

Hazte socio de Acuariofilia Madrid Asociación.
CERRADO EL PLAZO DE INSCRIPCIÓN

Más info
image01

Atlas de peces de AM

¡Hemos alcanzado las 800 fichas! Visita nuestro atlas de peces actualizado.

Más info
image01

Cardúmenes y sociabilidad

Nueva actualización de la tabla con una extensa relación de peces, donde podrás conocer qué entorno necesita cada especie, su sociabilidad y si convive o no en cardumen. ¡Pasa a descubrirla!

Mas info
image01
Diseño de un programador básico de acuario con arduino
Respuestas: 434    Visitas: 102329
#61
Antonio, aquí te paso una función que tengo en el sistema domótico, es para el cambio automático de hora.
Realmente al final en el sistema domótico, esta función no se usa, ya que se sincroniza la hora del RTC de Arduino con la de la tablet a través de internet, pero en un principio si que se usaba. Desconozco los problemas que pueda tener, así que te tocará estudiarla un poco para ver si es viable.
Código:
byte Zeller(byte anno, byte mes, byte dia){
   if (mes <= 2){
      mes = mes + 10;
      anno = anno - 1;
   }else{
      mes = mes - 2;
   }
   int a = anno % 100;
   int b = anno / 100;
   int resultado =(700 +((26 * mes - 2) / 10) + dia + a + a / 4 + b / 4 - 2 * b) % 7;
   return resultado;
}

boolean EsHorarioVerano(){
  //globales: second, minute, hour, dayOfWeek, dayOfMonth, month, year
   //el último domingo de Marzo
   int dhv = 31 - Zeller(year, 3, 31);  
   //el último domingo de Octubre
   int dhi=31 - Zeller(year,10,31);
  
   return ((hour>=2 && dayOfMonth==dhv && month==3  ||  dayOfMonth>dhv && month==3 ||  month>3) &&  (hour<3 && dayOfMonth==dhi && month==10  || dayOfMonth<dhi && month==10 ||  month<10 ));
}[align=center][/align]
#62
(15-12-2015, 01:45 PM)rubenmas escribió: Antonio, aquí te paso una función que tengo en el sistema domótico, es para el cambio automático de hora.
Realmente al final en el sistema domótico, esta función no se usa, ya que se sincroniza la hora del RTC de Arduino con la de la tablet a través de internet, pero en un principio si que se usaba. Desconozco los problemas que pueda tener, así que te tocará estudiarla un poco para ver si es viable.
Código:
byte Zeller(byte anno, byte mes, byte dia){
   if (mes <= 2){
      mes = mes + 10;
      anno = anno - 1;
   }else{
      mes = mes - 2;
   }
   int a = anno % 100;
   int b = anno / 100;
   int resultado =(700 +((26 * mes - 2) / 10) + dia + a + a / 4 + b / 4 - 2 * b) % 7;
   return resultado;
}

boolean EsHorarioVerano(){
  //globales: second, minute, hour, dayOfWeek, dayOfMonth, month, year
   //el último domingo de Marzo
   int dhv = 31 - Zeller(year, 3, 31);  
   //el último domingo de Octubre
   int dhi=31 - Zeller(year,10,31);
  
   return ((hour>=2 && dayOfMonth==dhv && month==3  ||  dayOfMonth>dhv && month==3 ||  month>3) &&  (hour<3 && dayOfMonth==dhi && month==10  || dayOfMonth<dhi && month==10 ||  month<10 ));
}[align=center][/align]

Gracias Ruben, la conozco, la hemos mencionado como una de las funciones que pienso poner a prueba. Tiene sus limitaciones pero parece que puede estar muy indicada para este proyecto.

Ahora estoy con varias cosas a la vez, pero este proyecto fue idea de Arturo y comprendí que tenía potencial para que los que ahora se sienten un poco fuera de onda, puedan tomar el tren de Arduino.

Este hilo se ha puesto interesante porque hay gente que después de tantear durante bastante tiempo la temperatura de la piscina, por fin se ha tirado de cabeza. Es lo mejor que podía pasar. Big Grin
#63
Cuando Antonio y el que suscribe empezamos a hablar del tema estábamos de acuerdo en diseñar algo sencillo en hard y soft, digamos lo justito y simple para montar un mínimo programador basado en Arduino que no espante a usuarios que ven el uso de microprocesadores oscuro y complicado.

Antonio es "el amo del código" y el decidirá hasta donde se quiere complicar en hacer mas perfecto el sistema, pero en principio no se iban a dar tratamiento a temas de fechas y calendarios superiores al diario.

El tema del cambio de horario de verano (saltándonos un poco el principio anterior), ya sea por una "cutre función" o la ñapa de un jumper o interruptor, ha surgido por que al ser un sistema simple sin LCD ni Botonera, al producirse los cambios horarios, sería necesario volver a conectar el sistema con el PC para por recompilación corregir el desfase horario (que si afecta a nuestras horas de contemplación del acuario) y no suele ser normal tener cerca los bajos del acuario y el PC.

Así pues, en esto Antonio tiene la única palabra, puede prescindir de la perfección citada, puede entretenerse en incluirla o puede probarla sobre este código sencillo sin apenas interferencias y después exportar al Cao-1
#64
Estoy viendo vídeos de electrónica, de programación, de arduino, leyendo blogs articulos -blink.gif tengo a tope el disco duro.
que cabr....nes sois.

por cierto se puede descargar el programa arduino en español???
podríais poner algún enlace también para básicos como yo.
#65
(15-12-2015, 10:53 PM)pedmar escribió: Estoy viendo vídeos de electrónica, de programación, de arduino, leyendo blogs articulos -blink.gif tengo a tope el disco duro.
que cabr....nes sois.

por cierto se puede descargar el programa arduino en español???
podríais poner algún enlace también para básicos como yo.


Yo lo acabo de descargar por si estaba el idioma por algún lado , pero ya me ha salido en español -good.gif

https://www.arduino.cc/en/Main/Software
#66
(15-12-2015, 10:16 PM)ArturoS escribió: Cuando Antonio y el que suscribe empezamos a hablar del tema estábamos de acuerdo en diseñar algo sencillo en hard y soft, digamos lo justito y simple para montar un mínimo programador basado en Arduino que no espante a usuarios que ven el uso de microprocesadores oscuro y complicado.

Antonio es "el amo del código" y el decidirá hasta donde se quiere complicar en hacer mas perfecto el sistema, pero en principio no se iban a dar tratamiento a temas de fechas y calendarios superiores al diario.

El tema del cambio de horario de verano (saltándonos un poco el principio anterior), ya sea por una "cutre función" o la ñapa de un jumper o interruptor, ha surgido por que al ser un sistema simple sin LCD ni Botonera, al producirse los cambios horarios, sería necesario volver a conectar el sistema con el PC para por recompilación corregir el desfase horario (que si afecta a nuestras horas de contemplación del acuario) y no suele ser normal tener cerca los bajos del acuario y el PC.

Así pues, en esto Antonio tiene la única palabra, puede prescindir de la perfección citada, puede entretenerse en incluirla o puede probarla sobre este código sencillo sin apenas interferencias y después exportar al Cao-1

Bueno el tema del horario está dando algo de lata, mi idea inicial era no hacerlo porque sabía donde me metía, no es un tema nuevo, pero ya me he picado y ya no lo dejo a medias. He avanzado bastante pero quedan partes complicadas.

No va a ser un código trivial ni didáctico para novatos, pero todo no se puede. Ya haremos cosas más didácticas para los interesados en programación. Lo que interesa ahora es hacer algo que cualquiera pueda construir en poco tiempo con instrucciones muy sencillas.

Lo voy a hacer todo en un solo bloque. Algunas veces la gente se lía con el uso de librerías externas, así que será más fácil de usar.

Para ello me estoy reescribiendo una librerías de manejo del RTC con toada la funcionalidad que vamos a necesitar y las librerías que usemos serán las que vienen con el Arduino preinstaladas como la librería wire.

De hecho, he aprendido más cosas del manejo de la librería wire de las que sabía.

Empezaré haciendo un programa de demo para que Arturo pruebe con su RTC lo que yo estoy haciendo. Yo uso el DS3231 y él puede probarlo creo que con DS1307 que es menos preciso y aunque mantiene cierta compatibilidad habría que verificar hasta donde llega.

El programita permitirá la puesta en hora del RTC.

Por cierto, tenía comprado el DS3231 y aún no lo había probado.

El DS3231 usa un sensor para compensar la temperatura y mejorar su precisión y este sensor se puede leer. Tiene una precisión de un cuarto de grado centígrado.
#67
Si el IDE de arduino viene en español, en teoría al instalarse selecciona automáticamente el idioma del pc.

De electrónica y de arduino en internet no hay miles sino lo siguiente.

A mi uno para conocer en general las posibles opciones y módulos uno que me gusta es este http://www.prometec.net/modulo-1/

Yo con electrónica no me metería aun, es inmensa y no sabrías cual es el limite que necesitas, lo mejor es cuando te salga una duda concreta buscar sobre ella y seguro que encuentras explicaciones al nivel necesario, además algunos tutos de arduino incluyen las nociones básicas utilizadas



Por cierto el chino de modulo LM7805, me confirmó que lo manda montado.

(15-12-2015, 11:09 PM)Antonio Castro escribió: No va a ser un código trivial ni didáctico para novatos, pero todo no se puede. Ya haremos cosas más didácticas para los interesados en programación. Lo que interesa ahora es hacer algo que cualquiera pueda construir en poco tiempo con instrucciones muy sencillas.
"Pos na quelevamoacer" pon "dos rombos" delante del código de Zeller por si un novato se acerca quede avisado de que no intente comprenderlo.

O tal vez en vez de un solo ino, añade un solo cpp con las funciones complejas y deja el código principal con el código sencillo, así el cpp se le puede considerar como una librería externa que funciona y no hay porque mirar sus "tripas"

Y a saber que habrás entresacao del protocolo IIC


Ese sensor de temp del DS3231, ¿es usable?, es decir ¿hay alguna función en las librerías para capturar la temperatura? de haberlo, podía ser útil para tener un control de la temperatura de la caja del sistema (sin sensores adicionales) y alguna alarma de sobrecalentamiento. Uff creo que me he pasado y estoy ya desvariando del fundamento de este hilo, perdón
#68
Arturo no tengo ningún problema en hacerlo como queráis. Normalmente esas decisiones las tomo yo. He querido probar a donde me lleva el consultar cada paso porque lo que es sencillo para mí pude no serlo para los demás..

Yo con electrónica y programación me metería lo necesario como en todo. Se trata de dar los primeros pasos en un campo totalmente inexplorado para muchos. Me refiero a lo básico para entender los por qué de aquello que tenga relación directa con lo que hacemos.

Por desgracia, habrá partes del código que no serán triviales. Todo el mundo debe poder dar el primer paso con facilidad y tener algo que funcione.

La parte del código complicada el algo que normalmente debería quedar oculto al usuario así que una de dos:

1) Se hace un programa que lo contenga todo y que funcione sin más.

2) Hacemos un paquete que además del módulo principal contenga un módulo de librería, para ocultar la complejidad y facilitar su reutilización en otros programas y lo acompañamos con las oportunas instrucciones de instalación que por otra parte serían muy sencillas. Seguramente metería algún modulito más.

Ocultar la complejidad es algo que se hace siempre, de otra forma nos volveríamos locos. Para conducir un coche no hace falta saber ingeniero industrial.

Se pueden hacer las dos versiones. La primera versión totalmente funcional sería la versión monolítica. La segunda incluiría más de un módulo. Sería básicamente el mismo programa codificado de dos formas diferentes.

Aparte de eso sacaré una versión solo para probar el RTC.

Yo sabía que en un dispositivo I2C hay registros de datos en los que puedes leer y escribir y acceder pero no había practicado lo de acceder directamente por posición porque no lo vi necesario y es muy fácil. En muchos dispositivos I2C tipo sensor, hay uno o dos registros y se acceden todos a la vez por sencillez.

Cómo funciona el módulo DS3231

Para manejarlo basta leer o escribir en una serie de registros que son los siguientes:

Código:
#define DS3231_I2C_ADDRESS 0x68

//DS3232 Register Addresses
#define RTC_SECONDS 0x00
#define RTC_MINUTES 0x01
#define RTC_HOURS 0x02
#define RTC_DAY 0x03 // day of Week
#define RTC_DATE 0x04
#define RTC_MONTH 0x05
#define RTC_YEAR 0x06
#define ALM1_SECONDS 0x07
#define ALM1_MINUTES 0x08
#define ALM1_HOURS 0x09
#define ALM1_DAYDATE 0x0A
#define ALM2_MINUTES 0x0B
#define ALM2_HOURS 0x0C
#define ALM2_DAYDATE 0x0D
#define RTC_CONTROL 0x0E
#define RTC_STATUS 0x0F
#define RTC_AGING 0x10
#define TEMP_MSB 0x11
#define TEMP_LSB 0x12

Usa datos codificados en BCD, de momento basta decir que usaremos funciones para pasar del formato decimal normal que usa el compilador de C al formado BCD que usa DS3231. Las funciones son: decToBcd(), bcdToDec()
Para cambiar la hora sería:

Código:
// Ajustar fecha y hora en el DS3231
  Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(RTC_SECONDS); // Situar el comienzo de la escritura para el registro RTC_SECONDS
  Wire.write(decToBcd(second)); // 0..59
  Wire.write(decToBcd(minute)); // 0..59
  Wire.write(decToBcd(hour)); // 0..23
  Wire.endTransmission();

Para leer la hora sería:

Código:
Wire.beginTransmission(DS3231_I2C_ADDRESS);
  Wire.write(RTC_SECONDS); // Nos situamos en el registo 00h de DS3231
  Wire.endTransmission();
  Wire.requestFrom(DS3231_I2C_ADDRESS, 3); // Pedimos leer 3 bytes empezando en RTC_SECONDS
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f);

Así que contestando a tu pregunta... sí, se puede leer la temperatura del DS3231

Código:
float GetTemp(){
    byte temp;
    Wire.beginTransmission(DS3231_I2C_ADDRESS);
    Wire.write(TEMP_MSB);
    Wire.endTransmission();
    Wire.requestFrom(DS3231_I2C_ADDRESS, 2); // Pedimos leer 2 bytes empezando en TEMP_MSB
    temp = Wire.read();    // Here's the MSB
    return float(temp) + 0.25*(Wire.read()/64); // Ver la nota que sigue.
        // NOTA: En lugar de >>6 hemos usado /64
        // Ambos métodos son equivalentes, pero el c++ estándar dice que el comportamiento para
        // el desplazamiento a la derecha es específico de la implementación.
}

El año se guarda como un byte así que solo contempla los dos últimos dígitos del año. (Va del 2000 al 2099).
El registro RTC_DAY para guardar el día de la semana (en la posición 0x03) contiene un número entre 1 y 7. (1=Domingo, 2=Lunes, ...7=Sábado).
Funciona como un simple contador que se incrementa a medianoche y cuando llega a 8 lo transforma en 1 para repetir el ciclo semanal. Por lo tanto es responsabilidad del usuario (programador) decidir su valor inicial, y por ello
hay que implementar una función que nos diga el número de días transcurridos desde el año 2000 y una vez que sabemos ese dato el número de la semana es trívial calcularlo dividiendo por siete y quedándonos con el resto.

Estos son los secretos de este cacharrito. El cacharrito es muy sencillo. La congruencia de Zeller no lo es tanto.

La complejidad no está en el cacharrito, está en implementar la funcionalidad que el cacharrito no tiene implementada. Hay muchas librerías que hacen cosas diferentes y nosotros tendremos la nuestra. La ventaja será ahorrar código.

Tanto la explicación de como funciona el DS3231 como los consejos para soldar como la lista de materiales, los consejos para hacer pedidos, el diagrama de Arturo, y otra serie de informaciones que merecen ser fácilmente accesibles. deberían se compilados para editar un manual para aquellos que no se conformen con las instrucciones paso a paso.

De aquí podría salir un Libro + software y la aportación de todos los que quieran contribuir. El título puede ser el del programa Programador fácil de Arduino o puede ser otro.
#69
Ya me he descargado el programa arduino,Big Grin y he pedido una serie de componentes para hacer pruebas, se que quizás me salga un poco del tema en cuestión, pero voy compaginar el montaje de este sistema con algunas practicas.

Se que esto de programar a cierto nivel medio alto es solo para expertos. La mayoría lo que hacen es descargarse programaciones de Internet, pero trastear en plan aficionado, eso de encender apagar led y algunos componentes me llama la atención soy muy enreda -pardon.gif
#70
Antonio, para que sirva de tuto a los que empiezan y no se confundan entre cosas sencillas y complejas yo soy partidario de un programa principal con código sencillo y un modulo c++ de librerías de las funciones complejas, pero en lo que se pueda intenta llamar a funciones de las librerías estándar, si existen, y no a esa funciones que te gusta hacerte, aunque sean de mejor rendimiento o reduzca código de librería.

Cierto que partes de este post tienen que acabar siendo parte del manual del sistema, pero de momento sigamos discutiendo y cuando lleguemos al producto final seleccionamos lo que finalmente sea coincidente y definitivo, que de momento estamos entrando en temáticas y saliendo




Pedro, encantado, pero porfa las dudas de prácticas ponlas en el post de "Arduino para principiantes", y así Antonio, o si puedo yo, te respondemos sin desvariar este proyecto.
#71
(16-12-2015, 04:10 PM)pedmar escribió: Ya me he descargado el programa arduino,Big Grin y he pedido una serie de componentes para hacer pruebas, se que quizás me salga un poco del tema en cuestión, pero voy compaginar el montaje de este sistema con algunas practicas.

Se que esto de programar a cierto nivel medio alto es solo para expertos. La mayoría lo que hacen es descargarse programaciones de Internet, pero trastear en plan aficionado, eso de encender apagar led y algunos componentes me llama la atención soy muy enreda -pardon.gif

Puede que te sirva esto: Ejercicios básicos con Arduino
#72
(16-12-2015, 04:42 PM)ArturoS escribió: Antonio, para que sirva de tuto a los que empiezan y no se confundan entre cosas sencillas y complejas yo soy partidario de un programa principal con código sencillo y un modulo c++ de librerías de las funciones complejas, pero en lo que se pueda intenta llamar a funciones de las librerías estándar, si existen, y no a esa funciones que te gusta hacerte, aunque sean de mejor rendimiento o reduzca código de librería.

Cierto que partes de este post tienen que acabar siendo parte del manual del sistema, pero de momento sigamos discutiendo y cuando lleguemos al producto final seleccionamos lo que finalmente sea coincidente y definitivo, que de momento estamos entrando en temáticas y saliendo

Hay una gran diversidad de librerías para RTC algunas completísimas, pero las que trae Arduino son las que puedes ver al pinchar en el IDE recién instalado.
IDE --> Programa --> Include Library

Corrigeme si me equivoco (podría haberla suprimido yo) pero creo que Arduino no trae ninguna.

En el sitio oficial de Arduino se comentan algunas que pueden ser añadidas a
Libraries

Tampoco veo ninguna para RTC.

Hay muchas librería, pero o son muy básicas o son demasiado completas y necesitamos ahorrar SRAM. Hemos quedado que el cambio de horario verano/invierno pese a no ser algo trivial era importante.

En función de todo eso ya tomé mi decisión y también comenté que tengo bastante trabajo hecho.

Si tú consideras que en este caso es preferible ocultar la complejidad a meterlo todo a mogollón en un solo programa por mí encantado.

Eso no es problema, en realidad donde la gente se atasca más es con la instalación de librerías como extensión de las librerías que trae el IDE.

Tú idea de controlar con una variable el momento en que ocurre un cambio de horario es un planteamiento que funcionaría si el cambio de horario por sí mismo generar un evento (una interrupción en el sistema), pero no existe ese recurso así que intentar capturar un momento fugaz como ese para hacer lo que sea, no es un buen planteamiento. No sé si te he convencido pero si tú crees que puede hacerse, no me lo cuentes, hazlo, o mejor dicho inténtalo. Creeme, no podrás.

Los ordenadores no alteran la hora del RTC por un cambio de horario, lo que usan es un sistema propio llamado horario universal UTC que es mucho más de lo que yo necesito, pero la idea de que el sistema ha de ir por un lado y la hora del usuario por otro es básica. A mí me va a bastar con elegir el horario de verano o el horario de invierno como hora del sistema.
#73
En las por defecto instaladas por el IDE (hasta la versión actual) no incluye ninguna de ningún dispositivo I2C (salvo la wire genérica).

Por eso y para no complicar a los users con instalación de librerías locales (y el cachondeo de path de cada uno), las que sean necesarias (no por defecto en el IDE) deberían están en el #include sin <> y las ponemos en la misma carpeta del proyecto (el .zip que se distribuya).

Ya se que mi rutina era cutre, no me lo recuerdes, si quieres tocas el registro del la RTC o mantienes la hora que gestiona el programa en una variable u objeto datetime del programa
#74
(15-12-2015, 10:53 PM)pedmar escribió: Estoy viendo vídeos de electrónica, de programación, de arduino, leyendo blogs articulos -blink.gif tengo a tope el disco duro.
que cabr....nes sois.

por cierto se puede descargar el programa arduino en español???
podríais poner algún enlace también para básicos como yo.

Marikitaa despues de hacer el pedazo de cambiador automático ... tu es ponerte veras que lo sacas todo.
#75
(16-12-2015, 07:59 PM)patarock2 escribió:
(15-12-2015, 10:53 PM)pedmar escribió: Estoy viendo vídeos de electrónica, de programación, de arduino, leyendo blogs articulos -blink.gif tengo a tope el disco duro.
que cabr....nes sois.

por cierto se puede descargar el programa arduino en español???
podríais poner algún enlace también para básicos como yo.

Marikitaa despues de hacer el pedazo de cambiador automático ... tu es ponerte veras que lo sacas todo.

calla calla que esto es una carrera y todo un mundo, necesitas muchos muchos conocimientos para pasar de copiar a diseñar, , no es para aficionados -no2.gif lo mas que podemos es trastear, con muchísima ayuda de los genios y gracias a ellos pasar ratos muy entretenidos... es a lo único que aspiro...

También es cierto aunque, esta mal que lo diga yo ; Blush pero soy de los que sacan mucho partido a la única neurona que me funciona Big Grin

Usuarios navegando en este tema: 8 invitado(s)


Salto de foro: