terça-feira, 6 de novembro de 2018

Menu para controle de tempo



Construir um sketch para piscar um led com um tempo determinado
O sketch deve conter 3 botões que permitam:

  • OK - entrar e sair do menu
  • INC - Aumenta o tempo de on/off da rotina para piscar o led
  • DEC - Diminui o  tempo de on/off da rotina para piscar o led

Funcionamento do sketch:

  • Ao iniciar o programa pisca o led
  • Se o botão OK for pressionado o programa para de piscar o led e entra em um menu para aumentar ou diminuir o tempo de on/off da rotina para piscar o led




  • Montar a simulação
  • Montar o hardware para apresentação da atividade



  


Exemplo - Menu

O exemplo mostrado no sketch abaixo pisca um led. 
Ao pressionar o botão OK o programa para de piscar o led e entra no menu
Dentro do menu ao pressionar o botão OK o programa sai do menu volta piscar o led


Fluxograma de funcionamento do skecth




Diagrama de ligação do exemplo



Código do sketch de exemplo do menu
  



/*
 *   Nome: menuTempo_0_0_0.ino
 *
 *  Menu de controle do tempo de piscar o led
 *
 *
 * Mostra no LCD o controle de tempo de piscar um LED
 *
 * O circuito:
 *  botão de pressão OK conectado ao pino 8 de GND
 *  Led indicativo conectado ao pino 11
 *  LCD 16 x 2 I2C – SDA/A4 SCL/A5
 *
 * Versão:
 * 0.0.0 -> Lê as entradas digitais A e B imprime o valor no LCD
 *          Botão - IDE ARDUINO - Exemplos\02.Digital\Button
 *          Criado em 2005 by DojoDave <http://www.0j0.org>
 *          Modificado em 30/08/2011 por Tom Igoe
 *          This example code is in the public domain.
 *          https://www.arduino.cc/en/Tutorial/BuiltInExamples/Button
 *          Arduino Pilger - LCD I2C https://pilger-arduino.blogspot.com/2018/11/blog-post_80.html
 *
 * Data: 19/10/2021
 * Luiz Oscar Ruschel Pilger
 */


// Inclui o código de biblioteca:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>

// apelidos
#define endereco 0x27 // endereços mais comum 0x27 para o CI Philips PCF8574T
//#define endereco 0x3F // endereços mais comum 0x3F para o CI Philips PCF8574AT
#define colunas 16
#define linhas 2
// entradas
#define btOk 8
// saidas
#define led 11

// criar a intância lcd
LiquidCrystal_I2C lcd(endereco, colunas, linhas); // Criando uma estrutura com o nome "lcd" nos parâmetros indicados

// variáveis globais
byte tempo = 1; // varivale para indicar o tempo em s
bool menu = 0;  // variável para indicar dentro (1) ou fora do menu (0)

void delayS (int segundos) {
  for (int i = 0; i < 100 * segundos; i++) {
    if (digitalRead(btOk) == 0) {   // testa o botão ok
      while (digitalRead(btOk) == 0); // espera soltar o botão ok
      menu = 1;                      // seta a variável menu para 1 para ter acesso ao menu
    }
    delay (10);
  }
}

void setup() {
  // GPIOs - inicializa os pinos digital OK E LED
  pinMode(btOk, INPUT_PULLUP);  // iniciliaza o pino 8 como entrada com resistor de pull up ativado
  pinMode(led, OUTPUT);  // iniciliaza o pino 11 como saída
  // LCD
  lcd.init();                 // Inicializando o LCD
  lcd.backlight();            // Ligando o BackLight do LCD
}

void loop() {
  atualizaLcd();
  piscaLed();
  // abre o menu
  while (menu == 1) {
    controleMenu();
  }
}

void atualizaLcd(void){
  lcd.setCursor(0, 0);    // posiciona na primeira coluna (0) e primeira linha (0)
  lcd.print("Led Pisca T=");           // imprime texto
  lcd.print(tempo, DEC);         // imprime a variável x no formato decimal
  lcd.print("s  ");                  // imprime texto
}

void piscaLed(void) {
  // pisca o led com o tempo especificado
  digitalWrite(led, HIGH);
  delayS(tempo);
  digitalWrite(led, LOW);
  delayS(tempo);
}

void controleMenu (void) {
  lcd.setCursor(0, 0);    // posiciona na primeira coluna (0) e primeira linha (0)
  lcd.print("Dentro Menu    ");           // imprime texto
  if (digitalRead(btOk) == 0) {   // testa o botão ok
    while (digitalRead(btOk) == 0); // espera soltar o botão ok
    menu = 0;                      // seta a variável menu para 0 para sair do menu
  }
}

  


Um comentário: