28 fevereiro 2017

Medidor de distância com display OLED colorido

Com o display Oled Colorido SSD1331 você pode criar projetos com maior interatividade com o usuário, já que o display permite mostrar até 65.000 cores diferentes, entre gráficos e texto. 

display oled colorido SSD1331
Como exemplo, vamos montar um medidor de distância com sensor ultrassônico HC-SR04, mostrando na tela a distância e ao lado um gráfico, que aumenta ou diminui conforme a distância do objeto ao sensor.

Display Oled Colorido 0.96"


O display oled que vamos utilizar é de 0.96 polegadas, com resolução de 96x64 pixels. Ele é capaz de mostrar 65.000 cores, funcionando com conexão SPI e tensão de alimentação entre 2,8 e 5,5V. O controlador é o SSD1331 (datasheet).
Pinagem SSD1331

Ao contrário de outros displays que tem apenas uma faixa colorida no topo (altura de 13 pixels, se não me engano), esse display oled colorido é capaz de mostrar cores em qualquer área da tela, deixando o seu projeto muito mais agradável visualmente.

Display Oled Colorido - Gráficos e Texto
Outro ponto positivo deste display é a compatibilidade com placas que trabalham com nível de sinal de 3.3 e 5V, assim você pode usar o display diretamente em placas como Arduino, Raspberry Pi, módulos ESP8266, etc.

Conexão display oled colorido no Arduino


Como já mencionamos anteriormente, a conexão com o Arduino é feita pela interface SPI, então vamos conectar o display em um Arduino Uno usando os pinos 8,9,10,11 e 13. 

Circuito Arduino Uno e display Oled Colorido


Nos pinos digitais 5 e 6 vamos ligar os pinos trigger e echo o sensor ultrassônico HC-SR04.

Programa medidor de distância


O programa do medidor de distância com display oled colorido usa as bibliotecas Adafruit SSD 1331 (download) e também a Ultrasonic (download). Você também vai precisar da Adafruit GFX (download) para mexer na parte gráfica do display.

Após a definição das bibliotecas e inicialização do display e do sensor ultrassônico, o programa efetua a leitura do sensor e chama a rotina AtualizaDisplay() para mostrar as informações na tela.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
//Programa: Medidor de distancia com 
//          display Oled Colorido SSD1331
//Autor: Arduino e Cia

#include <Ultrasonic.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1331.h>
#include <SPI.h>

//Pinos de ligacao do display SSD1331
#define sclk 13
#define mosi 11
#define cs   10
#define rst  9
#define dc   8

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

//Ligacao do pino Trigger do HC-SR04
#define PINO_TRIGGER  5

//Ligacao do pino Echo do HC-SR04
#define PINO_ECHO     6

//Inicializa o sensor ultrassonico
Ultrasonic Ultrasonic(PINO_TRIGGER, PINO_ECHO);

//Inicializa o display Oled
Adafruit_SSD1331 display = Adafruit_SSD1331(cs, dc, rst);

//Posicao inicial do grafico
int posicao_x = 72;
int posicao_y = 26;
int largura = 8;
int altura = 2;

void setup(void)
{
  Serial.begin(9600);
  display.begin();
  //Informacoes iniciais do display
  display.fillScreen(BLACK);
  display.drawRect(0, 0, 96, 17, WHITE);
  display.fillRect(0, 0, 96, 17, YELLOW);
  display.drawRect(0, 0, 96, 17, WHITE);
  display.drawRect(0, 19 , 54, 44, WHITE);
  display.drawRect(55, 19 , 41, 44, WHITE);
  display.setCursor( 22, 50 );
  display.print("cm");
  display.setTextSize(1);
  display.setTextColor(BLACK);
  display.setCursor( 22, 5 );
  display.print( "DISTANCIA" );
}

void loop(void)
{
  //Leitura da distancia do HC-SR04
  long distancia = Ultrasonic.distanceRead();

  //Atualiza as informacoes na tela
  AtualizaDisplay(distancia);

  delay(30);
}

void AtualizaDisplay(long val)
{
  //Atualiza a distancia na tela
  display.fillRect(1, 20 , 50, 23, BLACK);
  display.setTextSize(2);
  display.setTextColor(BLUE);
  display.setCursor( 10, 29 );
  display.print( val );

  //Atualiza a animacao da distancia
  display.fillRect(57, 20 , 38, 42, BLACK);
  posicao_x = 72;
  posicao_y = 26;
  largura = 8;
  altura = 2;

  int grafico = map(val, 0, 200, 1, 8);
  if (grafico >= 8)
  {
    grafico = 8;
  }

  //Preenche animacao distancia
  for (int i = 1; i <= grafico; i++)
  {
    display.fillRect(posicao_x, posicao_y , largura, altura, GREEN);
    posicao_x = posicao_x - 2;
    posicao_y = posicao_y + 4;
    largura = largura + 4;
  }
}

Para maiores informações sobre os comandos gráficos da biblioteca Adafruit GFX, consulte a documentação da biblioteca neste link.

Agora que você já sabe como montar um medidor de distância com display Oled Colorido SSD1331, confira também como fazer um medidor usando display LCD 16x2 no post Medidor de Distância com o sensor ultrassônico HC-SR04,

8 comentários:

  1. Parabéns achei interessante projeto vou tentar montar para ver bem mais a fundo a priori percebi que ao compilar o código na linha 33 ,34 está dando erro.

    ResponderExcluir
    Respostas
    1. Boa noite,

      Obrigado. Você tem alguma outra biblioteca Ultrasonic instalada ? Me parece que está em conflito com alguma biblioteca existente.

      Abraço!

      Excluir
  2. Arduino: 1.6.5 (Windows 7), Placa:"Arduino/Genuino Uno"

    Opções de compilação alteradas, recompilando tudo

    Usando biblioteca Ultrasonic na pasta: C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master

    Usando biblioteca PCD8544 na pasta: C:\Program Files (x86)\Arduino\libraries\PCD8544 (legacy)

    Usando biblioteca Adafruit SSD1331 OLED Driver Library for Arduino na pasta: C:\Program Files (x86)\Arduino\libraries\Adafruit-SSD1331-OLED-Driver-Library-for-Arduino-master

    Usando biblioteca SPI na pasta: C:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI



    C:\Program Files (x86)\Arduino\hardware\tools\avr/bin/avr-g++ -c -g -Os -w -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD -mmcu=atmega328p -DF_CPU=16000000L -DARDUINO=10605 -DARDUINO_AVR_UNO -DARDUINO_ARCH_AVR -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\variants\standard -IC:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src -IC:\Program Files (x86)\Arduino\libraries\PCD8544 -IC:\Program Files (x86)\Arduino\libraries\Adafruit-SSD1331-OLED-Driver-Library-for-Arduino-master -IC:\Program Files (x86)\Arduino\hardware\arduino\avr\libraries\SPI C:\Users\FM\AppData\Local\Temp\build5561403172525669483.tmp\MEDIDOR_DISTANCIA_COM_OLED_COLORIDO.cpp -o C:\Users\FM\AppData\Local\Temp\build5561403172525669483.tmp\MEDIDOR_DISTANCIA_COM_OLED_COLORIDO.cpp.o

    In file included from MEDIDOR_DISTANCIA_COM_OLED_COLORIDO.ino:7:0:
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:24:24: error: expected ')' before 'sigPin'
    Ultrasonic(uint8_t sigPin);
    ^
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:25:24: error: expected ')' before 'trigPin'
    Ultrasonic(uint8_t trigPin, uint8_t echoPin);
    ^
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:27:31: error: 'uint8_t' has not been declared
    unsigned int distanceRead(uint8_t und);
    ^
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:30:5: error: 'uint8_t' does not name a type
    uint8_t trig;
    ^
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:31:5: error: 'uint8_t' does not name a type
    uint8_t echo;
    ^
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:32:5: error: 'boolean' does not name a type
    boolean threePins = false;
    ^
    MEDIDOR_DISTANCIA_COM_OLED_COLORIDO.ino:36:45: error: no matching function for call to 'Ultrasonic::Ultrasonic(int, int)'
    MEDIDOR_DISTANCIA_COM_OLED_COLORIDO.ino:36:45: note: candidates are:
    In file included from MEDIDOR_DISTANCIA_COM_OLED_COLORIDO.ino:7:0:
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:22:7: note: Ultrasonic::Ultrasonic()
    class Ultrasonic {
    ^
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:22:7: note: candidate expects 0 arguments, 2 provided
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:22:7: note: Ultrasonic::Ultrasonic(const Ultrasonic&)
    C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master\src/Ultrasonic.h:22:7: note: candidate expects 1 argument, 2 provided
    Multiple libraries were found for "Ultrasonic.h"

    Used: C:\Program Files (x86)\Arduino\libraries\Ultrasonic-master

    Not used: C:\Program Files (x86)\Arduino\libraries\HCSR04Ultrasonic

    Not used: C:\Program Files (x86)\Arduino\libraries\HCSR04

    Multiple libraries were found for "Adafruit_GFX.h"

    Used: C:\Program Files (x86)\Arduino\libraries\PCD8544

    Not used: C:\Program Files (x86)\Arduino\libraries\Adafruit-GFX-Library-master

    no matching function for call to 'Ultrasonic::Ultrasonic(int, int)'

    ResponderExcluir
    Respostas
    1. Boa noite,

      Parece mesmo conflito de biblioteca. No relatório que vc mandou consta "Multiple libraries were found for Ultrasonic.h".

      Abraço!

      Excluir
    2. Realmente era isso mesmo estava com 2 lib dele porem esta dentro de outra pasta que não sei como foi parar lá (: Valeu Abraço parabéns gostei muito do OLED achei bem interessante, obrigado pela atenção (y)

      Excluir
    3. Opa, que bom que funcionou. :)

      Valeu. Abraço!

      Excluir
  3. Respostas
    1. Bom dia,

      Por favor utilize o formulário de contato no lado direito da página. Conversamos por email.

      Abraço!

      Adilson

      Excluir