Sobre como conectar e trabalhar com telas OLED de texto Winstar

As exibições de linha (ou texto) destinam-se à entrega de informações de texto na forma de linhas. Eles são de vários tipos (principalmente LCD ou OLED auto-luminoso), e geralmente em suas marcações existem os números 1202, 1602, 1204 ou similar, indicando o número de linhas (nos exemplos 2 ou 4) e os caracteres em cada linha (12 e 16) . Existem exibições de linha única desse tipo, mas na apresentação a seguir focamos nas exibições de duas linhas mais usadas.

A maioria desses monitores é compatível com o controlador HD44780 (Hitachi). As telas mais populares (pelo menos em nosso país) dessa variedade são produzidas pela Winstar. Além disso, as variedades de LCD (o nome começa com as letras WH, por exemplo, WH1602) são compatíveis individualmente com o sistema de comando HD44780 e os tipos OLED (o nome começa com WEH, por exemplo, WEH001602) possuem um controlador WS0010 aprimorado. Infelizmente, ou felizmente, vamos lidar agora.

Ao contrário dos displays gráficos que examinamos anteriormente com base no controlador ks0108, o gerador de caracteres nos displays em letras minúsculas é incorporado. Além disso, para nós, a principal diferença entre o WS0010 e o padrão HD44780 é a presença de várias (quatro) tabelas de códigos para a exibição de texto multilíngue. O HD44780 possui apenas uma dessas tabelas, e é por isso que as empresas precisam vender um tipo de exibição separado em cada região. Os monitores OLED baseados no WS0010 não exigem quebras regionais, o que é muito mais conveniente. Mas não para o usuário: por padrão, a tabela ENGLISH_JAPANESE é ativada nos displays WEH e, para ativar caracteres russos, é necessário alternar para ENGLISH_RUSSIAN.

Saiba mais sobre a tabela ENGLISH_RUSSIAN.
: (. ) , . , , — - -8, (. 19768-93). -, , , EBCDIC, , ( 127 ) ASCII. , , , ASCII .

A biblioteca LiquidCrystal padrão (fornecida com o Arduino IDE), é claro, não sabe nada sobre as quatro tabelas e, portanto, requer correção, pelo menos nesse aspecto. Mas não apenas: no final, seria possível fazer com o idioma inglês. No entanto, o procedimento de inicialização é notavelmente diferente para o WS0010 e, se não for corrigido, a tela mostrará isso sempre que é iniciado.

Outros recursos
, OLED- Winstar , ( , ). , , . , , WEH SPI (, « SPI»), , , ( 3) — . : , . , I2C (. , ).

Por alguma razão, os displays Winstar apresentam um grande déficit em termos de documentação inteligível (como você deve ter notado, isso geralmente é um recurso característico dos produtos chineses). Vale ressaltar onde é possível baixar a documentação mais ou menos completa, sem erros: aqui no LCD (WH1602) com um controlador HD44780, aqui nos displays OLED (WEH1602), aqui no controlador WS0010 separadamente (veremos mais adiante) . E aqui, se você estiver interessado, há uma descrição detalhada do controlador HD44780 em russo.

Nivelando a biblioteca LiquidCrystal


Para controlar as exibições em minúsculas no HD44780 e seus análogos, a biblioteca padrão LiquidCrystal, tradicionalmente incluída no IDE do Arduino de todas as versões, é bastante adequada. Para exibir o texto em russo, existe a versão do LiquidCrystalRus , que surpreendentemente funciona bem em todas as versões modernas do IDE do Arduino (diz que o autor abordou corretamente a conversão de caracteres UTF-8). Mas, para se adaptar a displays OLED no controlador WS0010, você ainda precisa fazer correções. No futuro, iremos zombar desta biblioteca e, portanto, renomearemos como LiquidCrystalRus_OLED, para não confundir com a usual. Para simplificar a tarefa, não renomearemos as funções, porque a inicialização será a mesma que para o LiquidCrystalRus original.

As alterações são as seguintes:

1. Desdea tabela russo-inglês no WS0010 (consulte a página 9 para a folha de dados no WS0010 usando o link acima) é o número 2; para alternar para ela, é necessário definir os dois bits menos significativos FT1 e FT0 no comando SET DE FUNÇÃO para configurá-lo no estado 10 (0x02). (Nos LCDs com uma tabela de códigos, esses bits, a propósito, não são utilizados). Para fazer isso, no arquivo LiquidCrystalRus_OLED.cpp , procure o local (linha 96 do arquivo) onde o valor da variável _displayfunction está definido . Nas duas linhas de sua inicialização (linhas 97 e 99), adicione um apêndice " | = 0x02 ".

2. Em seguida, você precisa corrigir o atraso de inicialização após ligar a energia. Para o HD44780, ele deve ter no máximo 40 ms (consulte a documentação nos links acima). A biblioteca usa a função para isso.delayMicroseconds (50000) (linha 120 do arquivo LiquidCrystalRus_OLED.cpp ). Para o controlador WS0010, é necessário um atraso dez vezes maior - pelo menos 500 ms (consulte a última página da folha de dados no link acima). Esse requisito é tão cuidadosamente oculto (os arquivos com a documentação em inglês no Winstar exibem "perdeu a fonte" precisamente nesta parte), que parece que poucas pessoas pensaram nisso até agora. Portanto, substituímos essa linha por 32 repetições de atraso de 16 ms cada:

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

3. Além disso (consulte também esta última página da folha de dados), após esse atraso, ao ligar quatro fios, você precisará enviar um comando vazio cinco vezes seguidas (0x00). Como o Arduino é significativamente mais rápido que o controlador do monitor, os comandos devem ser dados com um atraso intermediário. Eles precisam ser inseridos um pouco mais no texto da função begin, onde se trata especificamente da inclusão em 4 bits (linha 147 do arquivo LiquidCrystalRus_OLED.cpp ).

4. Mas este não é o fim. A tabela ENGLISH_RUSSIAN original possui um ícone de grau(código 0xEF). A opção é executada graficamente sem sucesso (muito grande); portanto, prefiro usar um ponto superior em negrito (código 0xDF) - é muito mais parecido com um diploma no estilo usual. Ele pode ser inserido na forma de um código (melhor que o octal "\ 337"), mas o problema é - tentar simplificar a função de substituir códigos de letras russas por códigos na tabela geradora de caracteres, o autor da biblioteca, com base na codificação UTF-8 (consulte o artigo anterior ), introduziu uma condição de substituição para qualquer código maior que 0x80 (função LiquidCrystalRus :: write ). Como nosso 0xDF é claramente maior que 0x80, quando você especifica o caractere "\ 337" na linha de código, um espaço vazio será exibido, pois não corresponde a nenhuma letra russa.

Infelizmente, a função createChar () padrãoquando tentei usá-lo para criar meu próprio ícone de graduação, entrei na tela com um estupor completo, do qual ele só podia ser removido recarregando o programa. Com o que preciso lidar adicionalmente, ficarei grato se alguém me disser qual é o problema. Portanto, o gerador de caracteres não pode ser editado em nossos recursos, mas podemos excluir o caractere 0xDF necessário da condição. Para fazer isso, substitua a condição existente (consulte o texto da função de gravação ) pelo seguinte:

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

5. Finalmente, o zero riscado nesta tela não é tão impressionante quanto nas telas gráficas de LCD. No entanto, na mesma função de gravação , introduzi a substituição do código zero (0x30) pelo código da letra "O" (0x4f). Aqueles que desejam podem retornar o zero riscado simplesmente excluindo ou comentando a linha de substituição (linha 308 do arquivo LiquidCrystalRus_OLED.cpp modificado ).
A biblioteca atualizada pode ser baixada no link no final do artigo.

Ligação


Agora tudo parece estar ajustado, você pode se conectar. A conexão do monitor WEH001602BG (16 caracteres, comprimento da tela 100 mm) ao Arduino é mostrada na figura a seguir: Os

imagem

pinos do Arduino aos quais os pinos do monitor RS, E, DB4-DB7 estão conectados devem ser indicados quando o monitor é inicializado:

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

Se desejar, você pode conectar dois ou mais monitores em qualquer opção de interface (oito ou quatro fios). Nesse caso, as linhas de dados e o RS podem ser compartilhados. A escolha entre displays neste caso é feita através do terminal E, que para diferentes displays é conectado a diferentes terminais do Arduino (as linhas de conexão do segundo display são mostradas em cinza no diagrama, o terminal E do segundo display aqui é conectado ao pino 6 do Arduino). Obviamente, nesse caso, você precisa criar duas cópias da biblioteca (por exemplo, OLED1 e OLED2), nas quais todas as saídas são iguais, exceto E. Além disso, os displays podem ter diferentes configurações e tamanhos (8x2, 16x2, 12x2, 12x4, etc.). .). Isso também se aplica aos monitores LCD convencionais no HD44780.

E por que existe um relé para poder? A principal desvantagem do WS0010 é a falta de hardware "rezet". No HD44780, o rezet embutido pode ser justificado - o autor não tem experiência suficiente com telas de LCD para ter certeza. Mas a Winstar, tentando seguir o padrão em seu desenvolvimento, claramente não conseguiu lidar com essa tarefa. Reiniciar o controlador sem desligar a energia leva ao aparecimento de qualquer turbidez no monitor, e você pode se livrar dele apenas manipulando a potência de todo o circuito e inicializando o monitor a partir do zero.

Além disso, a exibição ao desligar / ligar a alimentação pode confundir as linhas em alguns lugares. As pessoas afirmam que uma inclusão completa de 8 bits (em vez de 4 bits) ajuda, mas funcionou ainda pior para mim. Eles também insistem persistentemente em que, em hipotéticos "novos lotes", tudo isso já foi corrigido, mas é difícil de acreditar (que tipo de "novos" lotes estamos falando quando o Winstar lançou os displays OLED desde 2008 , e eu tinha 13 e 14 anos lançamento?).

Relé e defina para redefinir artificialmente a exibição ao reiniciar o Arduino sem desligar a energia. Isso elimina de maneira confiável o lixo na tela. A energia do monitor (ou monitores) é ligada separadamente através deste relé, que é ligado a partir do pino livre do Arduino (neste caso, pino 4) no início do procedimento de configuração, quando o controlador já está operando de forma estável. E antes de ligar o relé, é bom dar um atraso adicional de 1000 ms (veja o desenho abaixo). O relé indicado EDR202A05 é um relé de palheta, a corrente do enrolamento é de 10 mA e, portanto, é silenciosamente controlada a partir da saída do Arduino.

Quanto à confusão entre as linhas quando ativadas, além das alterações acima no procedimento de inicialização, esse efeito libera perfeitamente a energia de todo o circuito de uma fonte externa suficientemente poderosa (pelo menos 1-2 A) com uma tensão estável sob carga de pelo menos 7,5 volt. Essa dependência da nutrição é, obviamente, uma fonte de discrepâncias em muitas publicações, onde muitos autores afirmam que tudo funciona bem para elas. Nesse caso, a tela (ou telas) pode ser conectada através do estabilizador interno do Arduino (pino 5V da placa), ou eles podem ser conectados através de um estabilizador separado, mas o principal é que a tensão de entrada do estabilizador deve ser estável o suficiente, independentemente de picos de energia no momento da ligação.

Verifique


Para verificar, enviei um esboço demo, Proba_Rus_Liquid_Crystal_OLED , simulando uma exibição de relógio de calendário com um sensor de temperatura externo:

Exemplo de exibição 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
*/
}


Todas as alterações de características na biblioteca mencionada acima são aplicadas aqui. O programa também mostra como fazer o cólon piscar nas horas: minutos usando a função blink () . Observe que uma nova saída na mesma posição destrói o piscar de familiaridade e, ao atualizá-la, você deve retomar novamente, tendo definido anteriormente o cursor invisível na mesma posição 13 na linha zero. Com uma atualização de relógio real, pode ser mais fácil atualizar apenas os números nas posições 11-12 e 14-15, deixando o cólon piscando intacto.

Os resultados da saída de exemplo são mostrados na foto:

imagem

Note-se que a foto não transmite o brilho da tela OLED verde (neste caso). De fato, é uma cor verde escura, com um comprimento de onda menor que o habitual 568 nm em displays de LED (sete segmentos ou matriz). Por que o último no contexto do OLED parece "desbotado" e sua aplicação combinada é difícil.

O WS0010 possui um modo gráfico e os displays OLED gráficos Winstar (como WEG010016) também possuem esse controlador. Alguém notou que eles ainda têm a mesma matriz. Na minha opinião, tentar aplicar um modo gráfico em uma exibição de linha de texto é inútil: a exibição de linha possui espaços escuros definidos por hardware entre caracteres e linhas que tornam a imagem extremamente antiestética (veja vários exemplos de tais tentativas).

Uma nota final: sobre a durabilidade dos OLEDs da Winstar. Nas folhas de dados, o tempo é indicado 100.000 horas, ou seja, 11 anos. No entanto, uma das exibições do 13º ano de lançamento (brilho amarelo) até o momento atual (inverno do 16º) perdeu acentuadamente o brilho em mim. É engraçado que o restante da mesma festa (verde) e posterior (amarela e verde de 14 anos) não mostre sinais de morte. Portanto, com certeza, não pretendo dizer nada, mas, apenas por precaução, aconselho a não soldar os monitores na placa, mas instalá-los nos conectores, para que, no caso, eles possam ser substituídos sem problemas.

Você pode baixar o arquivo com uma biblioteca gratuita e um exemplo aqui .

UPD: havia uma solução para o problema de um início estável sem manipular o poder:
https://geektimes.ru/post/287234/

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


All Articles