Componentes Eletronicos

Guia Completo do Shield Multi-funções para Arduino

Eletrogate 13 de junho de 201810 min

Detalhes dos Circuitos do Shield

Esse é um dos Shields (escudo) com um maior número de funções, que eu já encontrei. Muito útil para quem tem dificuldade em fazer montagens de circuitos eletrônicos com Arduino, pois já vem com vários circuitos montados e deve ser encaixado por cima do Arduino Uno. Portanto a alimentação do circuito também  já é realizada através dos pinos 5V e GND.

O Shield Multi-funções para Arduino tem um display de 7 segmentos (anodo comum) com 4 dígitos. Tem circuito com  4 leds, 4 botões, um Buzzer, um potenciômetro, 4 headers (conjunto de pinos)  para controle PWM, e mais outros dois conjuntos de soquetes – um para sensores de temperatura e outro para APC220.  Irei explicar o funcionamento e aplicação para cada um dos circuitos. O Botão de Reset serve para reiniciar o Arduino.

Foto Gustavo Murta

Circuitos do Shield Multi-funções :

Vermelho –  Display 7 segmentos com 4 dígitos

Cinza – Soquete APC220

Azul – Buzzer (campaínha)

Verde – 4 Leds indicadores

Marrom – Potenciômetro

Amarelo – Soquete para Sensores de  Temperatura

Laranja – 4 botões

Rosa – Header PWM

Observação Importante :  alguns pinos do display de 4 dígitos (na parte debaixo do shield) podem encostar no conector USB do Arduino Uno e fechar um curto-circuito. Sugiro que dobre o pino que encostar e isole com um pedaço de fita isolante por baixo do Shield.

Diagrama esquemático do Shield Multi-funções para Arduino :

Como não encontrei um diagrama bem feito na WEB, editei esse diagrama do Shield baseado nos que eu encontrei. Conferi todas as ligações e esta tudo correto. Abra a imagem em uma nova guia, para salvá-la em alta resolução.

Diagrama do Shield Multi-funções – editado por Gustavo Murta


Aplicação para Display 7 Segmentos

O circuito do Display usa um módulo com 4 dígitos ( 7 segmentos – anodo comum). Os segmentos são ativados através da multiplexação realizada pelos dois chips de Registradores de deslocamento (Shift registers) 74HC595.

Os bits são recebidos serialmente através do pino 14 (SER) do Chip U2. A porta digital D8 do Arduino envia esses bits. O sincronismo dos bits é feito através do clock do pino 11 (SRCLK), pela porta D7. O pino 12 (RCLK) é usado para armazenar os bits nos registradores – pino digital D4 do Arduino. A sequência dos bits é enviada de um chip 74HC595 para o outro através do pino 9 do U2 – QH’ .

Datasheet do 74HC595

Biblioteca MultiFunction Shield :

Para esse Shield Multi-funções existe uma Biblioteca que deve ser instalada na IDE do Arduino. Baixe-a no seu PC e faça a instalação adicionando a biblioteca Zipada.

MultiFuncShield-Library-1_2

– clique em SketchIncluir Biblioteca  e depois adicionar biblioteca.ZIP.

Depois da instalação, recarregue a Arduino IDE, senão a biblioteca não ficará ativa.

Essa biblioteca foi baixada desse site :

Hackatronics -Multi-function-shield

Uma outra Biblioteca que será também necessária é a TimerOne. Mas essa poderá instalar de outro modo. Clique em :

Sketch > Incluir Biblioteca > Gerenciar Bibliotecas 

Após abrir a janela do Gerenciador de Biblioteca, refine a busca digitando TimerOne. Na biblioteca  TimerOne, clique em More Info e depois em Instalar. Após alguns segundos, ela será automaticamente instalada. Lembre-se que o seu computador precisa estar conectado na internet, para poder baixar a biblioteca. Após a instalação da Biblioteca, é necessário que feche e abra novamente o programa  Arduino IDE.

Um exemplo bem interessante de Sketch para teste do display é esse, que foi copiado do mesmo site da Biblioteca Multi-funções.

/* Programa de teste do Display do Shield Multi-função
  Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino
  Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino
  Gustavo Murta   13/junho/2018
  Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/
*/

#include <TimerOne.h>                     // Bibliotec TimerOne 
#include <Wire.h>                         // Biblioteca Wire 
#include <MultiFuncShield.h>              // Biblioteca Multifunction shield

void setup()
{
  Timer1.initialize();                    // inicializa o Timer 1
  MFS.initialize(&Timer1);                // initializa a biblioteca Multi função

  MFS.write("Hi");                        // escreve no display Hi
  delay(2000);                            // atraso de 2 segundos
  MFS.write(-273);                        // escreve no display - 273
  delay(2000);                            // atraso de 2 segundos
  MFS.write(3.141, 2);                    // escreve no display 3.141
  delay(2000);                            // atraso de 2 segundos
}

int counter = 0;                          // incializa o conatdor
byte ended = false;                       // define variavel ended

void loop()
{
  if (counter < 200)                      // se o contador for menor do que 200
  {
    MFS.write((int)counter);              // escreve no display a contagem
    counter++;                            // incrementa o contador 
  }
  else if (!ended)                        // se aconatgem terminou 
  {
    ended = true;            
    MFS.write("End");                     // escreve no display End
    MFS.blinkDisplay(DIGIT_ALL, ON);      // pisca a ultima mensagem
  }
  delay(50);                              // atraso de 50 milisegundos 
}

Aplicações para Botões, LEDs e Buzzer

O circuito dos botões , LEDs e buzzer são muito simples . No caso dos 4 LEDs , estão conectados nas portas digitais de saída D13, D12, D11 e D10. Resistores de 1K ohm limitam a corrente nos LEDs.

Esse é um programa para teste dos Leds. Veja que na Biblioteca Multifunção , existem comandos para ligar, apagar e piscar os LEDs. Facilitam bastante o controle dos LEDs.

/* Programa de teste dos LEDs do Shield Multi-função
  Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino
  Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino
  Gustavo Murta   13/junho/2018
  Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/
*/

#include <TimerOne.h>                     // Bibliotec TimerOne 
#include <Wire.h>                         // Biblioteca Wire 
#include <MultiFuncShield.h>              // Biblioteca Multifunction shield

void setup()
{
  Timer1.initialize();                    // inicializa o Timer 1
  MFS.initialize(&Timer1);                // initializa a biblioteca Multi função
}

void loop()
{
  MFS.writeLeds(LED_ALL, ON);             // acende todos os LEDs
  delay(1000);                            // atraso de 1 segundo
  MFS.blinkLeds(LED_1, ON);               // pisca LED 1
  delay(1000);                            // atraso de 1 segundo
  MFS.blinkLeds(LED_2, ON);               // pisca LED 2
  delay(1000);                            // atraso de 1 segundo
  MFS.blinkLeds(LED_1 | LED_2, OFF);      // apaga LED 1 e 2
  MFS.blinkLeds(LED_3 | LED_4, ON);       // pisca LED 3 e 4
  delay(1000);                            // atraso de 1 segundo
  MFS.blinkLeds(LED_ALL, ON);             // pisca todos os LEDs
  delay(1000);                            // atraso de 1 segundo
  MFS.blinkLeds(LED_ALL, OFF);            // apaga o pisca dos LEDs
  MFS.writeLeds(LED_ALL, OFF);            // apaga o acender dos LEDs
  delay(1000);                            // atraso de 1 segundo
}

Esse é o circuito dos botões. Todos os  botões tem resistores de Pullup de 10K , isto é, o nível de tensão nas portas será de 5V (HIGH). Quando o botão for acionado, o nível de tensão será zero (LOW). O botão de RESET serve para reiniciar o programa no Arduino. Os botões SW1 , SW2 e SW3 estão conectados nas portas analógicas de entrada A1, A2 e A3, respectivamente.

Esse é o programa de teste dos Botões. Veja que o programa detecta se o botão foi pressionado rapidamente ou demoradamente. E detecta também se um ou mais botões foram pressionados ao mesmo tempo.

/* Programa de teste dos Botões do Shield Multi-função
  Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino
  Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino
  Gustavo Murta   13/junho/2018
  Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/
*/

#include <TimerOne.h>                     // Biblioteca TimerOne 
#include <Wire.h>                         // Biblioteca Wire 
#include <MultiFuncShield.h>              // Biblioteca Multifunction shield

void setup()
{
  Serial.begin(9600);                              // monitor serial 9600 Bps 
  Timer1.initialize();                             // inicializa o Timer 1
  MFS.initialize(&Timer1);                         // initializa a biblioteca Multi função
  Serial.println("Pressione um ou mais Botoes");   // imprime mensagem
}

void loop()
{
  byte btn = MFS.getButton();                            // lendo os botões

  if (btn)                                               // se botão pressionado 
  {
    byte buttonNumber = btn & B00111111;                 // comparando os bits das portas analógicas
    byte buttonAction = btn & B11000000;  

    Serial.print("BOTAO_");                              // imprime mensagem
    Serial.write(buttonNumber + '0');                    // imprime número do botão 
    Serial.print("_");                                   // imprime traço

    if (buttonAction == BUTTON_PRESSED_IND)              // compara a ação do botão 
    {
      Serial.println("PRESSIONADO");                     // imprime mensagem
    }
    else if (buttonAction == BUTTON_SHORT_RELEASE_IND)   // compara a ação do botão
    {
      Serial.println("SOLTA RAPIDO");                    // imprime mensagem
    }
    else if (buttonAction == BUTTON_LONG_PRESSED_IND)    // compara a ação do botão
    {
      Serial.println("PRESSIONADO LONGO");               // imprime mensagem
    }
    else if (buttonAction == BUTTON_LONG_RELEASE_IND)    // compara a ação do botão
    {
      Serial.println("SOLTA LONGO");                     // imprime mensagem
    }
  }
}

O circuito do Buzzer (campainha) é controlado por um transistor, para não sobrecarregar a corrente na porta digital do Arduino. Se a porta D3 estiver em HIGH, o transistor não aciona o Buzzer. Mas se a porta estiver em LOW, a campainha toca.

Esse é um programa de teste do Buzzer . Toca um bip curto e depois de um segundo, toca 4 sequencias de bips por três vezes consecutivas.  Programando a função MFS.beep, poderá criar inúmeras opções de bips. Bem legal.

/* Programa de teste do Buzzer do Shield Multi-função
  Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino
  Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino
  Gustavo Murta   13/junho/2018
  Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/
*/

#include <TimerOne.h>                     // Bibliotec TimerOne 
#include <Wire.h>                         // Biblioteca Wire 
#include <MultiFuncShield.h>              // Biblioteca Multifunction shield

void setup()
{
  Timer1.initialize();                    // inicializa o Timer 1
  MFS.initialize(&Timer1);                // initializa a biblioteca Multi função
  Buzzer ();                              // toca a campainha 
}

void Buzzer ()
{
  MFS.beep();                             // Bip curto de 300 milisegundos
  delay(1000);                            // atraso de 1 segundo

                                         // 4 bips curtos , repetidos 3 vezes
  MFS.beep(5, // bip por 50 milisegundos
           5, // silencio por 50 milisegundos
           4, // repete o bip 4 vezes
           3, // repete o loop 3 vezes
           50 // aguarda 500 milisegundos entre os loops
          );
}

void loop()
{
}

Aplicação para Potenciômetro

O pino central do Potenciômetro esta conectado na porta analógica A0 de entrada no Arduino. O capacitor de 0,1 micro Farads serve para limitar ruídos elétricos na leitura de tensão. A tensão no POT poderá variar entre +5V e 0V. Como o conversor ADC do Arduino tem 10 bits, os valores digitais serão de zero a 1023.

Esse é o programa de teste do Potenciômetro. O  legal é que o valor digital correspondente à tensão, será mostrado no display de 4 dígitos !  Gire a cabeça do parafuso do POT com uma pequena chave de fenda e o valor mostrado será entre zero e 1023.

/* Programa de teste do POT do Shield Multi-função
  Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino
  Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino
  Gustavo Murta   13/junho/2018
  Baseado em http://www.cohesivecomputing.co.uk/hackatronics/arduino-multi-function-shield/part-1/
*/

#include <TimerOne.h>                     // Bibliotec TimerOne 
#include <Wire.h>                         // Biblioteca Wire 
#include <MultiFuncShield.h>              // Biblioteca Multifunction shield

void setup()
{
  Timer1.initialize();                    // inicializa o Timer 1
  MFS.initialize(&Timer1);                // initializa a biblioteca Multi função
}


void loop()
{
  MFS.write(analogRead(POT_PIN));         // le a tensão no Potenciometro 
                                          // e mostra no display 
  delay(100);                             // atraso de 100 milisegundos 
}

Aplicação para Header PWM

Esse é o diagrama do Header PWM – conjunto de pinos. Todos pinos da esquerda (3) estão conectados ao terra (GND). Os pinos centrais (2) estão conectados aos 5V. E os pinos da direita (1) estão conectados nas portas digitais de saídas D5, D6 e D9 (podem ser usadas com PWM) e na porta de entrada analógica A5.  Não recomendo o uso direto dessas portas para controlar motor servo, pois poderão provocar excesso de corrente no regulador do Arduino. Se for usar servo motor, use uma fonte externa de 5V. Nessas portas poderá conectar uma grande variedade de dispositivos, desde que use cabos para conectá-los. Por exemplo, sensor infra-vermelho de presença, sensor Ultra-sônico, etc. Mas fique atento para o consumo de corrente – o regulador do Arduino suporta no máximo 1 ampere.

Como referência para estudos :

Sensor de presença com Arduíno

Sensor Ultra-sônico HC-SR04 com Arduino


Aplicação para Medição de Temperatura - Termômetro Digital

 Foto Gustavo Murta

Esse shield é bem versátil mesmo ! Dá para conectar facilmente um sensor de temperatura DS18B20. Um dos melhores sensores de temperatura do mercado, barato e bem preciso. Esse é o diagrama do soquete para sensores de temperatura. A parte chanfrada do DS18B20 deve estar virada para a frente. Mantenha o jumper J1 conectado.

Datasheet do sensor DS18B20

Esse é o programa para uso do sensor DS18B20. A temperatura do sensor é medida e mostrada no display de 4 dígitos. O valor da temperatura tem uma casa decimal, mas se quiser, poderá ter até duas casas. Para funcionar, instale essas duas bibliotecas – OneWire e DallasTemperature , usando o procedimento descrito acima :

Sketch > Incluir Biblioteca > Gerenciar Bibliotecas 

/* Programa de teste do DS18B20 no Shield Multi-função
  Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino
  Arduino UNO - IDE 1.8.5 - Shield Multi-função para Arduino
  Gustavo Murta   13/junho/2018
  Não remova o jumper J1 e verifique como inserir o DS18B20 no soquete
*/

#include <MultiFuncShield.h>                           // Biblioteca Multifunction shield
#include <OneWire.h>                                   // Biblioteca OneWire
#include <DallasTemperature.h>                         // Biblioteca do sensor DS18B20


#define ONE_WIRE_BUS A4                                // pino de dados DS18B20 = A4 do Arduino 
OneWire oneWire(ONE_WIRE_BUS);                         // criando a instancia do sensor
DallasTemperature sensors(&oneWire);

void setup()
{
  sensors.begin();                                     // inicializando o sensor 
  MFS.initialize(&Timer1);                             // inicializa a biblioteca Multi função
}
void loop()
{
  sensors.requestTemperatures();                       // envia o camando para o sensor 
  float tempCentigrade = sensors.getTempCByIndex(0);   // lê a temperatura no DS18B20 
  MFS.write(tempCentigrade, 1);                        // mostra a temperatura no display(1 casa decimal) 
  delay(200);                                          // atraso de 200 milisegundos 
}

Sugestão para outras implementações com o termômetro digital – crie um termostato com alarme. Por exemplo, ao exceder uma determinada temperatura, acione o buzzer ou um relé (módulo relé) através da portas digitais do header PWM.


Aplicação para Relógio Digital com Alarme

Uma outra aplicação bem interessante para o Shield, que eu encontrei no site da Hackatronics é do relógio Digital com alarme.  A contagem do tempo é realizada através dos timers internos do Arduino, por isso, nem tão precisa. Se necessita de precisão no relógio, sugiro que use um módulo RTC DS3231. Nesse caso terá que fazer adaptações no programa.

Para acertar as horas, pressione o botão 1 até piscar as horas. Pressione o botão 3 para avançar as horas. Pressione novamente o botão 1 para acertar os minutos. Para avançar os minutos, pressione o botão 3.  Após acerto do relógio, pressione novamente o botão 1.

Para acertar o alarme, pressione o botão 2  e botão 1 ao mesmo tempo. E repita o procedimento para acertar as horas e minutos. Para ativar ou desativar o alarme, pressione e segure o botão 3. Se alarme for ativado, o  led 1 ficará aceso.

Esse é o programa do Relógio Digital , com comentários traduzidos por mim.

/* Programa Relógio Digital com alarme para Shield Multi-funções
  Blog Eletrogate - https://blog.eletrogate.com/guia-completo-do-shield-multi-funcoes-para-arduino
  Arduino UNO - IDE 1.8.5 - Shield Multi-funções para Arduino
  Gustavo Murta   14/junho/2018
*/

#include <TimerOne.h>                                   // Biblioteca TimerOne
#include <Wire.h>                                       // Biblioteca Wire
#include <MultiFuncShield.h>                            // Biblioteca Multifunction shield

volatile unsigned int clockMilliSeconds = 0;            // variáveis do relógio
volatile byte clockSeconds = 0;                         // segundos
volatile byte clockMinutes = 0;                         // minutos
volatile byte clockHours = 12;                          // horas
volatile byte clockEnabled = 1;                         // relógio ativado

byte alarmMinutes = 30;                                 // alarm inicial 06:30 hs
byte alarmHours = 6;
volatile byte alarmEnabled = false;                     // alarme desligado

byte alarmTogglePressed = false;

enum displayModeValues                                  // modos de amostragem do relógio
{
  MODE_CLOCK_TIME,
  MODE_CLOCK_TIME_SET_HOUR,
  MODE_CLOCK_TIME_SET_MINUTE,
  MODE_ALARM_TIME,
  MODE_ALARM_TIME_SET_HOUR,
  MODE_ALARM_TIME_SET_MINUTE
};

byte displayMode = MODE_CLOCK_TIME;                     // modo normal do relógio

void setup()
{
  Timer1.initialize();                                  // inicializa timer 1
  MFS.userInterrupt = clockISR;                         // uso da interrupção para contagem de tempo
  MFS.initialize(&Timer1);                              // inicializa shield multi-funções
  MFS.blinkDisplay(DIGIT_ALL);                          // pisca os dígitos do display
}

void loop()
{
  byte btn = MFS.getButton();                           // verifica botão pressionado

  switch (displayMode)                                  // seleciona o modo do relógio
  {
    case MODE_CLOCK_TIME:                               // modo normal
      displayTime(clockHours, clockMinutes);            // mostra horas e minutos

      if (btn == BUTTON_2_PRESSED)                      // se o botão 2 foi pressionado
      {
        MFS.beep(0);                                    // cancela o bip
        displayMode = MODE_ALARM_TIME;                  // seleciona o modo de alarme
      }
      else if (btn == BUTTON_1_LONG_PRESSED)            // se o botão 1 também for pressionado longo
      {
        MFS.blinkDisplay(DIGIT_ALL, OFF);               // para de piscar todos os dígitos
        MFS.blinkDisplay(DIGIT_1 | DIGIT_2);            // pisca somente as horas
        displayMode = MODE_CLOCK_TIME_SET_HOUR;         // seleciona modo de acerto de horas
        clockEnabled = false;                           // contagem de tempo parada
        clockMilliSeconds = 0;                          // zera os contadores de milisegundos
        clockSeconds = 0;                               // zera os segundos
      }
      else if (btn == BUTTON_3_LONG_PRESSED && !alarmTogglePressed)  // se o botão 3 for pressionado
      {
        alarmTogglePressed = true;                      // liga o alarme
        alarmEnabled = !alarmEnabled;
        MFS.writeLeds(LED_1, alarmEnabled);             // acende o Led 1
      }
      else if (btn == BUTTON_3_LONG_RELEASE)            // soltando o botão 3
      {
        alarmTogglePressed = false;                     // alarme pressionado é falso
      }
      break;

    case MODE_CLOCK_TIME_SET_HOUR:                      // modo para acerto de horas
      if (btn == BUTTON_1_PRESSED)                      // se o botão 1 for pressionado
      {
        MFS.blinkDisplay(DIGIT_1 | DIGIT_2, OFF);       // para de piscar as horas
        MFS.blinkDisplay(DIGIT_3 | DIGIT_4);            // pisca os minutos
        displayMode = MODE_CLOCK_TIME_SET_MINUTE;       // modo para acerto de minutos
      }
      else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED) // se o botão 3 for pressionado
      {
        clockHours++;                                   // incrementa as horas
        if (clockHours >= 24)                           // se for mais de 24 horas
        {
          clockHours = 0;                               // zera as horas
        }
        displayTime(clockHours, clockMinutes);          // mostra horas e minutos
      }
      break;

    case MODE_CLOCK_TIME_SET_MINUTE:                    // modo para acerto de minutos
      if (btn == BUTTON_1_PRESSED)                      // se o botão 1 for pressionado
      {
        MFS.blinkDisplay(DIGIT_3 | DIGIT_4, OFF);       // para de piscar os minutos
        displayMode = MODE_CLOCK_TIME;                  // modo normal
        clockEnabled = true;                            // contagem de tempo iniciada
      }
      else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED) // se o botão 3 for pressionado
      {
        clockMinutes++;                                 // incrementa os minutos
        if (clockMinutes >= 60)                         // se for mais de 60 minutos
        {
          clockMinutes = 0;                             // zera os minutos
        }
        displayTime(clockHours, clockMinutes);          // mostra horas e minutos
      }
      break;

    case MODE_ALARM_TIME:                              // modo de acerto do alarme
      displayTime(alarmHours, alarmMinutes);           // mostra horas e minutos do alarme

      if (btn == BUTTON_2_SHORT_RELEASE || btn == BUTTON_2_LONG_RELEASE)  // se o botão 2 for pressionado
      {
        displayMode = MODE_CLOCK_TIME;                 // modo normal
      }
      else if (btn == BUTTON_1_LONG_PRESSED)           // se o botão 1 for pressionado longo
      {
        MFS.blinkDisplay(DIGIT_ALL, OFF);              // para de piscar todos os dígitos
        MFS.blinkDisplay(DIGIT_1 | DIGIT_2);           // pisca somente as horas
        displayMode = MODE_ALARM_TIME_SET_HOUR;        // modo acerto de horas do alarme
        alarmEnabled = false;                          // alarme desligado
      }
      break;

    case MODE_ALARM_TIME_SET_HOUR:                     // modo acerto de horas do alarme
      if (btn == BUTTON_1_PRESSED)                     // se o botão 1 for pressionado
      {
        MFS.blinkDisplay(DIGIT_1 | DIGIT_2, OFF);      // para de piscar todos os dígitos
        MFS.blinkDisplay(DIGIT_3 | DIGIT_4);           // pisca os minutos
        displayMode = MODE_ALARM_TIME_SET_MINUTE;      // modo acerto dos minutos do alarme
      }
      else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED)  // se o botão 3 for pressionado
      {
        alarmHours++;                                  // incrementa horas do alarme
        if (alarmHours >= 24)                          // se for mais de 24 horas
        {
          alarmHours = 0;                              // zera as horas
        }
        displayTime(alarmHours, alarmMinutes);         // mostra horas e minutos do alarme
      }
      break;

    case MODE_ALARM_TIME_SET_MINUTE:                   // modo acerto dos minutos do alarme
      if (btn == BUTTON_1_PRESSED)                     // se o botão 1 for pressionado
      {
        MFS.blinkDisplay(DIGIT_3 | DIGIT_4, OFF);      // para de piscar os minutos
        displayMode = MODE_CLOCK_TIME;                 // modo normal
        alarmEnabled = true;                           // alarme ligado
        MFS.writeLeds(LED_1, ON);                      // acende o Led 1
      }
      else if (btn == BUTTON_3_PRESSED || btn == BUTTON_3_LONG_PRESSED)  // se o botão 3 for pressionado
      {
        alarmMinutes++;                                // incrementa minutos do alarme
        if (alarmMinutes >= 60)                        // se for mais de 60 minutos
        {
          alarmMinutes = 0;                            // zera os minutos
        }
        displayTime(alarmHours, alarmMinutes);         // mostra horas e minutos do alarme
      }
      break;
  }
}

void displayTime (byte hours, byte minutes)           //  mostra relógio
{
  char time[5];                                       // vetor de 5 caracteres

  sprintf(time, "%03d", (hours * 100) + minutes);     // mostra horas e minutos
  MFS.write(time, 1);
}

void clockISR ()
{
  // Procedimento de contagem de tempo
  if (clockEnabled)
  {
    clockMilliSeconds++;
    if (clockMilliSeconds >= 1000)
    {
      clockMilliSeconds = 0;

      clockSeconds++;
      if (clockSeconds >= 60)
      {
        clockSeconds = 0;

        clockMinutes++;
        if (clockMinutes >= 60)
        {
          clockMinutes = 0;

          clockHours++;
          if (clockHours >= 24)
          {
            clockHours = 0;
          }
        }

        // se o horario do relógio coincide com o alarme, dispara o bip
        if (alarmEnabled && (clockMinutes == alarmMinutes) && (clockHours == alarmHours))
        {
          MFS.beep(
            10,        // 10 ms ON
            5,         // 5 ms OFF
            4,         // numero de repetições
            100,       // número de sequências
            50         // atraso entre as sequências
          );
        }
      }
    }
  }
}

Aplicação para Soquete APC220

Na placa do Shield Multi-Funções tem mais um soquete na parte superior do lado esquerdo. Esta escrito na placa, o nome de alguns módulos que podem ser usados nesse soquete :

  • Módulo APC220 (transceptor de comunicação por rádio),
  • Módulo Bluetooth,
  • Módulo de Reconhecimento de Voz.

Esse é o diagrama do Soquete APC220 :

Na WEB , podemos encontrar outras aplicações interessantes para o Shield Multi-funções :

Hackatronics/arduino-multi-function-shield/Part 2

Hackatronics/arduino-multi-function-shield/Part 3

Referências para o Shield Multi-funções:

Manual do Shield Multifuntion

Outra Biblioteca MF Shield

Hackatronics – Arduino Multi-function Shield

Conheça a Metodologia Eletrogate e ofereça aulas de robótica em sua escola!


Sobre o Autor


José Gustavo Abreu Murta

Consultor e Projetista de Sistemas Embarcados. Técnico em eletrônica, formado em Curso superior de TPD, pós-graduado em Marketing. Trabalhou por muitos anos na IBM na área de manutenção de computadores de grande porte. Aposentou-se, podendo curtir o que mais gosta : estudar e ensinar Tecnologia. Hobista em eletrônica desde 1976. Gosta muito de Fotografia e Observação de aves.


Eletrogate

13 de junho de 2018

A Eletrogate é uma loja virtual de componentes eletrônicos do Brasil e possui diversos produtos relacionados à Arduino, Automação, Robótica e Eletrônica em geral.

Tenha a Metodologia Eletrogate dentro da sua Escola! Conheça nosso Programa de Robótica nas Escolas!

Eletrogate Robô

Cadastre-se e fique por
dentro de novidades!