Acuariofilia Madrid

Versión completa: Aula Arduino para principiantes.
Actualmente estas viendo una versión simplificada de nuestro contenido. Ver la versión completa con el formato correcto.
hola mira tu me dices que en el cao esta pero ami no me sale los codigos solo me sale el programa y si le doy no sale nada mas que esto ../CAO1_LIB/Cao1_Dimmer4Lz.cpp

con que programa veo el codigo

ya con el word
(23-09-2014, 12:15 PM)william escribió: [ -> ]hola mira tu me dices que en el cao esta pero ami no me sale los codigos solo me sale el programa y si le doy no sale nada mas que esto ../CAO1_LIB/Cao1_Dimmer4Lz.cpp

con que programa veo el codigo

ya con el word

Son enlaces directos, todos los ficheros están en una carpeta aparte. A mí en Linux me va mejor así, pero puede que en Windows dependiendo de permisos o de lo que sea no genere los enlaces directos.

Para evitar problemas seguramente lo mejor sería hacer el paquete sin enlaces. Yo los necesito para compartir esos módulos como si fueran librerías, vosotros no. Lo voy a poner como si fuera una nueva versión. la 1.0.1
Supongo que ahora sí irá bien.

[attachment=1062]
si asi salen todos bien

//FASE 1 - AMANECER

if (hour >= hamanecer && hour < hdia && faseluz ==0){ //FASE1
if (pwm!=pwmamanecer) { //Hasta que el valor de pwm no llege al valor pwmamanecer ira aumentandolo

analogWrite (led1,pwm);//Escribimos la potencia
analogWrite (led2,pwm);//Lo mismo
pwm++;//sube un paso la intensidad
delay(delayamanecer);//Esperamos para cumplir el tiempo de dimeado deseado
}
una cosa antonio si yo por ejemplo quito el delay (delayamanecer)
que puedo poner en ves de el delay
Buenas tardes.

Acabo de llegar a casa y me ha faltado tiempo para probar tu código, Antonio.

Me da este error de compilado:

Código:
Cao1_Lcd20x4.cpp: In constructor 'Cao1_Lcd20x4::Cao1_Lcd20x4()':
Cao1_Lcd20x4.cpp:38:17: error: assigning to an array from an initializer list
     _Font_Degre = { // lcd.createChar(1, _FontDegre);
                 ^
Cao1_Lcd20x4.cpp:47:22: error: assigning to an array from an initializer list
     _Font_TermoMeter =  { // lcd.createChar(2, _Font_TermoMeter);
                      ^
Cao1_Lcd20x4.cpp: In member function 'char* Cao1_Lcd20x4::Fmt(const __FlashStringHelper*, ...)':
Cao1_Lcd20x4.cpp:226:11: error: 'prog_char' does not name a type
     const prog_char *p= (const prog_char *)fmt;
           ^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,
                 from Cao1_Lcd20x4.h:14,
                 from Cao1_Lcd20x4.cpp:24:
Cao1_Lcd20x4.cpp:230:41: error: 'p' was not declared in this scope
         unsigned char c = pgm_read_byte(p++);
Arduino: 1.5.7 (Windows 7), Placa:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Cao1_Lcd20x4.cpp: In constructor 'Cao1_Lcd20x4::Cao1_Lcd20x4()':
Cao1_Lcd20x4.cpp:38:17: error: assigning to an array from an initializer list
     _Font_Degre = { // lcd.createChar(1, _FontDegre);
                 ^
Cao1_Lcd20x4.cpp:47:22: error: assigning to an array from an initializer list
     _Font_TermoMeter =  { // lcd.createChar(2, _Font_TermoMeter);
                      ^
Cao1_Lcd20x4.cpp: In member function 'char* Cao1_Lcd20x4::Fmt(const __FlashStringHelper*, ...)':
Cao1_Lcd20x4.cpp:226:11: error: 'prog_char' does not name a type
     const prog_char *p= (const prog_char *)fmt;
           ^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,
                 from Cao1_Lcd20x4.h:14,
                 from Cao1_Lcd20x4.cpp:24:
Cao1_Lcd20x4.cpp:230:41: error: 'p' was not declared in this scope
         unsigned char c = pgm_read_byte(p++);

La pantalla funciona perfectamente con los códigos de prueba propios de la libreria.

Y para acabar, una pregunta después de mirarme las definiciones de pines del CAO1_1.h.

No entiendo esto:

Código:
#define Pin_Rele_12V_INI    22      // Pin Inicial Reles de 1A_12V
#define Pin_Rele_12V_FIN    ( Pin_Rele_12V_INI + 4 )
#define Pin_Rele_220V_INI    30      // Pin Inicial Reles de 10A_220V
#define Pin_Rele_220V_FIN    ( Pin_Rele_220V_INI + 6 )

Código:
#define Pin_ReleRefrigLeds      Pin_Rele_12V_INI      // Pin del relé refrigeracion de Leds
#define Pin_ReleRefrigAcua  (Pin_Rele_12V_INI+1)      // Pin del relé refrigeracion del acuario
#define Pin_ReleCalefAcua       Pin_Rele_220V_INI     // Pin del relé Calefaccion del acuario
#define Pin_Filtro          (Pin_Rele_220V_INI+1)     // Pin del relé del filtro
#define Pin_ReleCO2         (Pin_Rele_220V_INI+2)     // Pin del relé de CO2

Los dos reles van al pin 22 y 30, pero ¿que significa la definición del pin del filtro, calefacción, CO2?.

Saludos
(23-09-2014, 05:02 PM)xavi escribió: [ -> ]Buenas tardes.

Acabo de llegar a casa y me ha faltado tiempo para probar tu código, Antonio.

Me da este error de compilado:

Código:
Cao1_Lcd20x4.cpp: In constructor 'Cao1_Lcd20x4::Cao1_Lcd20x4()':
Cao1_Lcd20x4.cpp:38:17: error: assigning to an array from an initializer list
     _Font_Degre = { // lcd.createChar(1, _FontDegre);
                 ^
Cao1_Lcd20x4.cpp:47:22: error: assigning to an array from an initializer list
     _Font_TermoMeter =  { // lcd.createChar(2, _Font_TermoMeter);
                      ^
Cao1_Lcd20x4.cpp: In member function 'char* Cao1_Lcd20x4::Fmt(const __FlashStringHelper*, ...)':
Cao1_Lcd20x4.cpp:226:11: error: 'prog_char' does not name a type
     const prog_char *p= (const prog_char *)fmt;
           ^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,
                 from Cao1_Lcd20x4.h:14,
                 from Cao1_Lcd20x4.cpp:24:
Cao1_Lcd20x4.cpp:230:41: error: 'p' was not declared in this scope
         unsigned char c = pgm_read_byte(p++);
Arduino: 1.5.7 (Windows 7), Placa:"Arduino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Cao1_Lcd20x4.cpp: In constructor 'Cao1_Lcd20x4::Cao1_Lcd20x4()':
Cao1_Lcd20x4.cpp:38:17: error: assigning to an array from an initializer list
     _Font_Degre = { // lcd.createChar(1, _FontDegre);
                 ^
Cao1_Lcd20x4.cpp:47:22: error: assigning to an array from an initializer list
     _Font_TermoMeter =  { // lcd.createChar(2, _Font_TermoMeter);
                      ^
Cao1_Lcd20x4.cpp: In member function 'char* Cao1_Lcd20x4::Fmt(const __FlashStringHelper*, ...)':
Cao1_Lcd20x4.cpp:226:11: error: 'prog_char' does not name a type
     const prog_char *p= (const prog_char *)fmt;
           ^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,
                 from Cao1_Lcd20x4.h:14,
                 from Cao1_Lcd20x4.cpp:24:
Cao1_Lcd20x4.cpp:230:41: error: 'p' was not declared in this scope
         unsigned char c = pgm_read_byte(p++);

La pantalla funciona perfectamente con los códigos de prueba propios de la libreria.

Y para acabar, una pregunta después de mirarme las definiciones de pines del CAO1_1.h.

No entiendo esto:

Código:
#define Pin_Rele_12V_INI    22      // Pin Inicial Reles de 1A_12V
#define Pin_Rele_12V_FIN    ( Pin_Rele_12V_INI + 4 )
#define Pin_Rele_220V_INI    30      // Pin Inicial Reles de 10A_220V
#define Pin_Rele_220V_FIN    ( Pin_Rele_220V_INI + 6 )

Código:
#define Pin_ReleRefrigLeds      Pin_Rele_12V_INI      // Pin del relé refrigeracion de Leds
#define Pin_ReleRefrigAcua  (Pin_Rele_12V_INI+1)      // Pin del relé refrigeracion del acuario
#define Pin_ReleCalefAcua       Pin_Rele_220V_INI     // Pin del relé Calefaccion del acuario
#define Pin_Filtro          (Pin_Rele_220V_INI+1)     // Pin del relé del filtro
#define Pin_ReleCO2         (Pin_Rele_220V_INI+2)     // Pin del relé de CO2

Los dos reles van al pin 22 y 30, pero ¿que significa la definición del pin del filtro, calefacción, CO2?.

Saludos

He definido dos caracteres nuevos en el LCD uno es el caracter grado ='º' y el otro es el carácter termómetro. Tienen una funcion decorativa más que otra cosa. A mí en Linux no me dan problemas de compilación. Me parece muy curiosa esa incompatibilidad

Contemplo dos tipos de relés, unos para baja potencia a 12 voltios (solo uso dos de ellos para los ventiladores) y otros para potencias de hasta 10A a 220 voltios. Podrían servir para activar aireadores o bombas de movimiento de agua para generar oleaje, o lo que se te ocurra.

Son pines que no tienen uso, pero que me interesa dejar reservados para ampliaciones futuras.

El pin Pin_ReleCalefAcua se podría usar para activar el termo calentador. Es demasiado peligros usar un termo calefactor regulado electrónicamente. Es mas seguro el tradicional que tiene un bimetal que desconecta al llegar a cierta temperatura. Si un termo calentador lo haces depender de un sensor y este por fallo de hermeticidad en la sonda no desconectara la calefacción. Te convertiría tu acuario en una sopa de pescado con verduras. Es una lección que yo aprendí en mi adolescencia.
El control electrónico de la temperatura tendría sentido para hacer que durante el día y la noche el acuario tuviera tiferente temperatura como ocurre en la naturaleza, pero habría que dejar un termo calentador tradicional haciendo de interruptor de seguridad para una temperatura máxima. Su forma de uso es muy simple. Bastaría pasar al módulo sensor de teperatura del acuario ese pin como pin incrementador de temperatura y programar las temperaturas adecuadas.

El Pin_Filtro no se usa pero parar el filtro durante un breve instante puede ser muy útil. Por ejemplo para pararlo quince segundos antes de echar la comida y dejarlo parado durante dos o tres minutos para que los peces se coman todo el alimento sin que este se pierda arrastrado por la corriente entre los rincones más inaccesibles del acuario. O por ejemplo para antes de echar papilla congelada que es muy contaminante parar el filtro durante dos otros minutos, etc.

El Pin_ReleCO2 no lo uso porque no uso CO2 pero solo hay que incluirlo en el inicio del sensor del pH como pin decrementador del pH.

El módulo sensor incluye la inteligencia de los sensores como controladores del parámetro físico que están midiendo.

Para mí es una suerte que alguien se lea el código y pregunte lo que no entiende. Sobre todo ese fichero que actualmente resulta imprescindible tocar en algunos puntos.

Quizás debería poner el código un aviso relativo a que esa parte de ese fichero no tiene uso actualmente y no necesita ser tocado porque puede crear intranquilidad.

Estoy convencido de que cuanto más preguntéis sobre cosas que no entedeis de mi código, más os vais a enamorar de él. Big Grin

Muy oportuna tu pregunta. -good.gif
Gracias.
una ayuda a mis problemas con el codigo
Buenas noches.

Antonio, el error que te he comentado antes me lo daba utilizando el ide del arduino-1.5.7; ya se es que versión beta, pero es la que utilizo para trastear con el Arduino DUE.

He probado compilar el DIMMER1C, y tambien me daba error. Ya me he comenzado a imaginar por donde vendría el problema...

He desinstalado y vuelto a poner el arduino-1.0.5; me compila perfectamente el DIMMER1C y todas las pruebas que hice con tu programa, Demobotonera, Demobuzz....

[Imagen: IMG_20140923_220011_zps1pktnjso.jpg]

Pero al intentar compilar el CAO-1; ahora me da este error, diferente al del ide Arduino 1.5.7:

Código:
Cao1_Lcd20x4.cpp: In constructor 'Cao1_Lcd20x4::Cao1_Lcd20x4()':
Cao1_Lcd20x4.cpp:38: error: expected primary-expression before '{' token
Cao1_Lcd20x4.cpp:38: error: expected `;' before '{' token
Cao1_Lcd20x4.cpp:47: error: expected primary-expression before '{' token
Cao1_Lcd20x4.cpp:47: error: expected `;' before '{' token

Localizadas las líneas que dan el error, como tu apuntas en los símbolos que has creado:

Código:
// *************************************************
// Constructor
// *************************************************
Cao1_Lcd20x4::Cao1_Lcd20x4(){
    _Font_Degre = { // lcd.createChar(1, _FontDegre); /////ESTA LÍNEA DA EL ERROR
        B00011100,
        B00010100,
        B00011100,
        B00000000,
        B00000000,
        B00000000,
        B00000000,
        B00000000};
    _Font_TermoMeter =  { // lcd.createChar(2, _Font_TermoMeter); /////ESTA LÍNEA DA EL ERROR
        B00001110,
        B00001010,
        B00001010,
        B00001110,
        B00001110,
        B00011111,
        B00011111,
        B00001110 };
}

¿Puedes echarme un cable?.

Intento hacer las modificaciones que indica el error, pero entonces da otro diferente.

Lo curioso es que en linux compile, probarse otra librería Liquidcrystal_I2C. Utilizas la librería de fmalpartida?.



Saludos
(23-09-2014, 09:29 PM)william escribió: [ -> ]una ayuda a mis problemas con el codigo

Estoy mirándolo. Hay bastantes y se supone que a nivel de compilación la compatibilidad debería ser del 100%. Algunos errores se podrían explicar por diferencias en la librerías pero otros no.

¿Has seleccionado en tu IDE la placa "Arduino Mega 2560 o ADK"?
Estoy casi seguro que si, pero no quiero ser tajante.

Esta tarde sigo haciendo pruebas.

Huy, me he colado..
Me queda claro que aún no has solucionado este error:

Cao1_Lcd20x4.cpp: In constructor 'Cao1_Lcd20x4::Cao1_Lcd20x4()':
Cao1_Lcd20x4.cpp:38:17: error: assigning to an array from an initializer list
_Font_Degre = { // lcd.createChar(1, _FontDegre);
^
Cao1_Lcd20x4.cpp:47:22: error: assigning to an array from an initializer list
_Font_TermoMeter = { // lcd.createChar(2, _Font_TermoMeter);
^

Código:
Cao1_Lcd20x4::Cao1_Lcd20x4(){
    _Font_Degre = { // lcd.createChar(1, _FontDegre);
        B00011100,
        B00010100,
        B00011100,
        B00000000,
        B00000000,
        B00000000,
        B00000000,
        B00000000};
    _Font_TermoMeter =  { // lcd.createChar(2, _Font_TermoMeter);
        B00001110,
        B00001010,
        B00001010,
        B00001110,
        B00001110,
        B00011111,
        B00011111,
        B00001110 };
}
El compilador no acepta estas sentencias, pero no entiendo por qué.
Si a mí me hubiera dado ese error, directamente habría evitado programar caracteres nuevos en el LCD. La única solución que se me ocurre es modificar
programa para que nunca use estos caracteres especiales.

Lo que no me ha quedado claro es si con el cambio de compilador continuas
teniendo los errores provocados por el fallo en la declaración de la variable p.


Cao1_Lcd20x4.cpp: In member function 'char* Cao1_Lcd20x4::Fmt(const __FlashStringHelper*, ...)':
Cao1_Lcd20x4.cpp:226:11: error: 'prog_char' does not name a type
const prog_char *p= (const prog_char *)fmt;
^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:28:0,
from Cao1_Lcd20x4.h:14,
from Cao1_Lcd20x4.cpp:24:
Cao1_Lcd20x4.cpp:230:41: error: 'p' was not declared in this scope
unsigned char c = pgm_read_byte(p++);

No reconoce el tipo prog_char. Se supone esto está declarado en una librería de Arduino. Concretamente en <avr/pgmspace.h>
Se trata de la librería que permite el uso de la PROGMEM.
Yo no hago ese include en ese fichero, porque no me ha hecho falta y es raro que a ti no te lo reconozaca. parece que hay diferencias entre tus librerías y las mías.
Compruebo que sí hice el include en otros modulos:
Cao1_Parm.h:#include <avr/pgmspace.h>
Cao1_RTC.cpp:#include <avr/pgmspace.h>
No sé por donde le llega la declaración, quizás a través de <Arduino.h> el
caso es que a mí no me da error.
Puede que en tu caso necesite un #include <avr/pgmspace.h>
en Cao1_Lcd20x4.h

(24-09-2014, 10:20 AM)xavi escribió: [ -> ]Estoy casi seguro que si, pero no quiero ser tajante.

Esta tarde sigo haciendo pruebas.

Huy, me he colado..

Casi prefiero que solo sea eso -nosweat.gif

Gracias por la extraordinaria labor de betatester. Big Grin
A ver, el primer error que te comentévlo daba con el Arduino 1.5.7. Lo he desinstalado, pues es una beta.

Utilizo el 1.0.5, donde Dimmer1 compila y funciona bien.

Luego coloco el include y te digo.

Te comento que al hacer la instalación del ide Arduino, tengo la costumbre de solo colocar en la carpeta de librerías las que el scketch utiliza, para evitar alguna incompatibilidad.

Saludos y de encantado de ser betatester.
hola mira yo lo tengo en Arduino Mega 2560 or Mega AKD eso es lo que pone en el ide
(24-09-2014, 11:09 AM)william escribió: [ -> ]hola mira yo lo tengo en Arduino Mega 2560 or Mega AKD eso es lo que pone en el ide

Una cosa que podías probar, (ya que sigues con la misma idea), es hacerte una función delay que puedes llamar MiDelay(int segundos). Serían muy poquitas lineas.

Lo que debería hacer esa función, en lugar de quedarse esperando mucho tiempo seguido, es hacer varias esperas de un segundo dentro de un bucle for( ; ; ) y después de hacer cada una de las esperas de un segundo hacer una llamada a una función que rápidamente lea el RTC y refresque el reloj.

Es solo una idea para permitir la concurrencia con el reloj.
la ide me gusta pero no se como dices que tengo que hacer no te olvides que de programar muy poco si puedes ser algo mas especifico
Dime si te parece complicado este ejemplito que simula un reloj por la salida Serial.

Código:
// Dallas DS1307
#include <Wire.h>
#include "Cao1_RTC.h"

// LIB  /home/antonio/sketchbook/CAO_1/CAO1_LIB

// RTC_DS1307 RTC;
char CadAux[22];

// ************************************
void setup () {
    Serial.begin(9600);
    Wire.begin();
    RTC.Ini();
}

// ****************************************************************
void loop () {
    unsigned long UT;
    DateTime DT, DT2;

    DateTime now = RTC.now(); // Instanciamos el objeto RTC
    sprintf(CadAux, ">>> %04d-%02d-%02d %02d:%02d:%02d\n",
            now.year(), now.month(),  now.day(),
            now.hour(), now.minute(), now.second() );
    Serial.print(CadAux);

    UT=now.unixtime();
    DT=Dati.UnixTime2DateTime(UT);
    DT2=Dati.UnixTime2DateTime(UT+(60L*60L*24L*365L));
    Serial.print("### ");
    Serial.print(Dati.DateTime2Str20(DT));
    Serial.print(" ### ");
    Serial.println(Dati.DateTime2Str20(DT2));

    delay(1000);
}

Está hecho con mi librería 'Cao1_RTC' puedes descargarte esta demo completa con lo que necesita. (Cao1_RTC.h, Cao1_RTC.cpp, PRU_DT_RTC.ino)
[attachment=1069]

Si quieres hacer las cosas a tu manera te daré los consejos que quieras, pero no voy a implementar código de un modo diferente de cosas que ya tengo hechas a mi modo.

La función que me pides ahora no tiene dificultad, son cuatro líneas y tienes toda la información que necesitas para hacerla. Lo que ocurre es que no te bastará con eso porque realmente tu código tiene otro tipo de problemas.

Con el mini ejemplo que acabo de mandarte te demuestro como se puede gobernar un reloj con una librería que lo hará todo por ti.

Si te parece un código demasiado largo es porque son tres ejemplos en uno. Sobran muchas líneas, y aún así es muy pequeño.

1) Creo una variable now que contiene la fecha y hora y la muestro. Ya con eso bastaría.

2) Guardo en la variable UT el número de segundos transcurridos desde el 1 de enero de 1970 a la 00:00:00 hasta el momento actual.

3) Obtengo la fecha correspondiente a ese número de segundos y a ese numero de segundos + el número de segundos que tiene un año.

En otras palabras puedo hacer maravillas con esa librería, pero para mostrar la fecha y hora no hace falta complicarse la vida. Si solo quieres fecha y hora suprime las lineas de la 28 a la 35.

Mi librería tiene muchas posibilidades para la mayoría de las funciones que se pueden necesitar para que no tengas que programarlas tú.