Ir ao conteúdo
  • Cadastre-se

Arduino Programar Dois botões: Um OK e o outro Selecionar


Posts recomendados

  • Membro VIP

Olá.

Estou programando Um RTC DS1307 com arduino UNO, para calcular a soma de datas. Veja o código que deu certo:

// Funções de data e hora usando um DS1307 RTC conectado via I2C e Wire lib
#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

char daysOfTheWeek[7][12] = {"Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"};

void setup () {
  while (!Serial); // para Leonardo / Micro / Zero

  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Não foi possível encontrar o RTC!  Verifique a conexão I2C.");
    while (1);
  }
 

  if (! rtc.isrunning()) {
    Serial.println("O RTC NÃO está sendo executado! Verifique a conexão da alimentação.");
    // a linha a seguir define o RTC para a data e hora em que este esboço foi compilado
     //rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    
    // Esta linha define o RTC com uma data e hora explícitas, por exemplo, para definir
    
    // 21 de janeiro de 2014 às 03:00, você chamaria:
    //rtc.adjust(DateTime(2020, 7, 14, 14, 27, 0)); 
  }
}

void loop () {
       
       mostraData(); 
       mostraDiaSemana();
       mostraHorario();
       calculoSeg1970();
       calculoFuturo(2, 1, 5, 10);//dia, hora, minuto, segundo
        
    delay(6000);
}

void mostraData(){
  DateTime now = rtc.now();
    Serial.print(now.day(), DEC);   // Dia
    Serial.print('/');              // BARRA
    Serial.print(now.month(), DEC); // Mês
    Serial.print('/');              // BARRA
    Serial.println(now.year(), DEC);  // Ano
}

void mostraDiaSemana(){
  DateTime now = rtc.now();
    Serial.println(daysOfTheWeek[now.dayOfTheWeek()]);
    
}

void mostraHorario(){
  DateTime now = rtc.now();
    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();
}

void calculoSeg1970(){
  DateTime now = rtc.now();
  // Calculo Segundos e Dias desde 1/1/1970 
    Serial.print("Desde meia-noite de 1/1/1970 = ");
    Serial.print(now.unixtime());
    Serial.print(" segundos = ");
    Serial.print(now.unixtime() / 86400L);
    Serial.println(" dias");
}

void calculoFuturo(int Ndia, int Nhora, int Nminuto, int Nsegundo){
 
  DateTime now = rtc.now();
  // calcular uma data que é de 7 dias e 30 segundos no futuro 
    DateTime future (now + TimeSpan(Ndia,Nhora,Nminuto,Nsegundo));
    
    Serial.print("Agora + ");
    Serial.print(Ndia);
    Serial.print(" dias + ");
    Serial.print(Nhora);
    Serial.print(" horas + ");
    Serial.print(Nminuto);
    Serial.print(" minutos + ");
    Serial.print(Nsegundo);
    Serial.print(" segundos: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
}

Agora, quero implementar ao código, especificamente na ultima função calculoFuturo:

void calculoFuturo(int Ndia, int Nhora, int Nminuto, int Nsegundo){
 
  DateTime now = rtc.now();
  // calcular uma data no formato dia, hora, minuto e segundo 
    DateTime future (now + TimeSpan(Ndia,Nhora,Nminuto,Nsegundo));
    
    Serial.print("Agora + ");
    Serial.print(Ndia);
    Serial.print(" dias + ");
    Serial.print(Nhora);
    Serial.print(" horas + ");
    Serial.print(Nminuto);
    Serial.print(" minutos + ");
    Serial.print(Nsegundo);
    Serial.print(" segundos: ");
    Serial.print(future.year(), DEC);
    Serial.print('/');
    Serial.print(future.month(), DEC);
    Serial.print('/');
    Serial.print(future.day(), DEC);
    Serial.print(' ');
    Serial.print(future.hour(), DEC);
    Serial.print(':');
    Serial.print(future.minute(), DEC);
    Serial.print(':');
    Serial.print(future.second(), DEC);
    Serial.println();
    
    Serial.println();
}

Quero que, quando um botão( 'botao seleciona'') for clicado, vá inclementando de 0 a 9 para que quando o valor desejado estiver correto, com outro botão('botao OK') o arduino mande este número para a variavel, por exemplo, Ndia. Tambem queria com um terceiro botão para selecionar se quero uma destas variaveis: Ndia,Nhora,Nminuto,Nsegundo. Estero que tenham compreendido. Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
12 horas atrás, Michel da Silva Galvão disse:

um botão( 'botao seleciona'') for clicado, vá inclementando de 0 a 9 para que quando o valor desejado estiver correto, com outro botão('botao OK') o arduino mande este número para a variavel, por exemplo, Ndia

Um pseudo código minimalista pra você se inspirar

while(!botao OK)
{
if(botao seleciona) Ndia++; if (Ndia>9) Ndia=0;
}

🙂

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...
  • Membro VIP

Olá Pessoal,

Desculpem-me pela demora, pois estava com problemas na internet. Eu fiz um Sistema de Menu para LCD, que é adaptável para cada projeto. Este Menu já possui três telas:

·         Tela Inicial: mostrada quando é iniciado o LCD;

·         Tela de Data e Hora: mostra a Data e a Hora;

·         Tela de Ajuste: nesta tela é possível ajustar cada parâmetro individualmente: ano, mês, dia, hora, minuto, segundo.

Hardware:

O hardware é composto por quatro botões com pull_up interno, declarado pela programação, um LCD 16x2 com módul conversor I2C integrado, e o próprio Arduino UNO.

Os botões são:

·         Botão MENU: Tem a função de quando em outra tela, voltar para a principal.

·         Botão +: Tem a função de incrementar ++.

·         Botão -: Tem a função de incrementar --.

·         Botão OK: Tem a função de confirmar alguma tela, ou configuração selecionada.

 

Software:

#include <Wire.h>
#include "RTClib.h"

RTC_DS1307 rtc;

void  inicio();
void opcao1();
void opcao2();
void opcao3();
void anos1();
void meses1();
void dias1();
void horas1();
void minutos1();
void segundos1();
void ajusteFinal();
void executar();



int anos, meses, dias, horas, minutos, segundos = 0;


char daysOfTheWeek[7][12] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
#include <LiquidCrystal_I2C.h>

/*
  Menu simples para modificacao de acordo com sua necessidade
  Alterer os pinos como quiser e a quantidade de menus, basta adaptar ao seu projeto
*/

LiquidCrystal_I2C lcd(0x27,16,2);

const int botaoMenu = 10;     // Pino Botão Menu
const int botaoMais = 9;     // Pino Botão Aumenta
const int botaoMenos = 11;    // Pino Botão Diminui
const int botaoOK    = 12; 

int guardaValor = 0;
int i = 0;


int b = 0;
int c=0;
int d=0;
int e=0;
int f=0;
int g=0;
int h=0;
int j=0;



int contador = 0;  // essa variavel vai controlar o loop do menu andando por ele opcões 0->1->2->3->0
int subContador = 0;  // essa variavel vai controlar o loop do menu andando por ele opcões 0->1->2->3->0
int quantMenu = 3; // define quantas opções vão ter no menu



// VOID SETUP
void setup(){


  lcd.init();                      
     lcd.backlight();
  pinMode(botaoMenu, INPUT_PULLUP); 
  pinMode(botaoMais, INPUT_PULLUP); 
  pinMode(botaoMenos, INPUT_PULLUP); 
  pinMode(botaoOK, INPUT_PULLUP);
  Serial.begin(57600);
  if (! rtc.begin()) {
    Serial.println("Couldn't find RTC");
    while (1);
  }

  if (! rtc.isrunning()) {
    lcd.setCursor(0,0);
    lcd.print("RTC is NOT running!");
    delay(2000);
    opcao3();
    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
    // This line sets the RTC with an explicit date & time, for example to set
    // January 21, 2014 at 3am you would call:
    // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  }
  
  
}
void loop(){
  
  executar();
 
}

void inicio(){
  guardaValor=2;

    lcd.setCursor(0,0);
    lcd.print("Relogio Arduino ");
    lcd.setCursor(0,1);
    lcd.print("Pressione + ou -");
}
void opcao1(){
  lcd.setCursor(0,0);
    lcd.print("Acionando       ");
    lcd.setCursor(0,1);
    lcd.print("Pressione OK    ");
  guardaValor=3;
  
    //delay(520);
    if(digitalRead(botaoOK) == LOW){
      
      
    
  
  i=true;
while(i)
  {
  DateTime now = rtc.now();
   lcd.clear();
   lcd.setCursor(0,0);
  lcd.print(now.year(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.day(), DEC);
    lcd.setCursor(0,1);
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC);
    lcd.print(':');
    lcd.print(now.second(), DEC);
    delay(1000);
    if(digitalRead(botaoMenu) == LOW){
      Serial.print("sair do while");
      
      i=false;
      lcd.clear();
      //contador = 0;
      
    
  }
  }
}  
}
void opcao2(){
  lcd.setCursor(0,0);
    lcd.print("Ajuste          ");
    lcd.setCursor(0,1);
    lcd.print("Pressione OK    ");
    guardaValor = 4;
    
     
      
      
    delay(150);
    
  if(digitalRead(botaoOK) == LOW){
 b=true;
 botaoOK==HIGH;
 delay(150);
 
while(b)
  {
lcd.setCursor(0,0);
lcd.print("Botao OK Seguir ");
lcd.setCursor(0,1);
lcd.print("Botao Menu Sair ");
    if (digitalRead(botaoOK) == LOW) {     
  delay(250); 
  guardaValor = 1; 

      
      anos1();//esta função chama todas as outras
     
  }
   if (digitalRead(botaoMenu) == LOW) {     
  delay(250); 
  guardaValor = 1; 

      
     b=false;
     
  }
  // Fim di Switch
  
  
  
 }
 }
 }
void opcao3(){
  lcd.setCursor(0,0);
    lcd.print("opcao3");
    lcd.setCursor(0,1);
    lcd.print("opcao3");
}
void anos1(){
  c=true;
  while(c){
  lcd.setCursor(0,0);
   lcd.print("Anos:           ");
   lcd.setCursor(0,1);
   lcd.print(anos);
   lcd.print("            ");
  if(digitalRead(botaoMais) == LOW){
    delay(250);
    anos++;
    if(anos > 2099) {
      anos = 2015;
    }
   
  }
  if(digitalRead(botaoOK) == LOW){
    delay(150);
    c=false;
    meses1();
   
    
    
  }
  }
}
void meses1(){
  d=true;
  while(d){
  lcd.setCursor(0,0);
   lcd.print("Meses:          ");
   lcd.setCursor(0,1);
   lcd.print(meses);
   lcd.print("              ");
  if(digitalRead(botaoMais) == LOW){
    delay(250);
    meses++;
    if(meses > 12) {
      meses = 0;
    }
   
  }
  if(digitalRead(botaoOK) == LOW){
     delay(250);
    d=false;
    dias1();
  }
  }
}
void dias1(){
  e=true;
  while(e){
    
    lcd.setCursor(0,0);
   lcd.print("Dias:           ");
   lcd.setCursor(0,1);
   lcd.print(dias);
   lcd.print("              ");
  if(digitalRead(botaoMais) == LOW){
    delay(150);
    dias++;
    if(dias > 31) {
      dias = 1;
    }
   
  }
  if(digitalRead(botaoOK) == LOW){
     delay(150);
    e=false;
    horas1();
  }
}}
void horas1(){
  f=true;
  while(f){
    
    lcd.setCursor(0,0);
   lcd.print("Horas:          ");
   lcd.setCursor(0,1);
   lcd.print(horas);
   lcd.print("              ");
  if(digitalRead(botaoMais) == LOW){
    delay(150);
    horas++;
    if(horas > 23) {
      horas = 0;
    }
   
  }
  if(digitalRead(botaoOK) == LOW){
     delay(150);
    f=false;
    minutos1();
}
}}
void minutos1(){
 g=true;
 while(g){
  
  lcd.setCursor(0,0);
   lcd.print("Minutos:        ");
   lcd.setCursor(0,1);
   lcd.print(minutos);
   lcd.print("              ");
 if(digitalRead(botaoMais) == LOW){
    delay(150);
    minutos++;
    if(minutos > 59) {
      minutos = 0;
    }
   
  }
  if(digitalRead(botaoOK) == LOW){
     delay(150);
    g=false;
    segundos1();
}
}}
void segundos1(){
  h=true;
  while(h){
    
     lcd.setCursor(0,0);
   lcd.print("Segundos:       ");
   lcd.setCursor(0,1);
   lcd.print(segundos);
   lcd.print("              ");
  if(digitalRead(botaoMais) == LOW){
    delay(150);
    segundos++;
    if(segundos > 59) {
      segundos = 0;
    }
  
  }
  if(digitalRead(botaoOK) == LOW){
     delay(150);
    h=false;
    ajusteFinal();
}
}}
void ajusteFinal(){
  j=true;
  while(j){
  if(digitalRead(botaoOK) == LOW){
   delay(150);
  DateTime now = rtc.now();
  rtc.adjust(DateTime(anos, meses, dias, horas, minutos, segundos));
   lcd.setCursor(0,0);
  lcd.print("Hora ajustada!  ");
   delay(500);
    
     
    j=false;
    b=false;
      //executar();
     // contador=0;
      
    } 
       
  }
 
  }
void executar(){
  DateTime now = rtc.now();
  anos = (now.year());
meses= (now.month());
dias= (now.day());
horas= (now.hour());
minutos= (now.minute());
segundos = (now.second());
   // aqui controla a opcão do menu cada vez que for apertado o botao menu é acrescentado +1 na variavel fazendo switch abaixo percorrer as opções
  if (digitalRead(botaoMais) == LOW) {     
  delay(250); 
  guardaValor = 1; 
   contador=contador+1;
  } 
  if (contador>quantMenu){ // se a quantidade for maior que o selecionado na variavel, ele volta ao 0
  contador=0;
  }
 if (digitalRead(botaoMenos) == LOW) {     
  delay(250); 
  guardaValor = 1; 
   contador=contador-1;
  } 
  if (contador<0){ // se a quantidade for maior que o selecionado na variavel, ele volta ao 0
  contador=quantMenu;
  }
  // switch de opções para controle do manu
  switch(contador){ 
    case 0:
      inicio();
      break;
    case 1:
      opcao1();
      break;
    case 2:
      opcao2();
      break;
    case 3:
      opcao3();
      break;
  }
  // Fim di Switch
  delay(250);
}

O código está um pouco bagunçado e sem muitos comentários. 

 

Este skecht é para ajuste de hora e data por hardware.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

Ebook grátis: Aprenda a ler resistores e capacitores!

EBOOK GRÁTIS!

CLIQUE AQUI E BAIXE AGORA MESMO!