?>/script>'; } ?> Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C. Widgets Magazine

Autor Tema: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.  (Leído 68787 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #60 en: 26-09-2017, 16:15 (Martes) »
raphik, gracias por aclarar lo que hace el código. Seguro que puede despejar más de una duda.

Con respecto a lo que le pasa a peperfus, si sin inicializar el LCD, el texto sale con contraste, y después de inicializar, no tiene contraste, yo apostaría a que algo hay en la inicialización, que trastoca al LCD.

raphik

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #61 en: 26-09-2017, 20:35 (Martes) »
raphik, gracias por aclarar lo que hace el código. Seguro que puede despejar más de una duda.
Iré introduciendo comentarios explicativos en el script del primer post. Incluso para mí es duro entenderlo después de más de un año de haberlo escrito.

Con respecto a lo que le pasa a peperfus, si sin inicializar el LCD, el texto sale con contraste, y después de inicializar, no tiene contraste, yo apostaría a que algo hay en la inicialización, que trastoca al LCD.
Es posible, pero te aseguro que no trastoca para nada mi LCD.

El script consta de dos partes bien diferenciadas. Primero se definen unas cuantas funciones y más abajo está el cuerpo del script propiamente dicho, entre las etiquetas #SCRIPT:

Código: [Seleccionar]
# SCRIPT
# Si la llamada al script no contiene parámetros, se visualiza su sintaxis
if [ "$#" -eq 0 ]; then
  printf "\n  lcd_write ver. 1.01 2016 :p raphik\n"
  printf "Sintaxis 1: lcd_write <init>\n"
  printf "Sintaxis 2: lcd_write <fila> <columna> <texto>\n\n"
  return
fi
# Variables globales. La única que hay que cambiar es ADDRESS, en la que se pone la dirección
# hexadecimal del módulo LCD. Lo demás se deja como está.
  BUS=0
  ADDRESS=0x3F
  INST_SET=0x0C
  INST_SEND=0x08
  CHAR_SET=0x0D
  CHAR_SEND=0x09
# Si la llamada al script contiene como primer parámetro la cadena "init", se ejecuta la función
# func_init, que pone al módulo en modo 4-bits, elimina el cursor y borra la pantalla.
if [ $1 == "init" ]; then
  func_init
  return
fi
# Para escribir texto en el LCD, se invoca el script pasándole tres parámetros: fila, columna y texto.
func_row_col $1 $2
func_print_string "$3"
return
# SCRIPT

Las funciones son más fastidiosas de entender, porque trabajan ajustadas a como lo hace el hardware.
« Última modificación: 26-09-2017, 20:53 (Martes) por raphik »

peperfus

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #62 en: 26-09-2017, 22:49 (Martes) »
Mil Gracias, raphik por tus aclaraciones.

La regla de oro de cualquier programador: Documentar, documentar, documentar.

Una cosa que he observado.... tu pantalla dices que sólo tiene 4 bit soldados a la placa expansorat?.
Buscando el chip de la mía: PCF8457T, me pone por ahí 8 bits.... y yo veo que parece ser... que están todos los pines soldados. ¿No es así en la tuya?

http://pdf1.alldatasheet.com/datasheet-pdf/view/18215/PHILIPS/PCF8574T.html

« Última modificación: 26-09-2017, 22:59 (Martes) por peperfus »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #63 en: 26-09-2017, 23:10 (Martes) »
Mil Gracias, raphik por tus aclaraciones.

La regla de oro de cualquier programador: Documentar, documentar, documentar.

Una cosa que he observado.... tu pantalla dices que sólo tiene 4 bit soldados a la placa expansorat?.
Buscando el chip de la mía: PCF8457T, me pone por ahí 8 bits.... y yo veo que parece ser... que están todos los pines soldados. ¿No es así en la tuya?

http://pdf1.alldatasheet.com/datasheet-pdf/view/18215/PHILIPS/PCF8574T.html



Se refiere al bus de datos del LCD. Los otros 4 bits del pcf, deben estar cableados a las líneas de control del lcd (las que le dicen si vamos a leer, escribir, etc, etc...)

raphik

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #64 en: 27-09-2017, 09:46 (Miércoles) »
Una cosa que he observado.... tu pantalla dices que sólo tiene 4 bit soldados a la placa expansora?
Buscando el chip de la mía: PCF8457T, me pone por ahí 8 bits.... y yo veo que parece ser... que están todos los pines soldados. ¿No es así en la tuya?

Como bien dice Tki2000, una cosa es que la placa expansora trabaje a 8 bits (en realidad 7) y otra que el LCD trabaje en modo 4-bits.

Fíjate bien en la imagen

Las soldaduras que se ven arriba son del LCD. Van de la 1 a la 16 y están rotuladas RS, RW, E... Los puntos RS, RW, E, D4, D5, D6, D7 y ninguno más están conectados respectivamente a los puntos P0, P1, P2, P4, P5, P6 y P7 de la expansora. Ojo, el punto P3 de la expansora TAMPOCO está conectado. ¡De los 8 bits de la expansora, sólo se aprovechan 7!

En definitiva, los puntos D0, D1, D2 y D3 del LCD no están conectados, por lo que no queda otra que hacerlo funcionar en modo 4-bits.

raphik

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #65 en: 28-09-2017, 21:26 (Jueves) »
Tanto va el cántaro a la fuente...

Desde ayer, mi LCD ha estado mostrando caracteres extraños. Pensando que era debido a un mal contacto en los puntos de soldadura, decidí repasarlas. No es la primera vez que les doy un repaso, pero sí la última. Éste es el aspecto que tiene actualmente la zona R107-R109 de mi router.

De tanto soldar y resoldar se ha desprendido la pista de cobre en el punto R109.

En otras ocasiones se me ha soltado algún cable, pero "limpiamente". Es decir, el cable ha quedado visiblemente separado del punto de soldadura, totalmente desconectado. Pero esta vez ha sido distinto. Los cables estaban aparentemente bien conectados, pero está claro que la soldadura no estaba bien, porque el comando i2cdetect respondía aleatoriamente. Unas veces daba respuesta y otras no. La conclusión parece lógica: la calidad del contacto importa. Por lo que parece, un contacto defectuoso podría meter ruido en el bus i2c.

Conclusiones:
1. No es una buena idea soldar cables directamente a la placa.
2. Las soldaduras no deben quedar expuestas a tirones que puedan debilitarlas.

peperfus

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #66 en: 28-09-2017, 22:22 (Jueves) »
Yo este finde tengo planeado soldar cables.

La estrategia que voy a seguir es la que me comentó alguien hace unas semanas....

Primero estañar los puntos gpios, luego estañar los cables y finalmente, juntarlos y darles un toque con el soldador para que queden unidos.

Me he comprado bastante material y haré algo de práctica con una placa vieja antes. Tengo hasta gafas-lupa con led que van de maravilla. A ver si puedo hacer unas fotos.

Creo que es una buena idea, después de soldar los cables, pegarlos con silicona caliente a la placa. De esa manera, cualquier tirón se lo lleva antes la silicona y protege la soldadura.

Ficht

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #67 en: 28-09-2017, 23:37 (Jueves) »
Yo este finde tengo planeado soldar cables.

La estrategia que voy a seguir es la que me comentó alguien hace unas semanas....

Primero estañar los puntos gpios, luego estañar los cables y finalmente, juntarlos y darles un toque con el soldador para que queden unidos.

Me he comprado bastante material y haré algo de práctica con una placa vieja antes. Tengo hasta gafas-lupa con led que van de maravilla. A ver si puedo hacer unas fotos.

Creo que es una buena idea, después de soldar los cables, pegarlos con silicona caliente a la placa. De esa manera, cualquier tirón se lo lleva antes la silicona y protege la soldadura.

Hola:
Esta es una buena solución, yo estoy usando aquí un viejo cable IDE de HD, porque hay muchos GPIO en este router, pero se puede usar otro conector similar mas pequeño, así se puede probar y cambiar de proyecto con facilidad, en la parte de arriba he pegado una etiqueta identificadora de cada ping, GPIO's, voltajes de alimentación, masa, puerto serie, etc.





Vaya mala suerte @raphk con su placa  :'(
« Última modificación: 29-09-2017, 08:25 (Viernes) por Ficht »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #68 en: 29-09-2017, 20:46 (Viernes) »
Si pretendéis soldar y desoldar mucho, y con puntos muy pequeños, lo mejor es invertir en estaño en pasta y una pistola de aire caliente. No tiene nada que ver con soldar con soldador.
Y he dicho invertir, no gastar, porque a la larga conviene para no estar estropeando cosas.

O si seguís empecinados en la agujita, un buen flux también facilita mucho las cosas, ya que hace que la temperatura para derretir el estaño baje mucho, y no se dañen tanto las pistas. Lo peor de las soldaduras en placas de ahora, es que están hechas con estaño sin plomo, y hay que subir mucho más la temperatura.

peperfus

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #69 en: 29-09-2017, 21:10 (Viernes) »
Citar
Si pretendéis soldar y desoldar mucho, y con puntos muy pequeños, lo mejor es invertir en estaño en pasta y una pistola de aire caliente. No tiene nada que ver con soldar con soldador.
Y he dicho invertir, no gastar, porque a la larga conviene para no estar estropeando cosas.

O si seguís empecinados en la agujita, un buen flux también facilita mucho las cosas, ya que hace que la temperatura para derretir el estaño baje mucho, y no se dañen tanto las pistas. Lo peor de las soldaduras en placas de ahora, es que están hechas con estaño sin plomo, y hay que subir mucho más la temperatura.

Gracias por la idea. Es una buena sugerencia. Como ya tengo comprado el material de soldadura, mañana lo intentaré, a ver qué consigo. Si no me va bien, probaré el método que comentas de estaño en pasta y pistola de aire caliente. Tiene muy buena pinta.

peperfus

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #70 en: 30-09-2017, 13:30 (Sábado) »
Señores, he soldado cables esta mañana y esto huele A PREMIO GORDO.

Nada más conectar la pantalla, se han encendido los cuadrados de caracteres al mismo brillo que los de raphik. Voy a instalar sw y configurar... e informo.

peperfus

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #71 en: 30-09-2017, 14:00 (Sábado) »


Conclusión clara: Algo había mal a nivel de mal contacto eléctrico en el router anterior; o bien el pegamento conductor no es lo suficientemente bueno para esto.

Muchas gracias a todos por la ayuda, ideas y comentarios.

raphik, te mereces un monumomento.

Y ahora, lo primerísimo que hay que hacer es asegurar todas las soldaduras y los puntos débiles bien con silicona para que no sufran tirones que puedan partir las uniones.
« Última modificación: 30-09-2017, 14:08 (Sábado) por peperfus »

Desconectado jar229

  • Moderador
  • *
  • Mensajes: 4607
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #72 en: 30-09-2017, 14:22 (Sábado) »
Mola el mensaje de la pantalla  >:( >:( >:(
« Última modificación: 30-09-2017, 14:22 (Sábado) por jar229 »

Ficht

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #73 en: 30-09-2017, 15:01 (Sábado) »
Conclusión clara: Algo había mal a nivel de mal contacto eléctrico en el router anterior; o bien el pegamento conductor no es lo suficientemente bueno para esto.

Muchas gracias a todos por la ayuda, ideas y comentarios.

raphik, te mereces un monumomento.

Y ahora, lo primerísimo que hay que hacer es asegurar todas las soldaduras y los puntos débiles bien con silicona para que no sufran tirones que puedan partir las uniones.

 >:( >:( >:( Enhorabuena!!

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #74 en: 30-09-2017, 16:25 (Sábado) »
¡Plis, plas, plus!  >:( >:( >:(

raphik

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #75 en: 01-10-2017, 13:11 (Domingo) »
¡Enhorabiena, peperfus!

peperfus

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #76 en: 01-10-2017, 14:53 (Domingo) »
Graicas  ;D ;D ;D ;D

Ahora se me ocurren varias aplicaciones chulas para utilizar la pantalllita. La más inmediata, un simple reloj que informe de la fecha y hora.
raphik, ¿te parece bien que publique aquí en este mismo hilo los scripts que se me vayan ocurriendo para darle utilidad a la pantallita?

Si no lo ves adecuado, lo borro; pero yo creo que estaría bien tenerlo aquí mismo, por si alguien más se anima y quiere utilizar estos scripts, además de, por supuesto, mejorarlos, optimizarlos, corregirlos, modificarlos.... al antojo de quien quiera = Software libre.

"RELOJ" que muestra fecha y hora y posible información cada minuto o cada hora:
Código: [Seleccionar]
#!/bin/sh

# Script que muestra la fecha completa y la hora en pantalla LCD 1604.
# Utiliza (requiere) el script lcd_write.sh de raphik.
# Sintaxis: fechayhora.sh
# Se recomienda dejarlo en ejecucion en segundo plano.
# Opcionalmente puede mostrar informacion extra cada minuto y cada hora.
# Empieza en modo demo, mostrando una prueba cada minuto y hora.
# Programado por Peperfus


VERSION=1.6;
RUTA_lcd_write=/root;


FIL=0;
COL=0;
COLANYO=0;

DIAMES=99;
DIASEM=99;
DIASEMANA=99;
MES=99;
MESELEG=99;
ANYO=99;
ANYOELEG=9999;

HORA=99;
MINUTOS=99;
SEGUNDOS=99;

limpiaFil()
{
# 16 caracteres blanco  "1234567890123456"
  $RUTA_lcd_write/lcd_write.sh $FIL 0 "                ";
}

calculaHora()
{
  HORA=$(date | cut -d : -f 1 | tail -c 3);
}

calculaMinutos()
{
  MINUTOS=$(date -Iminute | cut -d : -f 2 | head -c 2);
}

calculaSegundos()
{
  SEGUNDOS=$(date -Isecond | cut -d : -f 3 | head -c 2);
}

calculaDiaMes()
{
  DIAMES=$(date -I | cut -d - -f 3);
}

calculaDiaSem()
{
  calculaDiaSemana;
  DIASEM=$(echo $DIASEMANA | head -c 3);
}

calculaDiaSemana()
{
  DIAWEEK=$(date | head -c 3);
  case "$DIAWEEK" in
    Sun)
      DIASEMANA="Domingo";
      ;;
    Mon)
      DIASEMANA="Lunes";
      ;;
    Tue)
      DIASEMANA="Martes";
      ;;
    Wed)
      DIASEMANA="Miercoles";
      ;;
    Thu)
      DIASEMANA="Jueves";
      ;;
    Fri)
      DIASEMANA="Viernes";
      ;;
    Sat)
      DIASEMANA="Sabado";
      ;;
  esac
}

calculaMes()
{
  MES=$(date -I | cut -d - -f 2);
}

calculaMesEleg()
{
  # Para los meses demasiado largos COLANYO se desplaza a la derecha y se usa el anyo corto
  COLANYO=12;
  calculaMes;
  case "$MES" in
    01)
      MESELEG="Enero";
      ;;
    02)
      MESELEG="Febrero";
      ;;
    03)
      MESELEG="Marzo";
      ;;
    04)
      MESELEG="Abril";
      ;;
    05)
      MESELEG="Mayo";
      ;;
    06)
      MESELEG="Junio";
      ;;
    07)
      MESELEG="Julio";
      ;;
    08)
      MESELEG="Agosto";
      ;;
    09)
      MESELEG="Septiembre";
      COLANYO=14;
      ;;
    10)
      MESELEG="Octubre";
      ;;
    11)
      MESELEG="Noviembre";
      COLANYO=14;
      ;;
    12)
      MESELEG="Diciembre";
      COLANYO=14;
      ;;
  esac
}

calculaAnyo()
{
  calculaAnyoEleg;
  ANYO=$(echo $ANYOELEG | tail -c 3);
}

calculaAnyoEleg()
{
  ANYOELEG=$(date | tail -c 5);
}


muestraHoras()
{
  calculaHora;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$HORA";
}

muestraMinutos()
{
  calculaMinutos;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$MINUTOS";
}

muestraSegundos()
{
  calculaSegundos;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$SEGUNDOS";
}


muestraHoraCompelta()
{
  muestraHoraCorta;
  calculaSegundos;
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+5)) ":";
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+6)) "$SEGUNDOS";
}


muestraHoraCorta()
{
  calculaHora;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$HORA";
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+2)) ":";
  calculaMinutos;
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+3)) "$MINUTOS";
}

muestraZonaHoraria()
{
  $RUTA_lcd_write/lcd_write.sh 0 0 "Zona horaria:";
  $RUTA_lcd_write/lcd_write.sh 1 0 "$(cat /etc/config/system | grep zonename | cut -d \' -f 2)";
}

muestraDiaSemana()
{
  calculaDiaSemana;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIASEMANA";
}

muestraDiaSem()
{
  calculaDiaSem;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIASEM";
}


muestraFechaCompleta()
{
  muestraFechaCorta;
  # ANYO
  calculaAnyo;
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+5)) "/";
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+6)) "$ANYOELEG";
}

muestraFechaCorta()
{
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "               ";
  # DIA
  calculaDiaMes;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIAMES";
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+2)) "/";
  # MES
  calculaMes;
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+3)) "$MES";
}

muestraFechaElegante()
{
  # DIA
  calculaDiaMes;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "$DIAMES";
  calculaMesEleg;
  $RUTA_lcd_write/lcd_write.sh $FIL $(($COL+3)) "$MESELEG";
  calculaAnyo;
  # Si el mes es demasiado largo, se usa anyo corto
  if [ $COLANYO -eq 14 ]; then ANYOELEG=$ANYO;  fi
  $RUTA_lcd_write/lcd_write.sh $FIL $COLANYO "$ANYOELEG";
}


refrescar()
{
  # Actualiza toda la pantalla.
  # Se suele invocar en la hora 00, cuando cambia el dia
  # O bien, tras una informacion por minuto u hora.

  $RUTA_lcd_write/lcd_write.sh init;
  FIL=0;
  COL=0;
  muestraDiaSemana;
  COL=11;
  muestraHoraCorta;

  FIL=1;
  COL=0;
  muestraFechaElegante;
}


infoXMinuto()
{
  # Informacion extra para mostrar cada minuto
  # DEBE limpiar lo que escribe
  FIL=1;
  COL=0;
  limpiaFil;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "Ha pasado 1 min"
  sleep 2;
  limpiaFil;
  muestraFechaElegante;
}

infoXHora()
{
  # Informacion extra para mostrar cada hora
  # DEBE limpiar lo que escribe
  FIL=1;
  COL=0;
  limpiaFil;
  $RUTA_lcd_write/lcd_write.sh $FIL $COL "Ha pasado 1hora"
  sleep 5;
  limpiaFil;
  muestraFechaElegante;
}

presentacion()
{
  # Mis 3 segundos de gloria xD
  $RUTA_lcd_write/lcd_write.sh init;
  $RUTA_lcd_write/lcd_write.sh 0 0 "SMART CLOCK v$VERSION";
  $RUTA_lcd_write/lcd_write.sh 1 0 "Por Peperfus";
  sleep 3;
}


muestraDatos()
{
  $RUTA_lcd_write/lcd_write.sh init;
  # IPS del router:                 1234567890123456
  $RUTA_lcd_write/lcd_write.sh 0 0 "Las IPS de mis "
  $RUTA_lcd_write/lcd_write.sh 1 0 "interfaces son:"
  sleep 1;
  $RUTA_lcd_write/lcd_write.sh init;
  FIL=0;
  for IP in $(ifconfig | grep "inet addr" | cut -d : -f 2 | cut -d ' ' -f 1)
  do
   # echo $IP;
   $RUTA_lcd_write/lcd_write.sh $FIL 0 $IP;
   if [ $FIL -eq 0 ]; then FIL=1;
     else FIL=0;
   fi
   sleep 1
  done
  sleep 2

  # ZONA HORARIA
  # Es para asegurarnos de que la ZH
  # esta bien configurada y la hora
  # visualizada es fiable;
  muestraZonaHoraria;
  sleep 2;
  $RUTA_lcd_write/lcd_write.sh init;
  $RUTA_lcd_write/lcd_write.sh 0 0 "Cliente NTP:";
  NTP="Parado";
  pidof ntpd > /dev/null;
  if [ $? -eq 0 ]; then NTP="En marcha";  fi
  $RUTA_lcd_write/lcd_write.sh 1 0 "$NTP";
  sleep 2;
  $RUTA_lcd_write/lcd_write.sh init
  $RUTA_lcd_write/lcd_write.sh 0 0 "Conex. INTERNET:";
  $RUTA_lcd_write/lcd_write.sh 1 0 "Intentando...";
  sleep 1;
  INTERNET=KO;
  wget -qs http://google.com;
  if [[ $? -eq 0 ]]; then INTERNET=OK; fi
  $RUTA_lcd_write/lcd_write.sh 1 0 "$INTERNET             ";
  sleep 3;

  if [ "$INTERNET" == "OK" ]; then
    $RUTA_lcd_write/lcd_write.sh 0 0 "Sincronizando   ";
    $RUTA_lcd_write/lcd_write.sh 1 0 "con Internet ...";
    # Sincronizar reloj de la pantalla con Internet.
    calculaMinutos;
    calculaHora;

    # Si la hora es 0 es posible
    # que no haya podido coger la hora de Internet.
    # Asi que esperamos un tiempo hasta cogerla
    # o agotar un timeour; A no ser... que se encienda
    # el router a las 00 horas, que la hora seria
    # correcta.
    TIMEOUT=20;
    while [ $HORA -eq 0 ] && [ $TIMEOUT -ge 0 ]; do
      sleep 1;
      calculaHora;
      TIMEOUT=$((($TIMEOUT)-1));
      #echo $TIMEOUT;
    done
  else                               #1234567890123456
    $RUTA_lcd_write/lcd_write.sh 0 0 "Imposible sin-  ";
    $RUTA_lcd_write/lcd_write.sh 1 0 "cronizar reloj  ";
    sleep 2
    $RUTA_lcd_write/lcd_write.sh 0 0 "con Internet    ";
    $RUTA_lcd_write/lcd_write.sh 1 0 "actualmente.    ";
    sleep 2
    $RUTA_lcd_write/lcd_write.sh 0 0 "Se seguira in-  ";
    $RUTA_lcd_write/lcd_write.sh 1 0 "intentando.     ";
    sleep 2
    $RUTA_lcd_write/lcd_write.sh 0 0 "AVISO:          ";
    $RUTA_lcd_write/lcd_write.sh 1 0 "La hora puede   ";
    sleep 2
    $RUTA_lcd_write/lcd_write.sh 0 0 "ser incorrecta. ";
    $RUTA_lcd_write/lcd_write.sh 1 0 "Se corregira en ";
    sleep 2
    $RUTA_lcd_write/lcd_write.sh 0 0 "cuanto sea      ";
    $RUTA_lcd_write/lcd_write.sh 1 0 "posible.        ";
    sleep 2
  fi
}


############
## SCRIPT ##
############


  $RUTA_lcd_write/lcd_write.sh init;

  presentacion;
  muestraDatos;

  refrescar;

  while [ true ]; do
    while [ "$MINUTOS" != "00" ]; do
      FIL=0;
      COL=14;
      sleep 60;
      muestraMinutos;
#      infoXMinuto;
    done
    FIL=0;
    COL=11;
    muestraHoras;
#    infoXHora;
    # Para que vuelva a entrar en bucle minutos
    # actualizar pantalla una vez al dia:
    if [ "$HORA" == "00" ]; then refrescar; sleep 1; fi
    MINUTOS=-1;
  done;

Queda así:

(El vídeo es de la versión anterior del script).

Lo he probado un rato; no sé si tiene algún error; pero parece que va bien.
Si alguien encuentra algún error, o sugerencia...

Próximas ideas:
Mostrar wasaps
Mostrar resultados de fútbol
...
« Última modificación: 04-10-2017, 18:39 (Miércoles) por peperfus »

Desconectado Tki2000

  • Moderador
  • *
  • Mensajes: 2247
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #77 en: 01-10-2017, 17:24 (Domingo) »
Graicas  ;D ;D ;D ;D

Ahora se me ocurren varias aplicaciones chulas para utilizar la pantalllita. La más inmediata, un simple reloj que informe de la fecha y hora.
raphik, ¿te parece bien que publique aquí en este mismo hilo los scripts que se me vayan ocurriendo para darle utilidad a la pantallita?

Si no lo ves adecuado, lo borro; pero yo creo que estaría bien tenerlo aquí mismo, por si alguien más se anima y quiere utilizar estos scripts, además de, por supuesto, mejorarlos, optimizarlos, corregirlos, modificarlos.... al antojo de quien quiera = Software libre.

"RELOJ" que muestra fecha y hora:
Código: [Seleccionar]
#!/bin/sh

./lcd_write.sh init;
./lcd_write.sh 0 0 "SMART CLOCK v1.0";
sleep 3
./lcd_write.sh init;


SEGUNDOS=0;
MINUTOS=0;
cd /root;

  ./lcd_write.sh init;
  # ZONA HORARIA
  ./lcd_write.sh 0 0 "Zona horaria:"
  ./lcd_write.sh 1 0 "$(cat /etc/config/system | grep zonename | cut -d \' -f 2)";
  sleep 4;

  # FECHA COMPLETA CON ANYO
  #./lcd_write.sh init;
  ./lcd_write.sh 0 0 "               ";
  # DIA
  ./lcd_write.sh 0 0 "$(date -I | cut -d - -f 3)";
  ./lcd_write.sh 0 2 "/";
  # MES
  ./lcd_write.sh 0 3 "$(date -I | cut -d - -f 2)";
  ./lcd_write.sh 0 5 "/";
  # ANYO
  ./lcd_write.sh 0 6 "$(date | tail -c 3)";

  DIAWEEK=$(date | head -c 3);
  case "$DIAWEEK" in
    Sun)
      DIASEMANA="Domingo";
      ;;
    Mon)
      DIASEMANA="Lunes";
      ;;
    Tue)
      DIASEMANA="Martes";
      ;;
    Wed)
      DIASEMANA="Mierco.";
      ;;
    Thu)
      DIASEMANA="Jueves";
      ;;
    Fri)
      DIASEMANA="Viernes";
      ;;
    Sat)
      DIASEMANA="Sabado";
      ;;
  esac

  # DIA SEMANA
  ./lcd_write.sh 0 9 "$DIASEMANA" ;

  sleep 5;

# REDUCIMOS FECHA A DIA/MES PORQUE NO CABE TODO

while true
do
  #./lcd_write.sh init;
  ./lcd_write.sh 0 0 "                ";
  # DIA
  ./lcd_write.sh 0 0 "$(date -I | cut -d - -f 3)";
  ./lcd_write.sh 0 2 "/";
  # MES
  ./lcd_write.sh 0 3 "$(date -I | cut -d - -f 2)";

  # HORA
  ./lcd_write.sh 0 8 "$(date | cut -d : -f 1 | tail -c 3)"
  ./lcd_write.sh 0 10 ":";

  # DIA SEMANA 2a linea:
  ./lcd_write.sh 1 0 "                "
  if [ "$DIASEMANA" == "Mierco." ]; then DIASEMANA=Miercoles; fi
  ./lcd_write.sh 1 0 "$DIASEMANA";

  MINUTOS=-1;
  while [ "$MINUTOS" -ne "00" ]; do
    MINUTOS=$(date -Iminute | cut -d : -f 2 | head -c 2);
    ./lcd_write.sh 0 11 "$MINUTOS";
    ./lcd_write.sh 0 13 ":";
    SEGUNDOS=-1;
    while [ "$SEGUNDOS" -ne "00" ]; do
      SEGUNDOS=$(date -Isecond | cut -d : -f 3 | head -c 2);
      ./lcd_write.sh 0 14 "$SEGUNDOS";
    done;
  done;
done;

Queda así:
...

Supongo que después de tener el cableado correctamente, ya puedes usar kmod-i2c-gpio-custom, para que aparezca el dispositivo en /dev, y usar lcd4linux para poner en la pantalla lo que quieras. Hay un driver para HD44780-I2C.

https://wiki.openwrt.org/doc/hardware/port.i2c
https://lcd4linux.bulix.org/

raphik

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #78 en: 01-10-2017, 19:22 (Domingo) »
... Ahora se me ocurren varias aplicaciones chulas para utilizar la pantalllita. La más inmediata, un simple reloj que informe de la fecha y hora.
raphik, ¿te parece bien que publique aquí en este mismo hilo los scripts que se me vayan ocurriendo para darle utilidad a la pantallita?...

Claro que sí, me parece muy bien y te agradezco que los publiques aquí.

raphik

  • Visitante
Re: Proyecto GPIO: Manejo de una pantalla LCD vía bus I²C.
« Respuesta #79 en: 01-10-2017, 19:54 (Domingo) »
Supongo que después de tener el cableado correctamente, ya puedes usar kmod-i2c-gpio-custom, para que aparezca el dispositivo en /dev, y usar lcd4linux para poner en la pantalla lo que quieras. Hay un driver para HD44780-I2C.

Si se sigue el procedimiento del primer post (punto B.2), el dispositivo i2c debería verse como /dev/i2c-0. Nunca llegué a probar LCD4Linux. En las compilaciones actuales no aparece como paquete estándar. Habría que compilarlo o probar si funciona instalando alguno de los antiguos paquetes de la versión Barrier Breaker.

Código: [Seleccionar]
https://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/lcd4linux-custom_r1187-1_brcm63xx.ipk
https://downloads.openwrt.org/barrier_breaker/14.07/brcm63xx/generic/packages/oldpackages/lcd4linux-full_r1187-1_brcm63xx.ipk
« Última modificación: 02-10-2017, 18:45 (Lunes) por raphik »