Acerca de conectarse y trabajar con pantallas OLED de texto Winstar

Las pantallas de línea (o texto) están destinadas a la entrega de información de texto en forma de líneas. Son de varios tipos (principalmente LCD o OLED autoluminoso), y generalmente en su marcado hay números 1202, 1602, 1204 o similares, que indican el número de líneas (en los ejemplos 2 o 4) y caracteres en cada línea (12 y 16) . Hay pantallas de una sola línea de este tipo, pero en la siguiente presentación nos centramos en las pantallas de dos líneas más utilizadas.

La mayoría de estas pantallas son compatibles con el controlador HD44780 (Hitachi). Winstar produce las pantallas más populares (al menos en nuestro país) de esta variedad. Además, las variedades LCD (el nombre comienza con las letras WH, por ejemplo, WH1602) son compatibles uno a uno con el sistema de comando HD44780, y los tipos OLED (el nombre comienza con WEH, por ejemplo, WEH001602) tienen un controlador WS0010 mejorado. Desafortunadamente, o afortunadamente, trataremos ahora.

A diferencia de las pantallas gráficas que examinamos anteriormente basadas en el controlador ks0108, el generador de caracteres en las pantallas en minúsculas está incorporado. Además, para nosotros, la principal diferencia entre el WS0010 y el HD44780 estándar es la presencia de varias (cuatro) tablas de códigos para mostrar texto multilingüe. El HD44780 solo tiene una de esas mesas, razón por la cual las empresas tienen que vender un tipo de pantalla por separado en cada región. Las pantallas OLED basadas en WS0010 no requieren desgloses regionales, lo cual es mucho más conveniente. Pero no para el usuario: de forma predeterminada, la tabla ENGLISH_JAPANESE está activada en las pantallas WEH, y para habilitar los caracteres rusos, debe cambiarla a ENGLISH_RUSSIAN.

Obtenga más información sobre la tabla ENGLISH_RUSSIAN.
: (. ) , . , , — - -8, (. 19768-93). -, , , EBCDIC, , ( 127 ) ASCII. , , , ASCII .

La biblioteca estándar de LiquidCrystal (suministrada con el IDE de Arduino), por supuesto, no sabe nada sobre las cuatro tablas y, por lo tanto, requiere enderezarse, al menos a este respecto. Pero no solo: al final, sería posible hacerlo con el idioma inglés. Sin embargo, el procedimiento de inicialización es notablemente diferente para el WS0010, y si no se corrige, la pantalla lo mostrará cada vez que se inicie.

Otras características
, OLED- Winstar , ( , ). , , . , , WEH SPI (, « SPI»), , , ( 3) — . : , . , I2C (. , ).

Por alguna razón, las pantallas Winstar tienen un gran déficit en términos de documentación inteligible (como habrás notado, esto generalmente es un rasgo característico de los productos chinos). Vale la pena señalar dónde puede descargar documentación más o menos completa sin ningún error: aquí en la pantalla LCD (WH1602) con un controlador HD44780, aquí en las pantallas OLED (WEH1602), aquí en el controlador WS0010 por separado (nos referiremos a él más adelante) . Y aquí, si está interesado, hay una descripción detallada del controlador HD44780 en ruso.

Nivelación de la biblioteca LiquidCrystal


Para controlar las pantallas en minúsculas en el HD44780 y sus análogos, la biblioteca LiquidCrystal estándar, que tradicionalmente se incluye en el IDE de Arduino de todas las versiones, es bastante adecuada. Para mostrar el texto en ruso, existe su versión de LiquidCrystalRus , que sorprendentemente funciona bien en todas las versiones modernas del IDE Arduino (dice que el autor se acercó correctamente a la conversión de caracteres UTF-8). Pero para adaptarse a las pantallas OLED en el controlador WS0010, aún necesita hacer correcciones. En el futuro, nos burlaremos de esta biblioteca y, por lo tanto, la cambiaremos de nombre LiquidCrystalRus_OLED, para no confundirla con la habitual. Para simplificar la tarea, no cambiaremos el nombre de las funciones, porque la inicialización será la misma que para el LiquidCrystalRus original.

Los cambios son los siguientes:

1. Desdela tabla ruso-inglés en WS0010 (vea la página 9 para la hoja de datos en WS0010 usando el enlace de arriba) es el número 2, luego para cambiarla necesita establecer los dos bits menos significativos FT1 y FT0 en el comando FUNCTION SET para configurarlo en el estado 10 (0x02). (En los LCD con una tabla de códigos, estos bits, por cierto, no se utilizan en absoluto). Para hacer esto, en el archivo LiquidCrystalRus_OLED.cpp , busque el lugar (línea 96 del archivo) donde se establece el valor de la variable _displayfunction . En ambas líneas de su inicialización (líneas 97 y 99) agregue un anexo " | = 0x02 ".

2. A continuación, debe corregir el retraso de inicialización después de encender la alimentación. Para HD44780, no debe superar los 40 ms (consulte la documentación en los enlaces anteriores). La biblioteca usa la función para esto.delayMicroseconds (50000) (línea 120 del archivo LiquidCrystalRus_OLED.cpp ). Para el controlador WS0010, debe tener un retraso diez veces más largo, al menos 500 ms (consulte la última página de la hoja de datos en el enlace anterior). Este requisito está tan cuidadosamente oculto (los archivos con la documentación en inglés en Winstar muestra "perdió la fuente" precisamente en esta parte), que parece que pocas personas lo han pensado hasta ahora. Por lo tanto, reemplazamos esta línea con 32 repeticiones de retraso de 16 ms cada una:

for (int i = 0; i <=31; i++) delayMicroseconds(16000);

3. Además de esto (consulte también esta última página de la hoja de datos), después de este retraso, al encender cuatro hilos, debe enviar un comando vacío cinco veces seguidas (0x00). Dado que el Arduino es significativamente más rápido que el controlador de pantalla, los comandos deben darse con un retraso intermedio. Deben insertarse un poco más en el texto de la función de inicio, donde se trata específicamente de la inclusión de 4 bits (línea 147 del archivo LiquidCrystalRus_OLED.cpp ).

4. Pero este no es el final. La tabla original de ENGLISH_RUSSIAN tiene un icono de grado(código 0xEF). La opción se ejecuta gráficamente de manera extremadamente infructuosa (demasiado grande), por lo que prefiero usar un punto superior en negrita (código 0xDF), es mucho más parecido a un grado en el estilo habitual. Podría ingresarse en forma de código (mejor que el octal "\ 337"), pero el problema es que, tratando de simplificar la función de reemplazar códigos de letras rusas con códigos en la tabla del generador de caracteres, el autor de la biblioteca, basado en la codificación UTF-8 (ver el artículo anterior ), introdujo una condición de reemplazo para cualquier código mayor que 0x80 ( LiquidCrystalRus :: función de escritura ). Como nuestro 0xDF es claramente mayor que 0x80, cuando especifique el carácter "\ 337" en la línea de código, se mostrará un espacio vacío, ya que no corresponde a ninguna letra rusa.

Desafortunadamente, la función estándar createChar ()Cuando intenté usarlo para crear mi propio ícono de grado, entré en la pantalla con un estupor completo, del cual solo podía eliminarlo volviendo a cargar el programa. De lo que tengo que ocuparme adicionalmente y estaré agradecido si alguien me cuenta cuál es el problema. Por lo tanto, el generador de caracteres no se puede editar en nuestras capacidades, pero podemos excluir el carácter 0xDF que necesitamos de la condición. Para hacer esto, reemplace la condición existente (vea el texto de la función de escritura ) con lo siguiente:

if ((value>=0x80)&&(value!=0xdf))

5. Finalmente, el cero tachado en esta pantalla no es tan sorprendente como en las pantallas LCD gráficas. Sin embargo, en la misma función de escritura , introduje el reemplazo del código cero (0x30) con el código de la letra "O" (0x4f). Aquellos que lo deseen pueden devolver el cero tachado simplemente borrando o comentando la línea de reemplazo (línea 308 del archivo LiquidCrystalRus_OLED.cpp modificado ).
La biblioteca actualizada se puede descargar desde el enlace al final del artículo.

Conexión


Ahora todo parece estar ajustado, puedes conectarte. La conexión de la pantalla WEH001602BG (16 caracteres, longitud de pantalla 100 mm) al Arduino se muestra en la siguiente figura:

imagen

Los pines Arduino a los que están conectados los pines de pantalla RS, E, DB4-DB7 deben indicarse cuando se inicializa la pantalla:

// RS, E, DB4, DB5, DB6, DB7
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);

Si lo desea, puede conectar dos o incluso más pantallas en cualquier opción de interfaz (ocho o cuatro hilos). En este caso, se pueden compartir líneas de datos y RS. La elección entre pantallas en este caso se realiza a través del terminal E, que para diferentes pantallas está conectado a diferentes terminales Arduino (las líneas de conexión de la segunda pantalla se muestran en gris en el diagrama, el terminal E de la segunda pantalla aquí está conectado al pin 6 del Arduino). Por supuesto, en este caso, debe crear dos copias de la biblioteca (por ejemplo, OLED1 y OLED2), en las que todas las salidas son iguales, excepto E. Además, las pantallas pueden tener diferentes configuraciones y tamaños (8x2, 16x2, 12x2, 12x4, etc. .). Esto también se aplica a las pantallas LCD convencionales en el HD44780.

¿Y por qué hay un relevo para el poder? El principal inconveniente del WS0010 es la falta de "rezet" de hardware. En HD44780, el rezet incorporado puede estar justificado: el autor no tiene suficiente experiencia con pantallas LCD para asegurarlo. Pero Winstar, tratando de seguir el estándar en su desarrollo, claramente no pudo hacer frente a esta tarea. Reiniciar el controlador sin apagar la alimentación provoca la aparición de cualquier turbidez en la pantalla, y puede deshacerse de él solo haciendo malabares con la potencia de todo el circuito e inicializando la pantalla desde cero.

Además, la pantalla al apagar / encender la alimentación puede confundir las líneas en algunos lugares. La gente afirma que una inclusión completa de 8 bits (en lugar de 4 bits) ayuda, pero funcionó aún peor para mí. También insisten persistentemente en que en hipotéticos "nuevos lotes" todo esto ya se ha solucionado, pero es difícil de creer (de qué tipo de "nuevos" lotes estamos hablando cuando Winstar lanzó pantallas OLED desde 2008 , y tuve pantallas de 13 y 14 años lanzamiento?).

Transmita y configure para reiniciar artificialmente la pantalla al reiniciar el Arduino sin apagar la alimentación. Esto elimina de manera confiable la basura en la pantalla. La alimentación de la pantalla (o pantallas) se enciende por separado a través de este relé, que se enciende desde el pin Arduino libre (en este caso, el pin 4) al comienzo del procedimiento de configuración, cuando el controlador ya está funcionando de manera estable. Y antes de encender el relé, es bueno dar un retraso adicional de 1000 ms (vea el boceto a continuación). El relé indicado EDR202A05 es un relé de lámina, la corriente de bobinado es de 10 mA, por lo tanto, se controla silenciosamente desde la salida de Arduino.

En cuanto a la confusión entre las líneas cuando se enciende, además de los cambios anteriores en el procedimiento de inicialización, este efecto alivia perfectamente la potencia de todo el circuito de una fuente externa suficientemente potente (al menos 1-2 A) con un voltaje estable bajo carga de al menos 7.5 volt. Esta dependencia de la nutrición es, obviamente, una fuente de discrepancias en muchas publicaciones, donde muchos autores afirman que todo funciona bien para ellos. En este caso, la pantalla (o pantallas) se pueden conectar a través del estabilizador interno Arduino (pin 5V de la placa), o se pueden conectar a través de un estabilizador separado, pero lo principal es que el voltaje de entrada del estabilizador debe ser lo suficientemente estable, independientemente de las sobretensiones en el momento del encendido.

Cheque


Para verificar, envié un boceto de demostración, Proba_Rus_Liquid_Crystal_OLED , simulando una pantalla de reloj de calendario con un sensor de temperatura externo:

Mostrar ejemplo WEH1602
#include <LiquidCrystalRus_OLED.h>

// initialize the library with the numbers of the interface pins
// RS, E, DB4, DB5, DB6, DB7
LiquidCrystalRus OLED1(3, 5, 7, 8, 9, 10);
#define RelayPin 4 // 4 -  

void setup() {
delay (1000);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, HIGH); //  
delay (500);
  OLED1.begin(16,2); //16  2 
  OLED1.clear();
  OLED1.setCursor(0,0); // ,  
  OLED1.print("-22,3\337C"); //10  
  OLED1.setCursor(11,0); // , 11 
  OLED1.print("10:22"); //
  OLED1.setCursor(0,1); //   
  OLED1.print("16.01.17 "); // 16  
  OLED1.setCursor(13,0); // , 13  ":"
  OLED1.blink(); // 
   delay(1000);
}

void loop() {
/*        
        13,0 
    blink
*/
}


Todos los cambios característicos en la biblioteca mencionados anteriormente se aplican aquí. El programa también muestra cómo hacer que el colon parpadee en horas: minutos usando la función blink () . Tenga en cuenta que una nueva salida en la misma posición destruye el parpadeo de la familiaridad, y al actualizarla, debe reanudarla nuevamente, habiendo establecido previamente el cursor invisible en la misma posición 13 en la línea cero. Con una actualización de reloj real, puede ser más fácil actualizar solo los números en las posiciones 11-12 y 14-15, dejando intacto el colon parpadeante.

Los resultados de la salida del ejemplo se muestran en la foto:

imagen

Cabe señalar que la foto no transmite el brillo de la pantalla OLED verde (en este caso). De hecho, es un color verde intenso, con una longitud de onda más corta que la habitual de 568 nm en pantallas LED (siete segmentos o matriz). ¿Por qué este último en el contexto de OLED parece "desvanecido", y su aplicación combinada es difícil.

El WS0010 tiene un modo gráfico, y las pantallas OLED gráficas de Winstar (como WEG010016) también tienen este controlador. Alguien notó que incluso tienen la misma matriz. En mi opinión, tratar de aplicar un modo gráfico en una pantalla de línea de texto no tiene sentido: la pantalla de línea tiene espacios oscuros configurados por hardware entre caracteres y líneas que hacen que la imagen sea extremadamente poco estética (ver numerosos ejemplos de tales intentos).

Una nota final: sobre la durabilidad de los OLED Winstar. En las hojas de datos, el tiempo se indica 100.000 horas, es decir, 11 años. Sin embargo, una de las pantallas del decimotercer año de lanzamiento (brillo amarillo) hasta el momento presente (invierno del 16) ha perdido brillo en mí. Es curioso que el resto de la misma fiesta (verde) y posterior (amarillo y verde de 14 años) no muestre ningún signo de muerte. Por lo tanto, con certeza, no pretendo decir nada, pero por si acaso, le aconsejo que no suelde las pantallas en la placa, sino que las instale en los conectores, para que en caso de que puedan reemplazarse sin problemas.

Puede descargar el archivo con una biblioteca gratuita y un ejemplo desde aquí .

UPD: había una solución al problema de un inicio estable sin poder de manipulación:
https://geektimes.ru/post/287234/

Source: https://habr.com/ru/post/es400833/


All Articles