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.
Tienes que declarar cada dato que necesites usar en tu programa. Yo ignoro que datos vas a necesitar y para qué pero te comento qué cosas estoy viendo.


DECLARACIONES DE CONSTANTES
Los datos que me muestras son de tipo entero y en este caso se están usando variables para dar nombre a constates. Para eso se podría haber usado una macro de tipo #define, o caso de usar una variable se podría haber protegido.

int hamanecer=720; // Hora fase amanecer

Se puede declarar como:

const int hamanecer=720; // Hora fase amanecer
De esa forma una sentencia que intente modificar ese vaor daría un error en tiempo de compilación, lo cual es mucho mejor que detectar errores de lógica en tiempo de ejecución del programa.

Cuando se usa una sentencia '#define' estás ahorrando SRAM porque el valor se guarda en el código.
Las macros '#define' se sustituyen en una primera pasada de precompilación por el valor a la derecha del identificador. No llevan ni signo igual ni punto y coma.


Por ejemplo en lugar de

int hamanecer=720; // Hora fase amanecer

Podrías haber usado

#define MddAmanecer 720 // Minutos del día para fase amanecer

Si te das cuenta el idéntificador ya no se refiere a horas del día sino a minutos del día. (Son datos enteros positivos comprendidos entre 0 y 1439)

Deberías adaptar un montón de declaraciones que se refieren a constantes y te recomiendo usar #define

Son constantes todos estos datos:

Código:
//****************************************************************
// ILUMINACION LUCES *
//****************************************************************


int led1 = 2; // Pin digital PWM
int led2 = 3; // Pin digital PWM
int led3 = 4; // Pin digital PWM
int led4 = 5; // Pin digital PWM
int led5 = 6; // Pin digital PWM

//****************************************************************
// Potencias *
//****************************************************************


int pamanecer= 20; // Potencia amanecer 0-100%
int pdia= 50; // Potencia luz dia 0-100%
int psol= 95; // Potencia luz Sol 0-100%
int patardecer= 25; // Potencia atardecer 0-100%
int pluna= 1; // Potencia de luna (1-10 valores PWM solo leds azules)

//****************************************************************
// Horas *
//****************************************************************

int hamanecer= 13; // Hora fase amanecer
int hdia= 14; // Hora fase día
int hsol= 16; // Hora fase Sol
int tsol= 5; // Duracion de Sol , horas
int hatardecer= 21; // Hora atardecer
int hluna= 22; // Hora fase luna
int tluna= 1; // Duración luna , horas
int vpwm= 2; // Tiempo del efecto en cada fase, minutos

ADAPTACIÓN DEL CÓDIGO
En los datos cuyo valor ha cambiado de hora del día a minutos del día tendrás que buscarlos en el código y adaptar los identificadores y la lógica para que use minutos del día.

Por ejemplo:

if (hour >= hamanecer && hour < hdia && faseluz ==0){ //FASE1

Como es lógico eso lo tienes que adaptar porque los momentos ya no serán hour sino (hour*60+ minute)

CRÍTICA AL ALGORITMO QUE USA TU DIMMER
Creo que el tipo de control del dimeo no se hacer depender directamente del momento del día. Se usan contadores para incrementar o disminuir el dimeo durante ciertos momentos y cuando llega a un cierto valor se conmuta de fase a la siguiente. Es una chapuza feísima.

La fase debería depender solo del momento del día y ser el reloj el que gobernara los cambios. Sería mucho mejor porque si cambias la hora del reloj todo se ajustaría a la nueva hora.
hola antonio mira a ver algo asi


#defibe led1 = 2; // Pin digital PWM

#defibe pamanecer= 25; // Potencia amanecer 0-100%


#defibe MddAmanece= 720; // Hora fase amanecer


void luz ()
{

//FASE 1 - AMANECER

if (hour*60+ minute >= MddAmanecer && hour*60+ minute < hdia && faseluz ==0){ //FASE1
if (pwm!=pwmamanecer) { //Hasta que el valor de pwm no llege al valor pwmamanecer ira aumentandolo
Los compiladores tienen sus manías.

#defibe led1 = 2; // Pin digital PWM

La sintaxis de la macro '#define' no lleva signo igual ni punto y coma al final.

#define led1 2 // Pin digital PWM

Cambialos todos.

Los comentarios también son importantes. Si pones hora fase amanecer. Cuando quieras volver a leer el código pesarás que es una hora y es el minuto del día. Puedes poner un comentario que diga lo que se entiende por minuto del día, pero momento y hora son cosas distintas. Debes usar lenguaje coloquial pero con precisión. Es muy habitual leer un código que hiciste hace tiempo y no acordarte de nada. Preguntar al autor no te servirá de nada porque el autor eres tú.

Los identificadores deben ser más claros.

pamanecer (mal) PotAmanecer o pot_amanecer (mejor)
Antonio mira con el cofigo de cero dime lo que falta o que esta mal

#include <Wire.h>
#include "RTClib.h"
#include <OneWire.h>
RTC_DS1307 RTC;

void setup ()
{
Serial.begin(9600); // Establece la velocidad de datos del puerto serie
Wire.begin(); // Establece la velocidad de datos del bus I2C
RTC.begin();// Establece la velocidad de datos del RTC
RTC.adjust(DateTime(__DATE__, __TIME__));


}


#define led1 2 // Pin digital PWM

#define Pot_Amanece 25 // Potencia amanecer 0-100%


#define MddAmanece 664 // Hora fase amanecer

int pwm=0;
int pwmAmanece=(Pot_Amanece*2.55);

int Minute;
int Hour;


void loop () {


DateTime now = RTC.now(); // Obtiene la fecha y hora del RTC
Serial.print(now.year(), DEC);
Serial.print('/');
Serial.print(now.month(), DEC);
Serial.print('/');
Serial.print(now.day(), DEC);
Serial.print(' ');
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.println();
Serial.print("Dia de la semana: ");
Serial.println(now.dayOfWeek(), DEC);

luz();


}


void luz ()

{
//FASE 1 - AMANECER

if (Hour*60+ Minute >= MddAmanece ){ //FASE1
if (pwm!=pwmAmanece) { //Hasta que el valor de pwm no llege al valor pwmamanecer ira aumentandolo

analogWrite (led1,pwm);//Escribimos la potencia en el canal de leds azules
pwm++;//sube un paso la intensidad

}
}

}
He comprobado que ese código compila, así que para ver lo que no funciona tendría que cargarlo en una placa como la tuya y con un RTC como el tuyo y poner los LEDs en los pines que tienes puestos tú. Estoy siendo muy diplomático pero supongo que no querrás que mienta. Ese código es basura y estás empeñado en que yo la pruebe.
jajjaja entonio comprende que yo no se nada de arduino estoy tratando de entender cosas que no se ni que hacen el codigo complila pero no se si falta algo porque a la hora esa 720 no enciende nada tu codigo me parese una pasada pero yo no entiendo ni lo primero estoy tratando de hacer uno con lo que tengo poco a poco y voy cambiando lo que me dices que cambie
Las únicas personas que necesitan entender mi código son aquellos que además de querer programar su propio controlador basado en el mío no deseen o no necesiten consultarme.

Si tu instalas CAO1 o DIMMER1C y te compila correctamente se podrán suprimir los módulos que no uses y se pueden cambiar/adaptar módulos o el programa principal. Esto, que tu ves más complicado, es en realidad mucho más sencillo que lo que tú estás intentando hacer.

El problema no es que no sepas nada. El problema es que lo que tú crees que sabes sobre la simplicidad de los programas está equivocado. Un programa que tiene errores de diseño importantes no es algo que se pueda enderezar, y un programa sin una buena metodología de programación tras él es muy difícil de mantener. Mi consejo es que salgas de ese laberinto.
hola mira yo los codigos tullos no me los compila por eso no se como hacer con eso entiendes no es por no usar tu codigo es porque no complila me baje una tonelada de librerias y sige con el problema vamos a ver agamos uno de cero yo ago lo que tu digas
(02-10-2014, 03:40 PM)william escribió: [ -> ]hola mira yo los codigos tullos no me los compila por eso no se como hacer con eso entiendes no es por no usar tu codigo es porque no complila me baje una tonelada de librerias y sige con el problema vamos a ver agamos uno de cero yo ago lo que tu digas

¿Te refieres a la 'ultima versión de CAO1? CAO1_1.0.2.BETA.zip Las versiones anteriores daban problemas en Windows.

¿Te refieres a la última versión de Dimmer1C? Dimmer1C.V1.2.zip

¿Por toneladas de librerías para que compile te refieres a alguna en particular?

Puede que te esté desanimando el tema de depender del LCD y se su librerí. La otra librería externa que se necesita es la OneWiere lara la temperatura que quizás tampoco necesites. En resumidas cuentas, ii necesitas algo aún más simple que 'Dimmer1C' que no necesite ser configurable en caliente, que ni siquiera use parámetros en la EEPROM, ni botonera, ni LCD, ni zumbador piezoeléctrico, ni temperatura, ni sensores de ph, ni ningún otro sensor, ni la funcionalidad de menús...

Si básicamente lo que te interesa es controlar un Dimmer con el RTC, si te basta cambiar la configuración del dimeo en el propio código cuando lo necesites y nada más, también podría intentarse usando las librerías de CAO1. Eso sí, habría que suprimir bastante código y adaptar otro tanto. Sería una pena. Te perderías mucha funcionalidad importante pero aún así tendría más sentido intentar eso que no lo que tú pretendías hacer.

Dime que te sobra y que necesitas con respecto a Dimmer1C V1.2. y te diré como de complicado me parece.
ok mira yo quiero el dimeo nada mas

el http://cao1_1.0.2.beta.zip/ no deja descargar
Dentro de muy poco publicaré un vídeo explicando en qué consiste CAO1 y he decidido publicar ahora dos minutitos de tomas falsas. Tomas falsas Big Grin
hola antonio mira me descargue el dimerc y cuando le doy a complilar me sale este error
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal/LiquidCrystal_I2C.h: In member function 'void CaoDim1C_Lcd20x4::Ini()':
C:\Program Files (x86)\Arduino\libraries\LiquidCrystal/LiquidCrystal_I2C.h:154: error: 'int LiquidCrystal_I2C::init()' is private
CaoDim1C_Lcd20x4.cpp:31: error: within this context
antonio lo intento pero no puedo con esto estoy por dar el pc a la papelera son horas y horas y no saco nada del cao me da problemas cambio cosas y mas problemas yo solo quiero un dimeo de mis led no ph no ventilador no ruidos no lcd solo dimeo de led
Ja, ja, hombre de poca fe.Big Grin
Ese error está diciendo que la función int LiquidCrystal_I2C::init() es privada. Te explico lo que está ocurriendo. Tu librería LiquidCrystal_I2C es distinta de la mía y seguro que hay que inicializarla de una forma diferente. Cada LCD necesita su librería LiquidCrystal_I2C. En el mismo lugar donde se compra un LCD hay que descargarse su librería LCD y probar el ejemplo que trae para ver si funciona. Que yo sepa tu no estás usando LCD. Por eso te preguntaba que necesitas tú. No eres el primero al que le da problemas esta librería por no tener en cuenta esto. La llaman librería LiquidCrystal_I2C, pero no es una librería normal. Más bien se refiere a un estándar para librerías LCD basadas en el chipsets Hitachi HD44780 o compatibles. Por eso te da error. Tu librería y la mía son diferentes y aunque hay compatibilidad en la mayoría de las funciones. Parece ser que en la inicialización puede haber diferencias.
Esto te lo cuento solo como curiosidad porque si no vas a usar el LCD tendrás que prescindir de la librería y sacar la salida por puerto Serial. En otras palabras, habría que adaptar todo el programa para que no use lo que no necesites. La diferencia es que hablamos de CAO1, un código que conozco bien y que modestia aparte está bastante bien hecho y se deja modificar.

Donde tú veía soluciones yo veía problemas y ahora donde tú estás viendo problemas yo veo soluciones.

Si tienes decidido qué hardware vas vas a usar y lo que no quieres usar, dímelo.
ok yo quiero eso solo dimeo de led con el reloj sin lcd sin ph sin ventilador sin nada porque no tengo eso tengo en mente comprar tres censores de temperatura nada mas pero cuando tenga esto en marcha