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
Aula Arduino para principiantes.
Respuestas: 1783    Visitas: 467064
#46
El resto del codigo no lo tengo , solo tengo eso que posteo , pasame tu el codigo por favor , o si no cuando me ponga yo ha hacer pruebas ya te lo pondre , estoy estudiandome un poco el tema y lo que yo quiero hacer es que se enciendan los leds a las 3 de la tarde y hasta las cuatro que se vayan encendiendo y despues que se apagen a las 11 hasta las 12, supongo que eso sera algo dificil , pero pococ a poco ire haciendo pruebas a ver que tal y te comento.
Por que supongo que tambien habra que poner algun codigo para el reloj , o eso es aparte.
#47
No tengo terminado mi código, pero te puedo orientar para que programes lo que necesites.

Tu reloj es un RTC para bus I2C. Ejecuta el programita de prueba siguiente:

Código:
#include <Wire.h>  // Incluye la librería Wire
#include "RTClib.h" // Incluye la librería RTClib
RTC_DS1307 RTC; // Crea el objeto 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
}
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();
delay(1000); // La información se actualiza cada 1 seg.
}

Usa la librería Wire para la comunicación I2C que ya viene por defecto en el IDE pero si no lo has hecho ya tendrás que añadir la librería RTClib a la IDE de Arduino (el IDE trae una opción para añadir librerías que deberás ser descargadas previamente y situadas en el directorio donde tengas las restantes librerías.

Con el ejemplito ya sabes como obtener la fecha y hora separada en sus correspondientes campos.
Para manejar el dimeo necesitas un dato entero que represente el momento del día en que te encuentras en cada momento.

Podemos usar el segundo del día cuyo valor máximo sería=24*60*60=86400
No nos da con un valor in (máximo 32767) ni con unsigned int. Puedes usar un dato de tipo long cuyo valor máximo llega a 2147483647.

Para obtener el segundo del día basta hacer

Código:
long Seg DelDia;

SegDelDia= (long) now.second() + ( 60L * (long) now.minute()) + ( 60L*60L * (long) now.hour() );

Tener este dato en este formato te permitirá calcular el dimeo que corresponda a cada valor del dia definiendo valores de dimeo por tramos lineales entre diferentes momentos del día.

En tu caso tendrías que programar los siguientes tramos:

Tramo1 de las 00:00 a las 15:00
Tramo2 de las 15:00 a las 16:00
Tramo3 de las 16:00 a las 23:00
Tramo4 de las 23:00 a las 24:00

Vamos a ver como se programaría uno de los tramos:

Las 15:00 = 15*60*60. Sería el segundo 44000 del día y le correspondería un valor de dimeo igual a cero.
Las 16:00 = 16*60*60. sería el segundo 57600 del día y le correspondería el valor de dimeo igual a 255.

Queremos que dentro del tramo exista una correspondencia lineal de forma que por ejemplo en mitad del tramo a las 5:30 el dimeo valga la mitad de 255. Usaremos una funcion para eso que ya mostré antes.


Código:
// *******************************************************************************
// InterpolacionLineal del valor del dimeo pata un momento TimeX dentro de un periodo de
// tiempo  Time0..TimeF, sabiendo que al comiezo del periodo el valor del dimeo valdrá
// Dim0 y al Final DimF
//
// Uso:
//      DimX= InterpoLineal(Time0, TimeX, TimeF, Dim0, DimF)
// *******************************************************************************
int InterpoLineal(long Time0, long TimeX, long TimeF, long Dim0, long DimF){
    return (int) ( ((TimeX-Time0)*(DimF-Dim0) / (TimeF-Time0)) + Dim0 );
}


Es decir:

1) Leemos la hora
2) Calculamos el segundo del día.
3) Verificamos a que tramo corresponde ese segundo del día.
4) Llamamos a la función de interpolación con los valores adecuados para calcular el valor del dimeo. Un ejemplo de código podría ser más o menos como sigue:

Código:
// (Codigo no probado)

// Funcion para calcular el dimeo (función abreviada)
int DimeoSegDelDia(long SegDelDia){
   int DimeoActual;
   switch (segDelDia){
      case 44000:
         Dimeo=0;
         break;
      case 57600:
         Dimeo=255;
         break;
    // case ...otros valores exactos
   }
   if ( (SegDelDia>44000) && (SegDelDia<57600))
      Dimeo= InterpoLineal(44000, TimeX, 57600, 0, 255);
   // if ( ... otras zonas dentro de tramos
   return Dimeo;
}


// En el bucle principal
void loop(){
   long SegDelDia;

   SegDelDia= (long) now.second() + ( 60L * (long) now.minute()) + ( 60L*60L * (long) now.hour() );
    DimeoActual=DimeoSegDelDia(SegDelDia);
}

Trabaja sobre esto y me vas diciendo.
#48
Ok , lo hare, lo haces tan facil que dan ganas de meterse en este mundillo y hacer proyectos cada vez mas grandes, de todas formas deberias hacer unos videotutoriales en youtube,tendrias un monton de reproducciones jajaaj te lo aseguro con tus conocimientos,respecto a trabajar sobre lo que has posteado , primero voy a hacer unas cuantas pruebas con mi placa para cogerle un poco el tranquillo, o sea , pasos basicos para no meterme tan de golpe con mi tema del dimeo progresivo de leds, no obstante la infroomacion que me has aportado para el reloj me va a ser muy util, no hay mucha gente hoy en dia que se preocupe de los problemas de otros......falta mucha gente como tu en este mundo, otravez , mil gracias por tu aporte.
#49
Perfecto. Te recomiendo que compiles un programita muy básico tipo "hola Mundo", para entender lo básico.

Uso sprintf con una cadena auxiliar para poder mostrar salidas formateadas con distinto tipo de datos. (No la uses con datos de coma flotante porque esa funcionalidad no la incluye el compilador de Arduino)

Código:
char CadAux[200];
int Cont=0;

// La función setup() es especial se ejecuta en primer lugar una sola vez al principio
// nada más arrancar el Arduino
void setup(){
      //Abrimos el puerto serie a 9600 baudios
     Serial.begin(9600); // inicializamos el puerto serie.
     Serial.println("Terminada la Incialización");
}

// La función loop() es especial, se ejecuta continuamente dentro de un bucle el Arduino
void loop(){
     // Creamos una cadena con el nuevo dato
     sprintf(CadAux,  "Valor del contardo= %d",  Cont);  
     Serial.println(CadAux);  // Sacamos la cadena por el puerto serie.
     delay (3000);  // Esperamos 3 segundos
     Cont++;    // Incrementamos el contador
}

Para ver la salida de este programa tendrás que activar la consola del monitor del puerto serie en el IDE.

Gracias a esta técnica podrás poner trazas en tus programas para ir viendo por donde pasa tu código y poder depurarlo en el caso de que algo no funcione según lo previsto.
#50
Pues yo ya he podido ponerme .... y fracaso total Smile
Como se nota que estoy oxidado ...

A ver ... Mi proyecto sera con Leds de 10W ...
En principio estoy poniendo 2 en paralelo. A 12V ... es como mirar al sol Smile

Estoy intentado trastear con un TIP 142... y aqui es donde tengo el problema

Se que todos los circuitos que he visto se basan en led de 1 ó de 3W. Se conectan en serie ... asi que yo he hecho lo mismo, pero el TIP controlara 2 Led en paralelo ....

Lo acabo de conectar ... y no funciona ... solo luce 1 .. y no entero... solo una parte ...

Me he desanimado y lo he desconectado ... y de repente se me ocurrió lo obvio ... No habre puesto los led invertidos con la alimentación .... ????

Asi que he vuelto a revisar ... y estaba del reves
Lo he conectado bien. he cargado el ejemplo Fade y he cambiado el pin de salida ....

TACHAN Smile



Ajustando un poco el tiempo y la suavidad del dimeo ....



Ahora a pensar en el reloj para programar el encendido Smile
#51
Hola, esta muy bien , a ver si yo consigo hacer eso, y si me explicas como lo has hecho mejor , jejejeje, tambien deberias retardar mas el encendido y el apagado no?
#52
(05-04-2014, 01:49 AM)juanma1970 escribió: Hola, esta muy bien , a ver si yo consigo hacer eso, y si me explicas como lo has hecho mejor , jejejeje, tambien deberias retardar mas el encendido y el apagado no?

Será un programita de prueba, es lo suyo. Smile

Felicidades Namiga.
#53
Si. Ha sido con el ejemplo Fade de Basics. viene de estandar con el IDE de Arduino ...
Luego os pongo l esquema electrico que he hecho

Un saludo
#54
En mi canal acabp de publicar las primeras pruebas de iluminación con dimeo de LEDss controiado por arduino.
http://youtu.be/htc4HhB_2kc

Aunque no he querido entrar en detalles tecnicos en el vídeo, porque se trata solo de unas pruebas y no de algo definitivo, vosotros podeis preguntar lo que queráis. Yo uso LEDs de 100mA que no necesitan disipador de calor.

También puedo comentaros cuales son los cambios que estoy introduciendo a este sistema de iluminación.
#55
Hola antonio, llevo ya unos dias haciendo pruebas con el arduino , antes de meterle mano a lo grande , creo que definitivamente si que voy a tener que pedirte ayuda, esto se me va de las manos, mas que nada por que no tengo mucho tiempo al cabo del dia, pero voy haciendo cosillas siempre que puedo.
#56
(11-04-2014, 08:03 AM)juanma1970 escribió: Hola antonio, llevo ya unos dias haciendo pruebas con el arduino , antes de meterle mano a lo grande , creo que definitivamente si que voy a tener que pedirte ayuda, esto se me va de las manos, mas que nada por que no tengo mucho tiempo al cabo del dia, pero voy haciendo cosillas siempre que puedo.

OK.

Dime que cosas has aprendido, y que cosas te propones hacer que te infunden mayor respeto.
#57
Bueno de momento he aprendido que quien me mandaria a mi a meterme en estos berenjenales, solo he estado haciendo cambios en los ejemplos del arduino y ahora pasare a intentar hacer un programa , poco a poco , no tengo ninguna prisa , pero mas adelante me gustaria hacer lo que te comente de dimear los leds mios que son leds de 3,3V 3W alcanza 1050mA a partir de 3,8vdc
Alta intensidad lumínica superior a 230 Lúmenes.
Blanco 15.000º Kelvin.
Y estan dimeados por una fuente de alimentacion deam well 60-48 .....pero eso sera otra historia, cuando me llegue el lcd 4884 ya iremos haciendo pruebas, no obstante darte las gracias de nuevo por tu interes.Posteare alguna foto para que veas que es lo que tengo.
#58
Debería pensar sobre qué es exactamente lo que quieres que haga el programa y fíjate que estoy diciendo el qué y no el cómo, porque no deben mezclarse amabas cosas en un mismo análisis.

La primera reflexión es que la variación de la intensidad de la luz ocurrirá en función de algo. Arduino tiene un contador de milisegundos que para una demo de dimeo se podría usar.

En mi caso, yo hago depender el dimeo de la hora de un reloj de tiempo real (RTC). Yo uso un Reloj que se comunica con un bus I2C (Usar solo dos pines). Se maneja con librerías que son fáciles de usar. Esto permite que si se va la corriente, el horarrio de la iluminación no se altere cuando la corriente vuelva porque el RTC tiene una pila para seguir funcionando.

Esta simple funcionalidad que parece muy conveniente implicaría entre otras cosas poder poner en hora manualmente el reloj. A su vez eso obliga a algo del tipo sistema de menús y e display LCD.
Cuando recibas tu LCD 4884 tendrás que probarlo con algún ejemplo. No conozco ese LCD, pero puede que las librerias te simplifiquen gran parte del trabajo que yo he tenido que hacer para gestionar menús. Aún estoy con ello.

Cómo muy bien dices no hay que tener prisas en ver resultados.
#59
De momento he conseguido esto ....no esta mal para una semana que llevo ...no?



int luminosidad = 0; // variable para asignar la luminosidad al led
int led = 11; // pin del led
void setup()
{
// en el setup no hay que configurar nada
}
void loop()
{
for (luminosidad = 0 ; luminosidad <= 255; luminosidad=luminosidad+1) // fade in (from min to max)
{
analogWrite(led, luminosidad); // ilumina el led con el valor asignado a luminosidad (entre 0 y 255)
delay(30); // espera 30 ms para que se vea el efecto
}
for (luminosidad = 255; luminosidad >=0; luminosidad=luminosidad-1) // fade out (from max to min)
{
analogWrite(led, luminosidad);
delay(100);
}
}
#60
Eso está muy bien. Ese es el tipo de pruebecitas sencillas que tienes que hacer ahora.

Puesto que se trata de aprender, me voy a permitir hacer correcciones de estilo que es donde veo que necesitas más ayuda.

El estilo es importante para que tus programas sean más legibles y fáciles de mantener.

También te explico un poco de teoría muy básica para que vallas ampliando conocimiento relativos a cosas que van surgiendo.

El compilador tiene un componente llamado preprocesador cuya función es hacer una pasada que realiza algunas funciones convirtiendo el código en otro código modificado. Una de las cosas que hace es suprimir los comentarios porque no interesan al compilador.

Hay varios tipos de macros. Las macros que se usan para definir nombres simbólicos para constantes se usan mucho. El identificador de esas macros ha de comenzar por el carácter #.

Verás que en los programas de Arduino se suelen usar estas macros para definir los pines. Eso es porque el pin es un detalle del hardware. El Pin indica la forma en que se va a conectar algo y eso no varía durante la ejecución del programa.

Por ejemplo:

#define PinLed 11

Ni usa el símbolo de asignación "=" ni el terminador de sentencia ";" al final de linea.

El final de linea sería el terminador de la macro. Se puede poner un comentario.

La macro que hemos declarado hará que la pasada del compilador se sustituya en el código todas las partes donde aparezca ese identificador de macro "PinLed" por la constante 11.

Facilita el mantenimiento porque basta sustituir la macro para que la constante cambie en todo el código, pero no es una variable.

El identificador "led" lo he sustituido por "PinLed". En un programa más grande la claridad de un identificador te ayuda a interpretar correctamente el programa con una simple lectura.

La indentación de los programas también te ayudará con el tiempo a leer los programas y facilitará la depuración en caso de que algo falle.

La sintaxis de C es de estilo Libre, pero usar el estilo habitual en C te acerca al uso normalizado y te permite entender mejor cosas escritas por otros y por ti mismo. También facilita que otros puedan leer mejor tus programas.

Fíjate la posición donde coloco las llaves para que queden los bloques lógicos de código más visibles.

Código:
// *********************************************************
// Autor: Juanma
// Programa de prueba para hacer variar la luminosidad de un LED
// *********************************************************

#define PinLed = 11  // pin del led

int luminosidad = 0; // variable para asignar la luminosidad al led

void setup() {
    // en el setup no hay que configurar nada
}

void loop(){
    for (luminosidad = 0 ; luminosidad <= 255; luminosidad=luminosidad+1){ // fade in (from min to max)
        analogWrite(led, luminosidad); // ilumina el led con el valor asignado a luminosidad (entre 0 y 255)
        delay(30); // espera 30 ms para que se vea el efecto
    }
    for (luminosidad = 255; luminosidad >=0; luminosidad=luminosidad-1){ // fade out (from max to min)
        analogWrite(led, luminosidad);
        delay(100);
    }
}

Usuarios navegando en este tema: 1 invitado(s)


Salto de foro: