TvOut y mandos a distancia

Tengo la intención de utilizar arduino para hacer un aparato que muestre datos en la tele. Y quiero poder cambiar que datos mostrar con un mando a distancia.
Tengo por una parte el codigo y el circuito para mostrar los datos por la tele. Y por otra parte tengo el codigo para recibir los comandos del mando a distancia.

Pero tengo un problema: juntar ambos codigos.

Cada 1s se toman los datos y se muestran. Eso hace que este "congelado" durante un segundo. Y el comando puede llegar en cualquier momento.
¿Alguno se os ocurre alguna manera de hacerlo con un solo arduino? Y aunque se usara un arduino para el mando al enviar "tienes que mostrar la pantalla 2" vuelve a pasar el mismo problema.

Yo para que espere un segundo uso "TV.delay(1000);" A lo mejor ahí esta el problema. ¿Pero entonces como hago para que cuando pase un segundo muestre los nuevos valores?

has probado millis() ? =>http://arduino.cc/en/Tutorial/BlinkWithoutDelay

La función delay de la librería deja parado el programa (copio la función):
void TVout::delay(unsigned int x) {
unsigned long time = millis() + x;
while(millis() < time);
}

Se queda esperando sin hacer nada, a que pase el tiempo que le has enviado a la función. Mira el ejemplo que te he puesto de blink sin delay.

Saludos

Igor R.

No he entendido del todo pero si lo que quieres es no tener que estar esperando, lo suyo sería usar interrupciones. De esta manera cuando ocurra la interrupción (la llegada de los comandos) se para la ejecución normal del codigo y salta a la función de lectura del código. Eso sería lo idea pero lo que te comenta Igor R. es la manera más secilla la otra sería más optima y más trabajosa.

A ionhs le han gustado las interrupciones!! Con la fuente de problemas que son!! je,je,je

Ahora en serio, la librería TVout usa un timer para ir generando la señal, así que no puedes pedirle mucho al Arduino, ya que va muy sobrecargado y hay que asegurarse que se cumplen los tiempos para generar el video. Es decir, la prioridad número uno es generar dichas señales de video.

Con millis() deberías hacerlo funcionar bien. Si te fijas, no puedes ni usar Serial de Arduino. Tienes que usar el suyo propio que es por software.

Saludos

Igor R.

jeje no las uso mucho pero sobre la teoría son útiles. Luego la práctica es otra cosa, menos mal que Igor esta muy puesto y nos saca de dudas :wink:

He estado probando millis() y parece que es una forma buena de solucionar el problema. Pero me he encontrado con que en cuanto añado el "TV.begin(..." deja de funcionar el codigo.
No se si es que la parte de IR se desactiva o no pueden funcionar a la vez.

Cuando se cuelgan los programas muchas veces es porque el proyecto necesita más de los 400mA que puede dar la placa arduino. No se si es tu caso, en ese caso tendría que alimentar parte del proyecto con una fuente de alimentación y no desde arduino.

XD vale, me he explicado mal. El codigo funciona, pero no detecta nada. Y creo que el problema es otro... las interrupciones:

"The IRrecv library consists of two parts. An interrupt routine is called every 50 microseconds, measures the length of the marks and spaces, and saves the durations in a buffer. The user calls a decoding routine to decode the buffered measurements into the code value that was sent (typically 11 to 32 bits)."

Asi que la unica solución seria rehacer la librería para no usar interrupciones... pufff

je,je,je

Mira a ver si puedes meter dentro de las rutinas que generan el video lo del mando... pero tendrían que ser muy rápidas para no afectar la generación del video....

Como dice igor las rutinas que uses para el control remoto deben de ser muy rapidas. También puedes usar un generador OSD como el max7456, hay muchos proyectos que lo usan

Por ahora he dejado el proyecto porque me faltan algunas cosas, algunos sensores y cosas asi.