sábado, 11 de outubro de 2014

Simulação no Proteus - Arduino controlando Modulo Matriz Leds 8x8 e CI Max7219

Exemplo prático de como simular um Painel de Leds usando 3 Módulos de Matriz 8x8 e 3 CIs Max7219. Neste exemplo utilizei a biblioteca MD_MAX72xx feita para o CI Max7229. A simulação foi realizada no Proteus 7.10 - SP0.

Módulo Matriz 8x8 - CI MAX7219
Podemos ligar 8 CI's em série, ou seja, podemos utilizar o Arduino para controlar até 8 Matriz de 64 Leds



Diagrama com as ligações interna s de uma Matrix 8x8



Diagrama da simulação usando apenas 3 portas do Arduino.
 

Porta 10 do Arduino ligada ao pino LOAD
Porta 11 do Arduino ligada ao pino DIN
Porta 13 do Arduino ligada ao pino CLK


Demonstração






Sketch

/*
  Painel de leds com modulo de Matriz Max7219 

  Zedequias Fonseca
  http://vfeletronica.blogspot.com.br/
               10/10/2014
*/

// Carrega a biblioteca MD_MAX72xx 
#include <MD_MAX72xx.h> 
 
// Numero de modulos suportados de 1 a 8 Devices
#define     MAX_DEVICES   3 // Usaremos 3 Modulos
 
// Portas do Arduino
#define     CLK_PIN       13 
#define     DATA_PIN     11 
#define     CS_PIN          10 

// Cria matriz ( mx )
MD_MAX72XX mx = MD_MAX72XX(DATA_PIN,  CLK_PIN,  CS_PIN,  MAX_DEVICES); 
 
#define SCROLL_DELAY     200 // Velocidade do scroll 


#define CHAR_SPACING     1  // Colunas entre cada caracter 
#define BUF_SIZE     75

char curMessage[BUF_SIZE]; 
char newMessage[BUF_SIZE]; 
 

uint8_t scrollDataSource(uint8_t dev,  MD_MAX72XX::transformType_t t) 

   static char        *p      = curMessage; 
   static uint8_t     state = 0; 
   static uint8_t     curLen, showLen; 
   static uint8_t     cBuf[8]; 
   uint8_t colData; 
 
  switch(state) 
  { 
     case 0: 
     showLen = mx.getChar(*p++, sizeof(cBuf)/sizeof(cBuf[0]), cBuf); 
     curLen = 0; 
     state++; 
   
     if (*p == '\0') 
     { 
        p = curMessage; 
     }

    case 1:      
    colData = cBuf[curLen++]; 
   
    if (curLen == showLen) 
    { 
       showLen = CHAR_SPACING; 
       curLen = 0; 
       state = 2; 
    }  
   
    break; 
    case 2: 
    colData = 0; 
    curLen++; 

    if (curLen == showLen) 
      state = 0; 
   
    break; 
    default: 
    state = 0; 
  } 
  return(colData); 

 
void scrollText(void) 

  static uint32_t     prevTime = 0; 
  if (millis()-prevTime >= SCROLL_DELAY) 
  { 
    mx.transform(MD_MAX72XX::TSR);      
    prevTime = millis(); 
  } 

 
void setup() 

   mx.begin();                                                         // inicia a matriz
   mx.setShiftDataInCallback(scrollDataSource); 
   mx.control(MD_MAX72XX::INTENSITY, 4); // Define o nivel de luminosidade 

   // Mensagem a ser exibida  
   strcpy(curMessage, "Zedequias Fonseca - 1 2 3 4 5 6 7 8 9 0 - A B C D E F .    ");
   newMessage[0] = '\0'; 

  
void loop()  

   scrollText(); 

terça-feira, 12 de agosto de 2014

Simulação no Proteus - Arduino e o Sensor LM-35

       Exemplo de como ler um sensor de Temperatura (LM-35) utilizando o Arduino e converter o sinal analógico lido,  na temperatura correspondente, em grau Celsius, e enviar para o computador via USB (Serial).
Circuito


Arquivos



- O Arduino possui seis portas analógicas, que vão de A0 à A5, com resolução de 10 bits, e faixa de leitura 0 à 5v (0 à 1023).

Código do Sketch:

/*
  Projeto - Temômetro LCD com sensor LM35 e Arduino
  By - Zedequias Fonseca  -  08/2014
  http://vfeletronica.blogspot.com.br
*/

#include <LiquidCrystal.h> // Biblioteca para o LCD

// Variáveis
int tempPin = 0;          // Declaração do pino de entrada analógica 0 (A0) no Arduino
float mAmostra[8];     // matriz para armazenar oito amostras para o cálculo da temperatura média
float mLeitura = 0.00; // variavel para armazena leitura da temperatura

LiquidCrystal lcd(13, 12, 11, 10, 9, 8); // Inicialização do display e pinos correspondentes

void setup()
{
  Serial.begin(9600);                     // inicia comunicação serial
 
  lcd.begin(16, 2);                          // inicia e configura o número de linhas e colunas do LCD
  lcd.setCursor(1, 0);                      // seta posição do cursor (coluna, linha) do LCD
  lcd.print("Projeto com LM35");  // imprime texto no LCD
 
  delay(1000);   // aguarda 1s
}

void loop()
{
  // Início dos cálculos
  for(int i = 0; i <= 7; i++) // pega 8 amostras de temperatura
  {
    // ler porta analogica e faz a conversão matemática para amostra
    // legível de temperatura do LM35 e armazena resultado de conjunto de amostras.
    // 1024 é a profundidade de bits (quantização) do Arduino.
    // 5 é a voltagem fornecida ao LM35. 
    mAmostra[i] = (5 * analogRead(tempPin) * 100.0) / 1024.0;
          
    lcd.setCursor(1, 1);        // seta posição do cursor LCD
    lcd.print(" Temp: ");       // imprime no LCD
    lcd.setCursor(9, 1);        // seta posição do cursor LCD
    lcd.print(mAmostra[i]); // imprime amostra da temperatura atual no LCD
    lcd.print(" C");               // imprime caractere C

    mLeitura = analogRead(tempPin);  // ler porta analogica
    Serial.println(mLeitura);                 // imprime valor lido na porta analogica no Virtual Terminal 
    delay(500);                                      // aguarda 500ms
  }
}
 


sexta-feira, 4 de julho de 2014

Simulação no Proteus - Arduino e LCD Gráfico 128x64 KS0108


     Exemplo prático e bem simples de como escrever uma mensagem em um display LCD Gráfico 128x64 KS0108 utilizando a Biblioteca Gráfica GLCD v3 e o circuito para simulação no Proteus 7.10 - SP0.


Circuito

Demonstração


Arquivos

Download - Arquivos e Library da Simulação

Em edit properties do componente Arduino Uno R3, configure o Clock Frequence em 16MHz.

Em edit properties do componente LGM12641BS1R, configure o LCD Clock Frequency em 1200kHz. 

    Ligações no Proteus:

    LCD           Arduino
-------------------------------
   1  -  CS1           A0
   2  -  CS2           A1
   3  -  GND       GND
   4  -  VCC          +5
   5  -  VO             +5
   6  -  DI              A3
   7  -  R/W          A2
   8  -  E               A4
   9  -  DB0             8
 10  -  DB1             9
 11  -  DB2           10
 12  - DB3            11
 13  - DB4             4
 14  - DB5             5
 15  - DB6             6
 16  - DB7             7
 17  - RST           +5
 18  -

                                                                           *  *  *