Arduino Forum

International => Español => Proyectos => Topic started by: Perdido on Mar 03, 2018, 11:00 pm

Title: Control de luces de Acuario
Post by: Perdido on Mar 03, 2018, 11:00 pm
Hola!!,

Soy un novato total en esto de la electrónica, y necesito ayda  ::)  el caso es que llevo algunas semanas tratándome de documentar como seria el esquema para una lampara de acuario, creo que tengo todo mas o menos claro... excepto una cosa... las resistencias que irían entre el arduino y la fuente de alimentación...

Según los cálculos que he realizado, la fuente de alimentación para este circuito debería ser superior a 33V y 2.8A, y siguiendo algún esquema que he visto por ahí, las conexiones se deberían realizar según he puesto en el esquema que adjunto.... ahora bien... como el arduino hay que alimentarlo a 9V... supongo que hay que reducir el voltaje de la fuente de alimentación de 33V a 9V.... con que debería reducirlos? he visto a veces se hace con transistores mosfet TIP122, o similares, pero por mas que busco no termino de aclararlo.

Por otro lado los amperios...habría que reducirlos también, o no es necesario? arduino es capad de reducir esa intensidad?

En cuanto al resto del circuito... os parece correcto?, de cuanto me recomendaríais que fuera la fuente?

Bueno muchas gracias!!!


(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=247895)
Title: Re: Ayuda diseño con las resistencias/mosfet
Post by: surbyte on Mar 03, 2018, 11:46 pm
Mira el privado con las instrucciones para editar título y que la imágen se pueda ver en el post directamente.
Lee las normas del foro.
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Mar 04, 2018, 04:26 am
Necesitas 3 MOSFET que entreguen un minimo de 3A por color a 33V.
Un IRF530 entregará unos 4A con 5V del Arduino. Un IRF540 será mejor.

Cualquiera de los dos funcionará bien para tu necesidad.

Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 04, 2018, 10:11 pm
Gracias por la respuesta.

Llevo todo el día mirando como funciona el IRF540 por lo que veo amplifica los 5V del arduino al driver,  que funciona a 10V

No se si tengo mas dudas que antes. He modificado el esquema y creo que debería quedar algo así:

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=248009)

¿las conexiones del IRF540 al arduino son correctas?

Por otro lado.. como debería quedar conectado el arduino a la fuente de alimentación?, tiene que llevar su propio transformador a 9V o se puede conectar al de 33V sin recalentarlo?
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Mar 04, 2018, 10:33 pm
El mosfet es una llave como si fuera un RELE, tu le envias 5V y se pone en modo saturación en el que permite que circule corriente entre Drain y Source que es donde estarán conectados tus LEDs.

Algo asi

(http://www.inventable.eu/media/97_Led_Driver_Control/Led_Driver_Control_circuito.png)

Este es un driver PWM para LEDs usando un IRF530 con un circuito de control tal que permita mas corriente que lo que yo te he indicado y que además tiene un elemento de protección que limita la corriente al valor que tu determines para que se evite un cortocircuito por ejemplo.
Es la R y R' y el transitor que en caso de activarse, pone a 0 la tensión en el MOSFET y evita que se queme.

Pero si solo miras todo menos es R o R' y ese transitor de la derecha te queda un circuito (sin protección) y que entrega el máximo de ese MOSFET.


Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 05, 2018, 09:08 pm
Si he entendido el esquema que has puesto... al tener ya un driver ldd-700h.... quedaría algo así:

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=248125)

Aunque me da la sensación que algo me falla...
Title: Re: Diseño con las resistencias/mosfet
Post by: Swift on Mar 05, 2018, 10:04 pm
Estan mal echas tus conexiones no has entendido bien lo que dice surbyte, como el explica necesitas 2 transistores para que el irf530 te entregue su máxima intensidad te recomiendo leer este articulo esta bien detallado como lo tienes que hacer COMO CONECTAR UN MOSFET DE POTENCIA A UN MICROCONTROLADOR (https://www.inventable.eu/como-conectar-un-mosfet-a-un-microcontrolador/)
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 11, 2018, 01:04 am
Después de leer y volver a leer el los post otra vez, y el articulo que me habéis recomendado, alguno que otro mas y dar mil vueltas... sigo sin entender muy bien por que se necesita poner los transistores, si ya tengo en el circuito un driver que en teoría debería tener un circuito de seguridad y permite hacer un dimedo por PWM.... pero bueno, siguiendo los consejos sobre el mosfet entiendo que debería quedar algo como esto:

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=248836)

¿Estaría mas correcto que antes?¿voy acertando algo?... ¿o lo estoy liando mas?
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Mar 11, 2018, 08:20 pm
Eso ocurre porque  nunca lo dijiste!!
Personalmente entendí que eran fuentes y no drivers dimerizables.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 11, 2018, 11:17 pm
jajaja, pues si que!!

Pensaba que en el gráfico que hice ya se veían!!, los ldd-700h, hable de ellos en el anterior comentario, con razón tenia la sensación que no nos entendíamos.... no me cuadraba nada!!  :o  :smiley-confuse:

Como la idea es que este 12h-24h al día encendido, lo mejor creo que es poner un buen driver, que supongo que resistirá y administrara mejor el sistema.

Entonces supongo que habrá que volver al primer esquema que hice... estaría correcto con unas resistencias de 10K? o ni siquiera serian necesarias?

Por otro lado... que seria mejor conectar la placa con una fuente de 12V propia, o conectarla al circuito principal con la fuente de 33-40V?, supongo que para hacer eso ahí si que hay que rebajar la intensidad y el voltaje no?
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Mar 11, 2018, 11:35 pm
Lee todo el hilo y dime donde dice LDD-700h?
Ahora con ampliación leo LDD-700h.
Si todo giraba en torno a este dispositivo porque no lo expresaste claramente e inclusite una hoja de datos o manual?
BUeno ya pasó y se descubrió el misterio pero que pérdida de tiempo!!

Yo no se si con una resistencias como dices es suficiente.
No se si ese driver funciona con 5V o necesita otra tensión para controlar el dimmerizado.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 12, 2018, 07:46 pm
Concretamente lo dije en el comentario #5, ademas en los esquemas, la cajita negra lo ponía... luego lo reemplace por la propia imagen del driver por si no estaba claro.... El fallo ha sido que debía estar demasiado pequeño.

Tampoco ha sido una perdida de tiempo! he aprendido algunas cosas gracias a eso, y si tengo tiempo igual intento hacer el esquema que me has propuesto, aunque solo sea por aprender, así que nada aclarado el lió... al turrón!

Este es el driver (http://www.meanwell.com/webapp/product/search.aspx?prod=LDD-H)

Encontré este articulo hablando de el, pero por alguna razón me da la sensación de no estar completo: ver artículo (http://www.fishroom.es/blog/2015/07/como-conectar-un-driver-mean-well-ldd-a-una-serie-de-leds/)

Muchas gracias por la paciencia!!
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 29, 2018, 08:21 pm
Bueno,

Como nadie ha podido aportar nada mas, he seguido avanzado en el proyecto, la información que hay acerca de los ldd es algo escasa, pero tirando de ella, he llegado a la conclusión que esta es la forma mas acertada de conectarlos...

En cuanto al resto de novedades, he ido comprando los componentes que he puesto en el gráfico para ir haciendo pruebas, no me queda otra, y estoy a la espera de ir recibiéndolos.

Aun así mantengo una duda, por un lado, la solución del step down para conectar el arduino a una única fuente de alimentación... no he encontrado ninguno que trabaje de 48V y tenga regulador de intensidad... con lo que he puesto un LM7805 para rebajarla... es demasiada intensidad y generaría demasiado calor?? o por el contrario estaría correcto? que os parece esa solución?? (aun no he comprado estos dos componentes).



(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=251424)
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Mar 30, 2018, 12:53 am
48V no puedes aplicar a un LM7805.

La hoja de datos dice
(http://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=251441)

que una PWM > 2.5V y hasta 6VDC es lo esperable.
Por lo tanto los 5V del arduino funcionarán correctamente.

comparte GND con Arduino y la salida PWM a esta entrada de dimming. Haslo con 1 a ver como se comporta.
Title: Re: Diseño con las resistencias/mosfet
Post by: _jose_ on Mar 30, 2018, 10:16 am
si es un  stepdown con salida a 12v puedes alimentar el arduino por pin vin (+) y gnd y ahorrarte el 7805.si  es un driver,la cosa cambia.no tienes por ahi un cargador de mobil de calidad ?alimentas la placa por usb y si es necesario comunicas el gnd con el de la fuente.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 30, 2018, 05:56 pm
Es un step down regulable a 12V o 9V incluso, la duda que tengo es por la intensidad.... creo que solo te permite bajar el voltaje de ahí lo de poner el LM... esperando rebajar con el los 4.4A a 1A.... Por motivos que desconozco la mayoría de step down que hay solo trabajan a 40V como máximo, y algunos si que permiten rebajar la intensidad, pero a 48V ya no he encontrado ninguno.

En cuanto a poner un cargador a la placa tengo otra duda... no seria necesario poner un octoacoplador para separar los dos circuitos?, si lo engancho al driver, estaría mezclando las dos voltajes? pasaría algo al hacerlo?? o al conectarlo únicamente al PWM ya no seria necesario???
Title: Re: Diseño con las resistencias/mosfet
Post by: _jose_ on Mar 30, 2018, 06:52 pm
No hay problema con la intensidad en el stepdown ,el arduino consumira el amperaje que necesite.Si usas un cargador de mobil tendras que conectar los negativos del cargador y de la fuente ,ya que vas a usar los 5v de la salida analogica del arduino para dimear los drivers que alimentas con la fuente. Ojo ,con el cargador de mobil no alimentas por pin vin y gnd ,si no por el mismo conector con el que usas para el usb del ordenador.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Mar 30, 2018, 07:17 pm
Entonces... el arduino seria capaz de absorber el excedente de 4A?... no lo recalentaría??

Buscare un transformador que alguno tendré por ahí seguro, pero por alguna razón me parece algo mejor la solución del step, me da la sensación de ser como menos engorroso tener solo una conexión de corriente que dos, aunque en realidad de un poco igual.
Title: Re: Diseño con las resistencias/mosfet
Post by: _jose_ on Mar 30, 2018, 07:48 pm
no hay excedente ,imaginate una fuente de pc de 700w ,que puedes usar tanto para un pc gamer que puede consumir 350w o mas ,solo en procesador y grafica, como para uno de ofimatica con un procesador de 45w y grafica integrada ...¿a donde va la diferencia? simplemente la fuente modula la salida segun la demanda.
Title: Re: Esquema iluminación acuario led con ldd drivers
Post by: Perdido on Apr 01, 2018, 04:58 pm
Muchas gracias por la ayuda!

Al final me decanto por el step down, los transformadores viejos que tengo por casa son o de 5V nada mas o de menos mA.

Así que nada ahí pongo el esquema, añadiendo ademas las conexiones para una pantalla ILI9225 3.3V (creo que me precipite al comprar este componente ya que no trabaja a 5V, no me di cuenta, pero tiene solución) por si a alguien le sirve.

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=251795)
Title: Problema conexiones... creo...
Post by: Perdido on Oct 21, 2018, 02:12 pm
Buenas otra vez,

he continuado avanzando en este proyecto... y cuando creía que ya lo tenia todo montando... me ha surgido un fallo que no entiendo por que ocurre y no se me ocurre como resolver... a ver si me podéis decir que estoy haciendo mal.

Al diseño que ya tenia, he añadido 6 sensores de temperatura, uno para cada canal de color, otro para la temperatura del agua y 4 ventiladores de 5v para el disipador.

El caso es que al ir a conectar el pin de 5V que los conecta, la placa arduino parece que no termina de arrancar, le llega corriente por que se encienden los leds pero con escasa potencia.. de forma atenuada... si quito el pin de 5v funciona perfectamente... También pasa con el led que trae el step down, que alimenta al arduino, curiosamente, cuando falla se queda en un estado rojo/verde. Es como si hubiera algún elemento que esta haciendo excesiva resistencia.

Los ventiladores los he puesto en dos series, con un diodo de protección por cada una de ellas y un transistor 2n2222, lo único que se me ocurre es que no sean el transistor adecuado para esos 20v.

He comprobado la continuidad de todos los elementos y parece que esta todo correcto. Asi que no se que puede estar pasando. Adjunto el gráfico actualizado y un par de fotos del montaje por si ayudan algo.

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=278672)

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=278674)

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=278676)
Title: Re: Diseño con las resistencias/mosfet
Post by: jordi3sk97 on Oct 22, 2018, 02:35 am
He estado un rato leyendo tus mensajes, no termino de entender lo que quieres hacer ni se porque no obtienes lo que quieres.....

Pero si que he encontrado algunas discrepancias entre lo que dices y lo que dibujas, veo que te has esforzado en mostrarlo pero en algún momento has perdido la concentración.

IMHO Te recomiendo que hagas las cosas paso a paso. conectando la electrónica de uno en uno, por ejemplo:

1 - Conectar las alimentaciones uniendo los negativos y comprobando tensiones.
2 - Conectar ventiladores y dar positivo a la R de 330 Ohms y comprobar que los ventiladores funcionan.
3 - Conectar los leds y Drivers y seguir comprobando tensiones.(No conectar los driver sin los leds)
4 - Conectar, ahora si, el Arduino , y con un pequeño programa comprobar que activa y desactiva los ventiladores.
5 - Ampliar el programa para comprobar la modulación de los led.
6 - Conectar el RTC + programa que compruebe que funciona bien + lo anterior
7 - El lector de SD +  programa .....
8 - Uno de los sensores + programa .....
9 - El resto de los sensores........
10 - Por fin, tu programa, sabiendo que tienes el hardware  controlado.

../..
Los ventiladores los he puesto en dos series, con un diodo de protección por cada una de ellas
Que es dos series ? En el esquema los ventiladores están en paralelo.
Porqué pones diodos ? y porqué 4 ? No son ventiladores Brushless ?
El símbolo del diodo no es ese.

../..
El caso es que al ir a conectar el pin de 5V que los conecta,
"Los conecta" el que ? los ventiladores ? no van a 20V ?  De que pin hablas ?

Mirando el circuito
La resistencia de 4.7K no es PullDown, es PullUp

Las resistencias de 10K tal y como están no sirven para nada bueno, si han de ser PullDown (que yo no digo que lo hayan de ser) tendrían que estar conectadas cada una de ellas entre negativo y cada una de las entradas de los drivers, (cables azules).

Los negativos GND de "potencia", únelos fuera del Arduino, el que más duele a los ojos es el de los ventiladores. Puedes unir los negativos de las salidas de los StepDown antes de llegar al Arduino

Asegúrate que en los StepDown, los negativos de entrada y salida sean los mismos, es decir, que la pista de la pcb vaya directa. Si no fuera así no se podrían unir los negativos de la fuente de 48V con los de las salidas de los StepDown y todo tu sistema seria un fracaso.

Convierte tu puzzle en partes pequeñas y lo conseguirás, Suerte.

PD, (No seria conveniente cambiar el titulo del hilo ?)
Title: Problema conexiones... creo...
Post by: Perdido on Oct 22, 2018, 09:41 pm
Ante todo muchas gracias por la respuesta!

Perdona si no me he explicado bien, a veces tiendo a correr :smiley-roll-blue:  intentare hacerlo mejor ahora:

El objetivo es montar una iluminación para un acuario, con 5 canales de luz con dimeado independiente para cada uno de esos canales, medidor de temperatura del agua, y mas funciones que espero poder ir haciendo según aprenda algo mas...

El esquema que puse efectivamente tenia algunos detalles que no eran exactos (por no redibujarlo), así que ahí pongo uno que si que lo es. Respecto a las "series" (no se si esta bien dicho así) de ventiladores, los dividí en 2 para rebajar el voltaje de los dos transistores por que no estaba seguro si aguantarían 20V. Me pareció que seria mejor dos grupos de 10V.

El pin de 5V creo que me refería al de los sensores de temperatura.

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=278912)

Cuando he leído tu mensaje he caído en la cuenta de una cosa... había probado todas las partes por separado en la Protoboard ... todo funcionaba bien y ya daba por supuesto que por lo menos la parte de los leds estaba perfectamente ya que al encender se iluminaban sin problema... pero no había probado si se apagaban y encendían o si funcionaba el dimmer en el proyecto final!  :-[  

Lo he probado ahora y apagar y encender si lo hace.. pero el dimmer... nada de nada.. solo apaga y enciende... así que como has comentado, deben de ser las resistencias que están puestas como pull-up...  parece que has acertado en eso!, supongo que creía cuando lo diseñe que el modulo de los drivers ya conecta el negativo a la placa.. Primer error por lo que se ve...

En cuanto a montarlo por partes... tienes toda la razón, no lo había hecho por que tengo de desoldar unas cuantas cosas... pero creo que no tengo mas remedio.

Tengo también mis sospechas que los GND no estén correctos, no entiendo muy bien lo que me comentas, por un lado dices que puedo unirlos los steps down antes de conectarlos a la placa... por donde exactamente? los dos por la conexión out y luego de esta a al pin GND arduino?, no se que diferencia habría ya que tal y como esta ahora.

Y por el otro hablas de comprobar los negativos de salida y entrada... ¿no deberían ser 0V al ser GND? tampoco se a que te refieres con la pista pcb y directa.... ¿con que?

Menuda parrafada que he soltado ;P

PD: he intentado cambiar el titulo del post... solo me cambia el del ultimo mensaje, no he sido capaz :smiley-confuse:



Title: Re: Diseño con las resistencias/mosfet
Post by: jordi3sk97 on Oct 22, 2018, 10:36 pm

Tengo también mis sospechas que los GND no estén correctos, no entiendo muy bien lo que me comentas, por un lado dices que puedo unirlos los steps down antes de conectarlos a la placa... por donde exactamente? los dos por la conexión out y luego de esta a al pin GND arduino?, no se que diferencia habría ya que tal y como esta ahora.

Y por el otro hablas de comprobar los negativos de salida y entrada... ¿no deberían ser 0V al ser GND? tampoco se a que te refieres con la pista pcb y directa.... ¿con que?

Intentare explicarme mejor.

Los dos puntos anteriores se refieren a lo mismo, al (-) o GND.

Tienes 3 (-) de tres  fuentes de tensión, uno de la fuente de 48V y dos de los StepDown, 
En el primer dibujo cada uno de los tres lo conectabas a un terminal (-) de la placa Arduino.
Esto no es bueno, conecta los tres (-) juntos fuera de la placa y luego conecta un solo (-) al Arduino.

Ahora bien, esta mezcla de tres fuentes de tensión que haces, (y que a mi no me gusta nada) solo funcionara si el (-) de la fuente de 48V es exactamente el (-) de las salidas de los StepDown.

Para verlo tienes que coger los StepDown y mirar las pistas, el (-) de la entrada tiene que ir directo al (-) de la salida .
Dicho de otro modo, los electrones que salen del (-) de la fuente de 48V y que llegan al (-) de la entrada del StepDown y siguen hasta el (-) de la salida del StepDown lo tienen que hacer pasando solo por cobre, sin nada de electrónica en su camino. La electrónica ha de quedar en los (+). 
Lo siento pero no te lo se explicar mejor.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Oct 22, 2018, 11:30 pm
Creo que entiendo lo que dices, te refieres a los propios componentes, los steps downs, que tengan unión directa en el negativo sin pasar por el ningún componente entre sus dos polos.

Uno tengo claro que si que es directo, parece que por detrás hay un hilo que no pasa por nada mas, el otro no se ve nada por debajo... así que he probado la continuidad entre los dos y si que da... así que supongo que no hay ningún componente entre medias.

Ahora me has dejado preocupado con aquello de que no te gusta la unión de las tres fuentes de tensión.... como he comentado soy novato en estos temas y esa fue la solución que encontré al tema de la fuente de alimentación.

¿que otra/s solución/es podría haber para este caso que fuera mas correcta? ¿por que esta no es buena?
Title: Control de luces de Acuario
Post by: Perdido on Nov 04, 2018, 06:20 pm
He estado probando diferentes cosas y he encontrado lo siguiente:

1. El dimeado no funciona con las resistencias pull-down o pull-up (pasa lo mismo con las dos configuraciones). Eliminándolas ha funciona la iluminación con el dimer sin problema.

2. El error que preguntaba que provocaba el apagado de la placa arduino... había puesto mal el gnd y el 5v... no se que paso pero me lié:smiley-roll-sweat: , así que ya no se produce un corto, pero surgió otro problema, me seguían sin dar lectura los sensonres de temperatura... enredando mas he visto que solo podía conectar 3 a un pin... peerroo... rebajando la resistencia a 4k en vez de 4,7k si que funcionan 6 sensores.

3. haciendo pruebas con los ventiladores... no se que hice... pero creo que me los he llevado por delante.... los 4 :smiley-cry: supongo que habrá sido por meterle mas intensidad de corriente... El miedo que tengo ahora es comprar otros nuevos y volver a estropearlos... ¿como puedo probar ese circuito sin riesgo de freírlos?

Tengo pensado unir las masas gnd como me habéis comentado... el tema es que no se como puedo rebajar esa intensidad de la fuente de alimentación ¿alguna idea? o pensáis que puede ser otra cosa?

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=280590)
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Nov 04, 2018, 07:26 pm
Nada consume mas de la cuenta.
Uno o 4 ventiladores que consume X mA seguirán consumiendo 4*X mA si estan conectados en paralelo.
De modo que usa una fuente de 1000A y ellos seguirán consumiendo lo que requieran.

Lo único que quema un ventilador de 12V por dar un dato es aplicarle mayor tensión lo que obliga a que circule mayor corriente.
Title: Ventiladores fritos...
Post by: Perdido on Nov 04, 2018, 11:11 pm
oks gracias,

Supongo que siendo así, lo que habrá pasado al toquetear, es que cuando les di corriente, no estarían haciendo contacto 2 ventiladores y los otros dos si... recibiendo los 20V esos 2 en vez de los 10 que debían entrar para cada bloque...y al seguir toqueteando me he llevado por delante los otros 2.

Que rabia! :smiley-confuse:

Existe alguna forma de poder recuperar esos ventiladores? o me olvido y toca comprar nuevos?
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Nov 05, 2018, 12:06 am
Pero como 2 ventiladores reciben 20 en lugar de 10, como los conectaste? En serie?

Los ventiladores tienen una especificación como todo. Se alimentan con determinada tensión digamos 12V y se conectan en paralelo.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Nov 08, 2018, 09:47 pm
Los ventiladores estaban conectados como en el gráfico... en paralelo 2 y 2 en serie... y ahora que lo dices... al estar en paralelo... el step down tenia que dar 10V no 20V.... he ahí la gran metedura de pata... no?
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Nov 08, 2018, 09:49 pm
Son ventiladores de que tension? 10 V?
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Nov 08, 2018, 09:57 pm
5V... aunque ahora que me los he cargado estoy pensado en poner 12V... supongo que disiparan mas,  pero dudo ya que me gustaría reducir el consumo total.
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Nov 08, 2018, 10:00 pm
Mi dios que batido de datos tienes en la cabeza.

Si los ventiladores son de 5V debes usar 5V y si estan en serie, los 10V a dos en serie estaba bien aplicado.

Pero no es algo aconsejable. Lo aconsejable es ponerlos en paralelo y aplicarles 5V a los 4.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Nov 08, 2018, 10:16 pm
Jejeje, si me he dado cuenta ahora que es todo como dices, es mejor ponerlos en paralelo, por que como falle solo una conexión, te llevas todo por delante!!

Me he despistado pero bien al aplicar 20v cuando tenia que haber sido 10v para cada pareja... en fin... así no se me vuelve a olvidar la diferencia entre serie y paralelo :-[
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Nov 08, 2018, 10:21 pm
Si claro.. y menos mal que no te ha molestado lo del batido.. era broma pero ilustraba un poco tu confusión.

Se juega con serie/paralelo con resistencias.
Con lo demas hay que ser cuidadoso dentro de las tolerancias de cada dispositivo.

Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Nov 08, 2018, 10:58 pm
Jjeje no te preocupes me lo suelen decir mucho  ;)

Al conectarlos así, supongo que ahora me sobra ese segundo step down, así que nada, ahí pongo el gráfico. Así estaría correcto todo no?

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=281179)
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Nov 08, 2018, 11:46 pm
Pareciera que si.
Yo ya simplemente estoy perdido con este proyecto asi que me consejo es que vayas probando las cosas paso a paso.

No veo resistencias de base en los 2n2222.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Nov 08, 2018, 11:56 pm
Si, iré probando! Muchas gracias por la ayuda, teóricamente ya debería estar todo correcto, espero no volver a meter la pata cuando vuelva a conectar todo  :smiley-eek-blue: 

He puesto una resistencia para cada una de las bases de 330Ω de los 2n2222 están un poco pequeñas en el gráfico, si lo amplias deberías poder verlo sin problema.
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Nov 09, 2018, 01:12 am
Tienes razón.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Dec 30, 2018, 10:11 pm
Ya casi creia que lo tenia completo, pero me he encontrado con 3 errores de programación que no se como puedo solucionar:


Espero haberme explicado bien y a ver si me podéis iluminar por donde puedo tirar.... Gracias!

Ahí pongo el código del punto 1 que va a quedar mas claro, decirme si necesitáis que ponga el completo (creo que es mejor ver los problemas por partes).

Code: [Select]
#include <TimerOne.h>
#include <Wire.h>
#include "RTClib.h"

RTC_DS3231 rtc; // Declaramos un RTC DS3231

const int led[5] = {10,45,13,46,44}; //pines led, Deben ser PWM

int dameHora = 0;
int dameMinuto = 0;
int dameSegundo = 0;
volatile unsigned long contador_dimmer = 0; // La definimos como volatile
int i,j; //Variables auxiliares para ciclos repetitivos

void setup () {
  Serial.begin(9600);

  for(i=0; i<4; i++){ //salidas pines led
    pinMode(led[i], OUTPUT);
  }
 
   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
  }
}

// hay que descomentar la linea de debajo y compilar solo una vez para actualizar hora
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

//--- Declaramos interrupciones---//
void dameTimer_mas(){
 //Timer1.initialize(1000000); //Creamos interrupcion cada segundo
  // Timer1.initialize(16000000); //Creamos interrupcion cada 5 segundo
   //Timer1.initialize(7058823);  //Creamos interrupcion cada 7,058823 seg para hacer dimmer 30m
   Timer1.initialize(14117647); //Creamos interrupcion cada 14,117647 seg para hacer dimmer 1h
   Timer1.attachInterrupt(dimmer_mas); // Activa la interrupcion y la asocia a la funcion interrupcion
}
void dameTimer_menos(){
   Timer1.initialize(14117647); //Creamos interrupcion cada 14,117647 seg para hacer dimmer 1h
   Timer1.attachInterrupt(dimmer_menos); // Activa la interrupcion y la asocia a la funcion interrupcion
}

//--- Contador creado por cada interrupcion---//
void dimmer_mas(){
  if(contador_dimmer==255){
    contador_dimmer=0;
  }else{
   contador_dimmer++; // Contador veces interrupcion
  }
}
void dimmer_menos(){
  if(contador_dimmer==0){
    contador_dimmer=255;
  }else{
   contador_dimmer--; // Contador veces interrupcion
  }
}
 
void loop () {
  queHora();
  dameMillis();
  enciendeLeds();
  delay(100);
}

void queHora(){
 DateTime now = rtc.now();
 dameHora = now.hour();
 dameMinuto = now.minute();
 dameSegundo = now.second();
 
 Serial.print(now.hour());
 Serial.print(':');
 Serial.print(now.minute());
 Serial.print(':');
 Serial.print(now.second());
 Serial.print(" ");
 Serial.print(now.day());
 Serial.print('/');
 Serial.print(now.month());
 Serial.print('/');
 Serial.print(now.year());
 Serial.println();
}

void dameMillis(){//contamos en millis en vez de usar delay
  unsigned long T ;
  int n = 0 ;
  T = millis();
  while (millis() <= T + 1000){   // Mientras no pase un Segundo = 1000 mS
    n++ ;                         // Contamos cada vez que leemos
  }
}

void enciendeLeds(){
  analogWrite(led[1],0);
  analogWrite(led[2],0);  
  analogWrite(led[3],0);
  analogWrite(led[4],0);

if(dameMinuto == 54){if(dameSegundo >= 0  && dameSegundo <= 3){contador_dimmer=0;}}
if(dameMinuto >= 54 && dameMinuto <55 ){
    dameTimer_mas(); //Arrancamos interrupcion TimerOne
    ledAzul();
    monitor_dimmer();
}
}

void ledRojo(){
  noInterrupts();   // Suspende las todas las interrupciones
  analogWrite(led[0],contador_dimmer);
  interrupts();     // Autoriza las todas las interrupcione
}
void ledVerde(){
  noInterrupts();  
  analogWrite(led[1],contador_dimmer);
  interrupts();    
}
void ledAmarillo(){
  noInterrupts();  
  analogWrite(led[2],contador_dimmer);
  interrupts();    
}
void ledBlanco(){
  noInterrupts();  
  analogWrite(led[3],contador_dimmer);
  interrupts();    
}
void ledAzul(){
  noInterrupts();  
  analogWrite(led[4],contador_dimmer);
  interrupts();
}

void monitor_dimmer(){
  Serial.print("contador_dimmer = ");
  Serial.println(contador_dimmer);
  delay(100);
  Serial.println();
}
Title: Re: Diseño con las resistencias/mosfet
Post by: tauro0221 on Dec 31, 2018, 12:36 am
Hi,
Yo tengo una pregunta. Porque el uso de 4 modulos de PS y no uno que te supla el voltaje y que tenga suficiente capacidad para suplir la corriente  de las 4 lineas de LEDs.Posiblemente ya seea tarde pues la lo mejor ya compraste esto. Creo que con PS con suficiente capacidad de voltaje y corriente lo pudiste alimentarlo.  Imaginate que tengas 50 lineas de LDS vaz a usar 50 PS. Solmente una observacion.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Dec 31, 2018, 02:19 am
Hola,

Perdona pero no entiendo muy bien tu pregunta.. ¿a que te refieres con los 4 modulos de ps? y que es ps?

Lo que tengo conectado es 5 lineas de leds, cada una con 10 leds de 3,3V  conectados a 5 driver, uno por linea.

La fuente de alimentación es de 48V y de ahí va a todo el circuito... solo hay un step down de 48V a 5V para alimentar la placa Arduino, pero tira de la fuente principal.
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Dec 31, 2018, 03:55 am
Quote
3. El ultimo problema no se si es de hardware.... pero cuando muestro los datos de esos sensores, el rft comienza a volverse loco...
Qué es rtf?

Supongo que dirtas RTC no?


Otro tema:

Code: [Select]
void dameMillis(){//contamos en millis en vez de usar delay
  unsigned long T ;
  int n = 0 ;
  T = millis();
  while (millis() <= T + 1000){   // Mientras no pase un Segundo = 1000 mS
    n++ ;                         // Contamos cada vez que leemos
  }
}


No usas delay() pero como crees que funciona delay() del mismo modo o parecido.
Se supone que no consumas tiempo inutilmente, y esto son 1000 mseg consumidos cada vez que caemos ahi.

Elimina esta acción.

Asi debe quedar tu loop eliminado el damemilllis()
Code: [Select]

// define T como global

unsigned long T ;

// luego...

void loop () {
  if (millis() - T> 1000UL) {
      queHora();                 // aca mostrará la hora cada 1 segundo o 1000 mseg
      T = millis();
  }
  enciendeLeds();              // n o se que quieres hacer con los leds.
}


Los puntos 1 y 2 los estoy analizando.

Cambia esto al momento de comparar

Code: [Select]
void dimmer_mas(){
  if(contador_dimmer==255UL){
    contador_dimmer=0UL;
  }else{
   contador_dimmer++; // Contador veces interrupcion
  }
}
void dimmer_menos(){
  if(contador_dimmer==0UL){
    contador_dimmer=255UL;
  }else{
   contador_dimmer--; // Contador veces interrupcion
  }
}
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Dec 31, 2018, 12:20 pm
Quería decir TFT, el monitor de 2,4"  :-[

He reemplazado la función de Millies y parece que el ejemplo funciona mejor, también he puesto los UL acompañando a las unidades en los contadores como indicas, pero ahí no he notado ningún cambio.

¿que función desempeñan esos UL?

Lo que quiero hacer con los leds es que hagan dimmer así:

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=287964)

No se si sera la mejor manera de hacerlo, pero he pensado en ponerlos cada color en 4 fases de dimmer (0, 85, 170, 255), para que los procesos no sean eternos  y así controlar bien los colores, de tal forma que las fases deberían recorrer el rango de 0 a 85, de 85 a 170 y de 170 a 255, y luego hacerlos a la inversa

Así que para recorrer esos rangos a una hora/minuto/segundo determinados, cree un contador mediante el timerOne  que debería ejecutarse al entrar en ese tiempo establecido y recorrer el rango lentamente, por ejemplo de 0 a 85 en 30minutos.

El problema que tengo en este punto es que no me contabiliza bien y no se a que se debe pero hace mas rápido de lo q debería y los tiempos no responden.
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Jan 01, 2019, 08:00 am
Quote
¿que función desempeñan esos UL?
unsigned long, le dice al compilar que ese número es un numero entero largo y no un simple entero.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Jan 02, 2019, 11:37 pm
Punto 1 arreglado!! :D

Al final no hacia falta el timerOne, o eso creo, con la función de millis como me has enseñado a usar funciona perfectamente en el ejemplo de código que puse.

Así que he pasado al punto 2, creo que el problema se produce por algún componente del TFT, por que se produce al cargar la hora en la pantalla simplemente, salta de 2 en 2 los segundos... la librería que uso es muy especifica ya que la pantalla que pille es una china de mcufriends de 2,4", y parece ser que han dado muchos quebraderos de cabeza, y parece que solo va con esas librerías modificadas, así que las pongo por si alguien le apetece mirar que puede estar pasando....

También he visto que se produce algún retardo en los segundos al leer los sensores de temperatura, tengo los 7 en serie, igual es mucho que los lea del tirón, así que he pensado que igual seria mejor llamarlos dos veces con la función de los millies ¿seria una buena opción o no es necesario?

Bueno, por el momento pongo el programa anterior ya funcionando correctamente y añadido que cargue la fecha y hora en el TFT

Code: [Select]
#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

const int led[5] = {10,45,13,46,44}; //pines led, Deben ser PWM


volatile unsigned long contador_dimmer = 0; // La definimos como volatile
int i,j; //Variables auxiliares para ciclos repetitivos
unsigned long T ;
unsigned long R ;

//Declaramos variables monitor TFT---------------------------------------

char nombreDia[7][12] = {"Domingo__", "Lunes____", "Martes___", "Miercoles", "Jueves___", "Viernes__", "Sabado___"};
char nombreMes[12][12]= {"Enero_____", "Febrero___", "Marzo_____", "Abril_____", "Mayo______",  "Junio_____", "Julio_____","Agosto____","Septiembre","Octubre___","Noviembre_","Diciembre_"};
int dameSegundo,dameMinuto,hora,dia,mes,diaDeLaSemana;
long anio;

char dameFecha[50];
char dameHora[50];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

DateTime HoraFecha;

void setup () {
  Serial.begin(9600);

  for(i=0; i<4; i++){ //salidas pines led
    pinMode(led[i], OUTPUT);
  }
 
   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------
  tft.reset();
  uint16_t identifier = tft.readID();
  if (identifier == 0xEFEF) identifier = 0x9486;
  tft.begin(identifier);
  tft.InitLCD();
  tft.fillScreen(BLACK); //Rellenamos la pantalla de color negro*/
  
}

// hay que descomentar la linea de debajo y compilar solo una vez para actualizar hora
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));


//--- Contador creado por cada interrupcion---//
void dimmer_mas(){
  if(contador_dimmer==255UL){
    contador_dimmer=0UL;
  }else{
   contador_dimmer++; // Contador veces interrupcion
  }
}
void dimmer_menos(){
  if(contador_dimmer==0UL){
    contador_dimmer=255UL;
  }else{
   contador_dimmer--; // Contador veces interrupcion
  }
}
 
void loop () {
  if (millis() - T> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
      queHora();                
      T = millis();
  }

  if (millis() - R> 21176UL) {  //se ejecuta 2.8 veces por cada minuto para hacer 85 pasos en 30m, cada 21,176s
     enciendeLeds();
     R = millis();
  }
  //delay(100);
}

void queHora(){
DateTime now = rtc.now();

 HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
  
  dameSegundo = HoraFecha.second();
  dameMinuto = HoraFecha.minute();
  hora = HoraFecha.hour();
  dia = HoraFecha.day();
  mes = HoraFecha.month();
  anio = HoraFecha.year();
  diaDeLaSemana = HoraFecha.dayOfTheWeek();

  //tft.clrScr(); //borra texto tft

  tft.setCursor(20,20); //Posicion del cursor
  tft.setTextSize(2); //Tamaño de la fuente
  tft.setTextColor(RED, BLACK); //Color de la fuente en rojo

  /*las posiciones son ancho y alto, por ese orden*/
  tft.print(nombreDia[diaDeLaSemana], 10,5);
  sprintf(dameFecha,"%02d", dia); tft.setCursor(10, 25);  tft.println(dameFecha);
  tft.print("de", 40,25);
  tft.print(nombreMes[mes-1], 70,25);
  tft.print("del", 195,25);
  sprintf(dameFecha,"%4d", anio); tft.setCursor(235,25);  tft.println(dameFecha);

  sprintf(dameHora,"%02d:%02d:%02d", hora, dameMinuto, dameSegundo);
  tft.setCursor(10, 60);
  tft.setTextColor(WHITE, BLACK);  tft.setTextSize(4);
  tft.println(dameHora);

  Serial.print(now.hour());
  Serial.print(':');
  Serial.print(now.minute());
  Serial.print(':');
  Serial.print(now.second());
  Serial.print(" ");
  Serial.print(now.day());
  Serial.print('/');
  Serial.print(now.month());
  Serial.print('/');
  Serial.print(now.year());
  Serial.println();
}


void enciendeLeds(){
  analogWrite(led[1],0);
  analogWrite(led[2],0);  
  analogWrite(led[3],0);
  analogWrite(led[4],0);


if(dameMinuto == 8){if(dameSegundo >= 0  && dameSegundo <= 3){contador_dimmer=0;}}
if(dameMinuto >= 8 && dameMinuto <38){
    dimmer_mas();
    ledAzul();
    monitor_dimmer();
}

}



void ledRojo(){
  analogWrite(led[0],contador_dimmer);
}
void ledVerde(){
  analogWrite(led[1],contador_dimmer);  
}
void ledAmarillo(){
  analogWrite(led[2],contador_dimmer);  
}
void ledBlanco(){
  analogWrite(led[3],contador_dimmer);    
}
void ledAzul(){
  analogWrite(led[4],contador_dimmer);
}

void monitor_dimmer(){
  Serial.print("contador_dimmer = ");
  Serial.println(contador_dimmer);
  delay(100);
  Serial.println();
}


PD: no estoy seguro al 100% que la librería sea la definitiva... hice muchas muchas muchas pruebas hace tiempo y ahora mismo no recuerdo exactamente si es la correcta, espero que si, si alguien la prueba y le funciona... que lo diga
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Jan 02, 2019, 11:59 pm
Este ejemplo que has puesto va de 2 en 2?
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Jan 03, 2019, 12:54 am
Si, a mi por lo menos me saltan los segundos de dos en dos, solo cuando añado lo del tft
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Jan 03, 2019, 12:58 am
Pero el post #45 es el que te salta? No he dicho nada del código aún. Solo te pregunto si es o no.
Title: Re: Diseño con las resistencias/mosfet
Post by: Perdido on Jan 03, 2019, 01:02 am
Si, el que he puesto en el 45# es el ultimo con las modificaciones que funcionan y con el tft,  que salta de dos en dos, tanto en si lo muestra por el tft como si lo muestra escrito en la prueba del monitor
Title: Re: Diseño con las resistencias/mosfet
Post by: surbyte on Jan 03, 2019, 10:08 pm
Si este código sigue cometiendo el mismo error vamos a tener que medir (usando millis()) los tiempos de las rutinas.

Code: [Select]
#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

const int led[5] = {10,45,13,46,44}; //pines led, Deben ser PWM


volatile unsigned long contador_dimmer = 0; // La definimos como volatile
int i,j; //Variables auxiliares para ciclos repetitivos
unsigned long T ;
unsigned long R ;

//Declaramos variables monitor TFT---------------------------------------

char nombreDia[7][12] = {"Domingo__", "Lunes____", "Martes___", "Miercoles", "Jueves___", "Viernes__", "Sabado___"};
char nombreMes[12][12]= {"Enero_____", "Febrero___", "Marzo_____", "Abril_____", "Mayo______",  "Junio_____", "Julio_____","Agosto____","Septiembre","Octubre___","Noviembre_","Diciembre_"};
int dameSegundo,dameMinuto,hora,dia,mes,diaDeLaSemana;
long anio;

char dameFecha[10];
char dameHora[20];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

DateTime HoraFecha;

void setup () {
  Serial.begin(9600);

  for(i=0; i<4; i++){ //salidas pines led
    pinMode(led[i], OUTPUT);
  }
 
   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
      Serial.println("No hay un módulo RTC");
      while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------
  tft.reset();
  uint16_t identifier = tft.readID();
  if (identifier == 0xEFEF) identifier = 0x9486;
  tft.begin(identifier);
  tft.InitLCD();
  tft.fillScreen(BLACK); //Rellenamos la pantalla de color negro*/
 
}

// hay que descomentar la linea de debajo y compilar solo una vez para actualizar hora
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));


//--- Contador creado por cada interrupcion---//
void dimmer_mas(){
  if (contador_dimmer == 255UL)
      contador_dimmer = 0UL;
  else
      contador_dimmer++; // Contador veces interrupcion
 
}

void dimmer_menos(){
  if (contador_dimmer == 0UL)
      contador_dimmer = 255UL;
  else
      contador_dimmer--; // Contador veces interrupcion
}
 
void loop () {
  if (millis() - T> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
      queHora();                 
      T = millis();
  }

  if (millis() - R> 21176UL) {  //se ejecuta 2.8 veces por cada minuto para hacer 85 pasos en 30m, cada 21,176s
     enciendeLeds();
     R = millis();
  }
  //delay(100);
}

void queHora(){
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
 
  dameSegundo   = HoraFecha.second();
  dameMinuto    = HoraFecha.minute();
  hora          = HoraFecha.hour();
  dia           = HoraFecha.day();
  mes           = HoraFecha.month();
  anio          = HoraFecha.year();
  diaDeLaSemana = HoraFecha.dayOfTheWeek();

  //tft.clrScr(); //borra texto tft

  tft.setCursor(20,20); //Posicion del cursor
  tft.setTextSize(2); //Tamaño de la fuente
  tft.setTextColor(RED, BLACK); //Color de la fuente en rojo

  /*las posiciones son ancho y alto, por ese orden*/
  tft.print(nombreDia[diaDeLaSemana], 10,5);
  sprintf(dameFecha,"%02d", dia); tft.setCursor(10, 25);  tft.println(dameFecha);
  tft.print("de", 40,25);
  tft.print(nombreMes[mes-1], 70,25);
  tft.print("del", 195,25);
  sprintf(dameFecha,"%4d", anio); tft.setCursor(235,25);  tft.println(dameFecha);

  tft.setCursor(10, 60);
  tft.setTextColor(WHITE, BLACK);  tft.setTextSize(4);
  sprintf(dameHora,"%02d:%02d:%02d", hora, dameMinuto, dameSegundo);
  tft.println(dameHora);

  sprintf(dameHora,"%02d:%02d:%02d %02d/%02d/%02d", hora, dameMinuto, dameSegundo, dia, mes, anio);
  Serial.println(dameHora);
}


void enciendeLeds(){
  analogWrite(led[1],0);
  analogWrite(led[2],0); 
  analogWrite(led[3],0);
  analogWrite(led[4],0);


  if (dameMinuto == 8) {
      if (dameSegundo >= 0  && dameSegundo <= 3) {
          contador_dimmer=0;
      }
  }
  if (dameMinuto >= 8 && dameMinuto <38){
      dimmer_mas();
      ledAzul();
      monitor_dimmer();
  }
}

void ledRojo(){
  analogWrite(led[0],contador_dimmer);
}

void ledVerde(){
  analogWrite(led[1],contador_dimmer);   
}

void ledAmarillo(){
  analogWrite(led[2],contador_dimmer);   
}

void ledBlanco(){
  analogWrite(led[3],contador_dimmer);   
}

void ledAzul(){
  analogWrite(led[4],contador_dimmer);
}

void monitor_dimmer(){
  Serial.print("contador_dimmer = ");
  Serial.println(contador_dimmer);
  delay(100);
  Serial.println();
}
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 03, 2019, 11:51 pm
mmm no se muy bien a que te refieres con lo de medir los tiempos... a añadir otra función de millis cuando carga los datos en el tft?

Pies que según creo ya estoy midiendo en millies cada segundo en el reloj y el contador del dimmer cada 21, 17seg
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 04, 2019, 01:07 am
Quiero que midas con millis() las partes que generar duda.
Ejemplo cuando presentas la hora y lo muestras x serial.

Solo quehora por el momento.
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 04, 2019, 02:47 pm
Me dice que tarda en completar esa función 1766.... osea 1.766seg con lo que es imposible que cuente de 1 en 1....

tiene alguna solución?
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 04, 2019, 03:37 pm
Como lo sospeché.. y era algo que no podía probar nadie salvo tu mismo!!.
Buen trabajo por lo que te toca, me refiero a la medición de tiempos.

Veamos como mejorar eso.
Tiene que ser mas dinámica la rutina queHora() la forma de presentar la información.
O bien no presentar tanto en el peor de los casos y solo lo que cambie para hacerlo rápido.

Prueba esta rutina a ver si mejora algo o no es suficiente

Code: [Select]
void queHora(){
  DateTime now = rtc.now(); //obtenemos la hora y fecha actual
  
  dameSegundo   = now.second();
  dameMinuto    = now.minute();
  hora          = now.hour();
  dia           = now.day();
  mes           = now.month();
  anio          = now.year();
  diaDeLaSemana = now.dayOfTheWeek();

  //tft.clrScr(); //borra texto tft
  tft.setCursor(20,20); //Posicion del cursor
  tft.setTextSize(2); //Tamaño de la fuente
  tft.setTextColor(RED, BLACK); //Color de la fuente en rojo


  /*las posiciones son ancho y alto, por ese orden*/
  sprintf(dameFecha,"%s %02d de %s del %4d", nombreDia[diaDeLaSemana], dia, nombreMes[mes-1], anio);
  tft.println(dameFecha);

  tft.setCursor(10, 60);
  tft.setTextColor(WHITE, BLACK);  
  tft.setTextSize(4);
  sprintf(dameHora,"%02d:%02d:%02d", hora, dameMinuto, dameSegundo);
  tft.println(dameHora);

  sprintf(dameHora,"%02d:%02d:%02d %02d/%02d/%02d", hora, dameMinuto, dameSegundo, dia, mes, anio);
  Serial.println(dameHora);
}



Si esto no es suficiente, entonces el TFT es lento y haremos algo mas simple. Actualizar la hora, y cuando cambie el dia, actualizamos dia y asi. Nada que provoque un dolor de cabeza.

Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 04, 2019, 04:16 pm
Pues asi va mas lento... me da ahora 1,861seg...
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 04, 2019, 08:22 pm
He separado la hora por fecha, hora, minutos y segundos... y se ha reducido a 1,048sg se ve que la pantalla es mas lenta que el caballo del malo, por que solo muestra los segundos y da retardo igualmente!
Solo baja a 1,001sg si se queda en blanco... alguna idea mas? o ves si hay algo que se pueda reducir?


Code: [Select]
#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

const int led[5] = {10,45,13,46,44}; //pines led, Deben ser PWM


volatile unsigned long contador_dimmer = 0; // La definimos como volatile
int i,j; //Variables auxiliares para ciclos repetitivos
unsigned long F ;
unsigned long H ;
unsigned long M ;
unsigned long S ;
unsigned long D ;

//Declaramos variables monitor TFT---------------------------------------

char nombreDia[7][12] = {"Domingo__", "Lunes____", "Martes___", "Miercoles", "Jueves___", "Viernes__", "Sabado___"};
char nombreMes[12][12]= {"Enero_____", "Febrero___", "Marzo_____", "Abril_____", "Mayo______",  "Junio_____", "Julio_____","Agosto____","Septiembre","Octubre___","Noviembre_","Diciembre_"};
int Segundo,Minuto,hora,dia,mes,diaDeLaSemana;
long anio;

char dameFecha[50];
char Vhora[2];
char Vminuto[2];
char Vsegundo[2];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

DateTime HoraFecha;

void setup () {
  Serial.begin(9600);

  for(i=0; i<4; i++){ //salidas pines led
    pinMode(led[i], OUTPUT);
  }
 
   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------
  tft.reset();
  uint16_t identifier = tft.readID();
  if (identifier == 0xEFEF) identifier = 0x9486;
  tft.begin(identifier);
  tft.InitLCD();
  tft.fillScreen(BLACK); //Rellenamos la pantalla de color negro*/
 
}

// hay que descomentar la linea de debajo y compilar solo una vez para actualizar hora
// rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));


//--- Contador creado por cada interrupcion---//
void dimmer_mas(){
  if(contador_dimmer==255UL){
    contador_dimmer=0UL;
  }else{
   contador_dimmer++; // Contador veces interrupcion
  }
}
void dimmer_menos(){
  if(contador_dimmer==0UL){
    contador_dimmer=255UL;
  }else{
   contador_dimmer--; // Contador veces interrupcion
  }
}
 
void loop () {
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
 
  if (millis() - F> 1440000UL) {   //mostrará cada 24 horas               
      F = millis();
      queFecha();
  }
  if (millis() - H> 3600000UL) {   //mostrará la hora cada 1 hora
      queHora();                 
      H = millis();
  }
  if (millis() - M> 60000UL) {   //mostrará la hora cada 1 minuto
      queMinuto();                 
      M = millis();
  }
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
      queSegundo();                 
      S = millis();
      Serial.println(S);
  }

  if (millis() - D> 21176UL) {  //se ejecuta 2.8 veces por cada minuto para hacer 85 pasos en 30m, cada 21,176s
     enciendeLeds();
     D = millis();
  }
  //delay(100);
}


void queFecha(){
  dia = HoraFecha.day();
  mes = HoraFecha.month();
  anio = HoraFecha.year();
  diaDeLaSemana = HoraFecha.dayOfTheWeek();

  tft.setCursor(20,20); //Posicion del cursor
  tft.setTextSize(2); //Tamaño de la fuente
  tft.setTextColor(RED, BLACK); //Color de la fuente en rojo
 
  /*las posiciones son ancho y alto, por ese orden*/
  tft.print(nombreDia[diaDeLaSemana], 10,5);
  sprintf(dameFecha,"%02d", dia); tft.setCursor(10, 25);  tft.println(dameFecha);
  tft.print("de", 40,25);
  tft.print(nombreMes[mes-1], 70,25);
  tft.print("del", 195,25);
  sprintf(dameFecha,"%4d", anio); tft.setCursor(235,25);  tft.println(dameFecha);
}

void queHora(){
  hora = HoraFecha.hour();

  sprintf(Vhora,"%02d", hora);
  tft.setCursor(10, 60);
  tft.setTextColor(WHITE, BLACK);  tft.setTextSize(4);
  tft.println(Vhora);
}

void queMinuto(){
  Minuto = HoraFecha.minute();

  sprintf(Vminuto,":%02d:", Minuto);
  tft.setCursor(65, 60);
  tft.setTextColor(WHITE, BLACK);  tft.setTextSize(4);
  tft.println(Vminuto);
}

void queSegundo(){
  Segundo = HoraFecha.second();

  sprintf(Vsegundo,"%02d", Segundo);
  tft.setCursor(160, 60);
  tft.setTextColor(WHITE, BLACK);  tft.setTextSize(4);
  tft.println(Vsegundo);
}


void enciendeLeds(){
  analogWrite(led[1],0);
  analogWrite(led[2],0); 
  analogWrite(led[3],0);
  analogWrite(led[4],0);


/*if(dameMinuto == 8){if(dameSegundo >= 0  && dameSegundo <= 3){contador_dimmer=0;}}
if(dameMinuto >= 8 && dameMinuto <38){
    dimmer_mas();
    ledAzul();
    monitor_dimmer();
}*/

}



void ledRojo(){
  analogWrite(led[0],contador_dimmer);
}
void ledVerde(){
  analogWrite(led[1],contador_dimmer);   
}
void ledAmarillo(){
  analogWrite(led[2],contador_dimmer);   
}
void ledBlanco(){
  analogWrite(led[3],contador_dimmer);   
}
void ledAzul(){
  analogWrite(led[4],contador_dimmer);
}

void monitor_dimmer(){
  Serial.print("contador_dimmer = ");
  Serial.println(contador_dimmer);
  delay(100);
  Serial.println();
}
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 04, 2019, 11:29 pm
Cambia de placa TFT o ve que elemento es el que demora tanto.. cambiar tamaño de la fuente, cambiar color.. etc.

Esta librería nunca la he visto

Code: [Select]
#include <UTFTGLUE.h>             //tft

Seguro que no funciona con otra librería?

Bueno revisé para atras y encontré que has puesto la librería completa con ejemplos.

Prueba medir lo mismo en los ejemplos disponibles a ver con que te encuentras. Si es un problema de seteo o resulta que tu TFT es lento.
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 06, 2019, 02:44 pm

La pantalla que tengo es una mcufriend iD=0x9797 creo que también trabaja con 0x9486, he vuelto a revisar las librerías, con la que mejor trabaja funcionando los ejemplos es UTFTGLUE.h, he probado con la MCUFRIEND_kbv.h que también trae el paquete que os puse y da el mismo resultado, con el resto de librerías parece que no funciona.


He estado haciendo pruebas con poco o nada de resultado.. quitando el tamaño y color el el tiempo se reduce a 0.005sg, con las propiedades activas, tarda en pintar un numero 0.048sg.

También he probado con los ejemplos y en pinar una linea de texto tarda 0.012sg

con los ejemplos para que me ponga hola mundo tarda 0.069sg...

Hay una cosa que no entiendo, en el momento en que pinta algo siempre va a tener un retardo que se va a añadir a al segundo que le estamos dando en el loop para temporizar, con lo que haga lo que haga siempre va añadir x tiempo a ese segundo no?, si es así no es un problema de retardo de la pantalla sino que estamos sumando mas tiempo al calculo y siempre añadirá un retardo, osea el segundero siempre seguiría fallando cada x segundos
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 06, 2019, 04:01 pm
ERROR!! Tienes un RTC que no esta influenciado por nada.
Tienes un millis() que tampoco esta influenciado por nada.
Los retardos son nuestra responsabilidad al crear nuestro código y punto.

Quote
He estado haciendo pruebas con poco o nada de resultado.. quitando el tamaño y color el el tiempo se reduce a 0.005sg, con las propiedades activas, tarda en pintar un numero 0.048sg.
Bien has visto quien es responsable de los tiempos mas largos asi que empecemos por evitarlos y luego de a poco ver si pueden ser introducidos sin alterar la presentación. Ya veremos cómo o si vale la pena!!

Comenta todos los cambios de tamaño y color y veamos que tenemos.
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 06, 2019, 08:14 pm
los tiempos son:

con color y tamaño: 0.048

sin color: 0.017
sin tamaño:0.010

sin color y sin tamaño: entre 0.006 y 0.004
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 06, 2019, 08:23 pm
 A ver si te comprendo
con color y tamaño gueHora() que antes tardaba 1800 mseg ahora 48 mseg? o hablas de otro ejemplo?

Has esas pruebas con queHora() y queFecha() no nos olvidemos que tienes dos.
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 06, 2019, 08:33 pm
Bueno los tiempos de queSegundo() son :

con color y tamaño: 10048

sin color: 10017
sin tamaño:10010

sin color y sin tamaño: entre 10006 y 10004

Lo había puesto abreviado
Code: [Select]

void queSegundo(){
  Segundo = HoraFecha.second();

  sprintf(Vsegundo,"%02d", Segundo);
  tft.setCursor(155, 60);
  tft.setTextColor(WHITE, BLACK);
  tft.setTextSize(4);
  tft.println(Vsegundo);
}
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 06, 2019, 09:48 pm
Como van a ser 10048 debe ser seran 1048 mseg o no?
Lo primero son 10.048 segundos y lo segundo 1.048 segundos.

Si esto

Code: [Select]
void queSegundo(){
  Segundo = HoraFecha.second();

  sprintf(Vsegundo,"%02d", Segundo);
  tft.println(Vsegundo);
}


demora 1004 mseg


Mira este hilo (https://forum.arduino.cc/index.php?topic=351058.15) reportando en 2015 los problemas de lentitud de este TFT.
Parece ser que el problema es el manejo de pines.

Acá otro hilo interesante Link (https://alselectro.wordpress.com/2014/11/28/touch-screen-tft-shield-for-arduino-uno/)


Cambia de TFT
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 06, 2019, 09:54 pm
Tienes razón 1048 he puesto un 0 de mas...

Pues menuda castaña si no vale el tft... en cuanto se supone que debería cargar?

cual me recomiendas?
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 06, 2019, 11:14 pm
He puesto ya por curiosidad las librerías del enlace que me has indicado, y la pantalla se queda en negro o blanco, lo que si he conseguido es que me carga estos valores de lectura  en el monitor, aunque la pantalla estaba en negro.

TFT LCD test
LCD driver chip: 0
Benchmark                Time (microseconds)
Screen fill                    1379324
Text                              189572
Lines                           1066340
Horiz/Vert Lines             144860
Rectangles (outline)       104680
Rectangles (filled)        3267948
Circles (filled)              1227028
Circles (outline)             446792
Triangles (outline)          338316
Triangles (filled)           1728440
Rounded rects (outline)  212860
Rounded rects (filled)   3798436
Done!
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 06, 2019, 11:38 pm
@Perdido, si hablas de un programa menciona cual es el sketch y en que contexto ocurre todo.

Cuando dices Texto insume 189572 useg, cuanto texto? Cual es la rutina, tiene cambio de color, no lo tiene.. son condiciones que no se como comparar con el anterior.

Claro que debe aportar pero no veo la referencia en este momento.

Ayúdanos por favor!!
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 07, 2019, 12:37 am
jeje ese es el problema que no lo se el contexto exactamente :smiley-eek:

he ejecutado la librería\ejemplo: SWTFT-Shield\examples\graphicstest (me he olvidado de ponerlo antes)

El ejemplo funciona parcialmente solo muestra los datos que os he puesto en el monitor de programación, la pantalla tft se queda en blanco. Si la conoces igual podria valer para comparar con respecto a alguna que tengas por ahí... sino supongo que no valdrá para mucho por lo que comentas.

TFT LCD test
LCD driver chip: 0
Benchmark                Time (microseconds)
Screen fill              1379324
Text                     189572
Lines                    1066340
Horiz/Vert Lines         144860
Rectangles (outline)     104680
Rectangles (filled)      3267948
Circles (filled)         1227028
Circles (outline)        446792
Triangles (outline)      338316
Triangles (filled)       1728440
Rounded rects (outline)  212860
Rounded rects (filled)   3798436
Done!


La única librería que he conseguido que funcione mas o menos es la MCUFRIEND_kbv modificada, ni siquiera funciona la ultima versión oficial... solo ha funcionado la que os puse creo que en el #45

Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 07, 2019, 04:46 am
No puedo ubicar el ejemplo dentro del .zip
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 07, 2019, 12:02 pm
Parece que no me he explicado bien, son dos librerías diferentes!

La del test que funciona a medias, esta sacada del link (https://alselectro.wordpress.com/2014/11/28/touch-screen-tft-shield-for-arduino-uno/) que has puesto antes y pertenece a la librería SWTFT-Shield que viene en ese paquete. Por desgracia solo funciona parcialmente, en la pantalla no muestra nada.

Por otro lado tengo puesta la que si que funciona, la MCUFRIEND_kbv modificada pero es la que da retardos. Por lo que he visto en comentarios es mas lenta en MEGA que en UNO
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 07, 2019, 01:48 pm
Yo solo quería ver que se habia mostrado en la pantalla con el testText y creo que fue esto

Code: [Select]
unsigned long testText() {
  tft.fillScreen(BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;
}


Si es así y esto toma 189572 useg = 189.5 mseg entonces tenemos un ganador.
Hace lo que quieres a esa velocidad.

Crea un nuevo sketch modificando este. Quitando todo lo demás y que quede el texto, elimina lo que no sirve y agrega el soporte RTC para leer la hora.
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 07, 2019, 04:03 pm
No se si entiendo a lo que te refieres, he creado este código:

Code: [Select]
#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

unsigned long S ;

//Declaramos variables monitor TFT---------------------------------------
int Segundo,Minuto,hora,dia,mes,diaDeLaSemana;
char Vsegundo[2];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GRAY    0x8410

uint16_t version = MCUFRIEND_KBV_H_;

DateTime HoraFecha;

void setup () {
  Serial.begin(9600);

   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------
    uint16_t ID = tft.readID(); //
    tft.begin(ID);
    tft.setRotation(1); //pantalla horizontal
    tft.fillScreen(0x0000); //Rellenamos la pantalla de color negro
}

 
void loop () {
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
 
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
    queSegundo(); 
    testText();
                     
      S = millis();
      Serial.println(S);
  }
}

void queSegundo(){
  Segundo = HoraFecha.second();
}

unsigned long testText() {
  sprintf(Vsegundo,"%02d", Segundo);
  tft.setCursor(155, 60);
  tft.setTextColor(WHITE, BLACK);
  tft.setTextSize(4);
  tft.println(Vsegundo);
 
 /* tft.fillScreen(BLACK);
  unsigned long start = micros();
  tft.setCursor(0, 0);
  tft.setTextColor(WHITE);  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(YELLOW); tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextColor(RED);    tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
  tft.println();
  tft.setTextColor(GREEN);
  tft.setTextSize(5);
  tft.println("Groop");
  tft.setTextSize(2);
  tft.println("I implore thee,");
  tft.setTextSize(1);
  tft.println("my foonting turlingdromes.");
  tft.println("And hooptiously drangle me");
  tft.println("with crinkly bindlewurdles,");
  tft.println("Or I will rend thee");
  tft.println("in the gobberwarts");
  tft.println("with my blurglecruncheon,");
  tft.println("see if I don't!");
  return micros() - start;*/
}


Si pongo el ejemplo que has puesto antes me da de resultado que tarda S=1876
Si pongo el segundero mas el código que has puesto (este código sin comentarios) S=1922
Si pongo solo el segundero S=1047

En los tres casos dura mas de 1 seg, así que no se....
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 07, 2019, 07:09 pm
No es posible.
dijiste que te llevaba 189.5 mseg como ahora te toma 1 segundo.

Como calculas el tiempo transcurrido?
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 07, 2019, 09:15 pm
Por un lado tenemos el testText que es el que ha dado esos 189.5 mseg...

Y aquí debe de venir mi confusión, seguramente no lo estoy calculando bien o me estoy liando con las unidades o no se... pero cuando lo pongo ahí, si resto los tiempos que me va dando, por ejemplo entre el segundo valor y el tercero me da que tarda los tiempos que he indicado antes

Code: [Select]
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
    queSegundo(); 
    testText();
                     
      S = millis();
      Serial.println(S);
  }


Si pongo el ejemplo que has puesto antes me da de resultado que tarda S=1876
Si pongo el segundero mas el código que has puesto (este código sin comentarios) S=1922
Si pongo solo el segundero S=1047

Lo curioso es que antes hice una prueba sacando del if la función testText(); como resultado da un error, tiempo 00 y entre medias de forma muy rápida e intermitente si que pinta el segundero de forma correcta.... con lo que creo que no es un problema de velocidad del tft sino de programación, vamos que algo no estoy haciendo bien.

(Antes de que me caiga la bronca... si vale de algo decir que no soy programador ;))
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 08, 2019, 12:01 am
Asi estas midiendo mal
Como vas a medir el tiempo Absoulto.

Code: [Select]
S = millis();
 Serial.println(S);


Lees S y lo imprimes eso no dice que tarde 1876 mseg o mayor.


A ver.. voy a revistar el código. Y luego lo posteo aca. Asi que revista esta respueta que editaré luego.


Code: [Select]
void loop () {
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
 
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
      unsigned long start = micros();
      testText();
      Serial.println(micros() - start);
      S = millis();
  }
}


Asi debe ser!
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 08, 2019, 01:03 pm
oks muchas gracias!

Los resultados son estos:

Solo con el ejemplo del texto alterna estos tres valores:874964, 874960, 874968

Solo con el segundero quitando el texto ejemplo testText va dando valores desde 46108 46112, 46128,46124, creo que llega a 46136... veo que se salta un segundo de vez en cuando

Si pongo los segundos y el ejemplo de texto se mueve en estos rangos: 921068, 921080, 92088, 92092
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 08, 2019, 02:52 pm
Coloca los segundos y quita el testText que no tiene sentido.
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 08, 2019, 03:38 pm
asi dices?

Code: [Select]
#include <Wire.h>
#include "RTClib.h"
#include <UTFTGLUE.h>             //tft
UTFTGLUE tft(0,A2,A1,A3,A4,A0);   //tft

RTC_DS3231 rtc; // Declaramos un RTC DS3231

unsigned long S ;

//Declaramos variables monitor TFT---------------------------------------
int Segundo;
char Vsegundo[2];

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define GRAY    0x8410

uint16_t version = MCUFRIEND_KBV_H_;

DateTime HoraFecha;

void setup () {
  Serial.begin(9600);

   // Comprobamos si tenemos el RTC conectado
  if (! rtc.begin()) {
   Serial.println("No hay un módulo RTC");
   while (1);
  }

  //definimos propiedades monitor tft------------------------------------------------
    uint16_t ID = tft.readID(); //
    tft.begin(ID);
    tft.setRotation(1); //pantalla horizontal
    tft.fillScreen(0x0000); //Rellenamos la pantalla de color negro
}

void loop () {
  DateTime now = rtc.now();
  HoraFecha = rtc.now(); //obtenemos la hora y fecha actual
 
  if (millis() - S> 1000UL) {   //mostrará la hora cada 1 segundo o 1000 mseg
    unsigned long start = micros();
    queSegundo();                 
      S = millis();
      Serial.println(micros() - start);
  }
}

unsigned long queSegundo() {
  Segundo = HoraFecha.second();
  sprintf(Vsegundo,"%02d", Segundo);
  tft.setCursor(155, 60);
  tft.setTextColor(WHITE, BLACK);
  tft.setTextSize(4);
  tft.println(Vsegundo);
}


De esta forma es lo que comentaba, salta un segundo cada 10 o 20, las lecturas que da son de 46108 a 46136
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 08, 2019, 03:55 pm
Ok. Vamos a organizarnos.

Olvidemos esto por ahora.

Que deberías presentar en el TFT?

la hora, fecha, qué mas?

Necesito que trabajemos en algo mas concreto y definitivo porque será febrero y seguiremos con esto a este ritmo.

Y como te dije.. los temas cuando se alargan dejan de interesarme.
Asi que hay que concretar.

Haz una lista de lo que tienes que presentar en la pantalla y con que tamaño y color.

Entonces veremos cómo hacerlo TODO dentro de los márgenes disponibles.
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 08, 2019, 04:17 pm
OKs, la idea es que en la pantalla muestre la hora, minuto, segundo, día, mes, año y día de la semana.

Ademas debe mostrar las temperaturas de los 7 sensores... bueno realmente lo hace, pero con los problemas que ya comente

Ahí pongo el código completo que tengo por el momento


Al final si que se esta alargando la cosa!, muchas gracias por la ayuda y paciencia
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 19, 2019, 11:36 pm
Por Fin!!! hoy he tenido la tarde inspirada y ya he conseguido que funcione todo!!!  ;D

Una pregunta.... hay alguna forma de hacer que guarde variables en la memoria?

Ahora mismo si hay un corte de luz, las luces se vuelven un poco locas hasta que van pasando las horas y se van asignando los valores como corresponde.

Bueno ahí pongo el código completo y funcionado!
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 20, 2019, 04:43 am
Lo guardas en la EEPROM pero debes asegurarte de usarlo una vez no dentro de un loop porque la cantidad de usos de la EEPROM esta limitada. Cuantas veces? 100.000. Son muchas? parecen muchas pero si un loop x error graba sin control las 100.000 se agotarán enseguida.
Title: Re: Control de luces de Acuario
Post by: Tortugaz on Jan 20, 2019, 03:46 pm
Hola!me alegro de que finalmente lo hayais conseguido. yo tengo una duda al respecto para un proyecto parecido.
que modelo de mosfet utilizariais para el mismo proyecto pero alimentado con una fuente de 12v y 8.5A ?

muchas gracias de antemano.
Title: Re: Control de luces de Acuario
Post by: surbyte on Jan 20, 2019, 06:53 pm
Puedes usar un MOSFET IRL520 en adelante.
El IRL520 permite hasta 9.2A a 25 Celsius
El IRL530 permite hasta 15 A que me parece el mas apropiado.

@Tortugaz, para la próxima recuerda hacer tus preguntas en tu propio hilo (Sección Hardware) sin desviar la idea de ESTE hilo.
Como no lo haces del todo te he respondido pero acá termina la consulta.
Si te interesa seguir, crea un un hilo propio.
Title: Re: Control de luces de Acuario
Post by: Tortugaz on Jan 20, 2019, 07:19 pm
Mil gracias @surbyte
Title: Re: Control de luces de Acuario
Post by: Perdido on Jan 29, 2019, 08:08 pm
Aunque ya parecía que estaba todo funcionando he ido mejorando el programa, pero me quedaba un cabo suelto, los ventiladores:

Unas veces se encendían los 4, otras 3 y otras 2... pensaba que era por que habría alguna soldadura mal puesta, las repase.... y seguían fallando igual.

Así que dándole vueltas empece a tomar lecturas del voltaje que llega a los ventiladores y me he dado cuenta que de la salida del transistor 2N2222 solo esta entregando por el emisor 3,9V como mucho, con lo que no es suficiente para poder moverlos

Se supone que esos transistores pueden trabajar con 12V no?, al final puse unos ventiladores de 12V.... pero vamos que no les llegan ni los 5V que deberían llegarles, he probado aponer el step donw a 7V y el transistor sigue dando 3,9V

Según el Datasheet entiendo que estos transistores deberían funcionar sin problemas... que puede estar pasando? puede ser por haber unido los GRN? (los he separado y creo que pasa igual)

Tendría que poner otros transistores que aguanten mas V?, cual iría mejor?

Ahí pongo el gráfico y el programa mejorado tal y como lo tengo en estos momentos:

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=292382)
Title: Re: Control de luces de Acuario
Post by: Gefre on Mar 11, 2019, 10:11 am
Wow, de no saber nada, sobre arduino, y sus diferentes aplicaciones mi interés de automatizar mi acuario subido mas.

Espero que logres detectar el fallo, ya sean los transistores 2n2222 u otra complicacion.

Felicidades por tu perseverancia en el proyecto, seguiré estudiando analizando cada línea del sketch para aprender. 
Title: Re: Control de luces de Acuario
Post by: Perdido on Mar 17, 2019, 02:51 pm
Gracias!

Si, resolví el problema, al final puse un TIP120, y modifique un poco las uniones de los GRN ya funciona perfecto el circuito. Adjunto el esquema definitivo. La pantalla la tengo funcionando desde enero y va perfecta por el momento.

(https://forum.arduino.cc/index.php?action=dlattach;topic=532893.0;attach=299689)

También pongo el código con algunas mejoras que hice, aunque tengo pendiente revisar el tiempo exacto de los millies del contador del dimmer, hay un pequeño desfase que aun no he podido revisar.

Title: Re: Control de luces de Acuario
Post by: surbyte on Mar 17, 2019, 03:29 pm
Felicitaciones @Perdido.