Ir ao conteúdo

Posts recomendados

  • Membro VIP
Postado

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.

  • Membro VIP
Postado
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;
}

🙂

  • Membro VIP
Postado

Tenho uma dúvida: como fazer concatenação de duas variaveis int, como por exemplo:

int x = 45;

int y = 54;

CONCATENAR x e y:

z= 4554

  • 2 semanas depois...
  • Membro VIP
Postado

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

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...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!