RTC come aggiustare la data da un telecomando

nid69ita:
Ma ti posso dare una mano. Però devi imparare un minimo ad usare quella libreria. C’e’ anche un tutorial in italiano.
Io l’ho già fatto.

me lo studio per bene
Grazie molte
sarebbe da eliminare:
#include <buttons.h>

Si. Lo puoi eliminare.

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
#include <MENWIZ.h>
#include <IRremote.h>

const byte LED_PIN = 8;
const byte RECV_PIN = 6;
IRrecv irrecv(RECV_PIN);
decode_results results;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
boolean pin3=false;
menwiz tree;
int list,xsp=110;

void setup()
{ _menu *r,*s1,*s2;
  delay(1000);
  Serial.begin(9600);
  Serial.println("go!");
  pinMode(LED_PIN,OUTPUT);
  lcd.begin(16,2);                      // initialize the lcd 
  tree.begin(&lcd,16,2); //declare lcd object and screen size to menwiz lib
  tree.addUsrNav(&scanNavIR,6);
  //tree.addSplash("splash...",200);
  r=tree.addMenu(MW_ROOT,NULL,    F("-MENU-"));
    s1=tree.addMenu(MW_SUBMENU,r,F("Node1"));
      s2=tree.addMenu(MW_VAR,s1, F("Node3-opzioni"));
        s2->addVar(MW_LIST,&list);
        s2->addItem(MW_LIST, F("Option1"));
        s2->addItem(MW_LIST, F("Option2"));
        s2->addItem(MW_LIST, F("Option3"));
      s2=tree.addMenu(MW_VAR,s1, F("Node4-var"));
        s2->addVar(MW_AUTO_INT,&xsp,0,120,10);  
    s1=tree.addMenu(MW_VAR,r, F("Node2"));
  s1->addVar(MW_ACTION,myfunc);
  irrecv.enableIRIn(); //Avvia ricezione
}

int scanNavIR()
{ int ret=MW_BTNULL;
  if(irrecv.decode(&results))
  { Serial.println(results.value);
    if(results.decode_type==NEC)
    { RIPETI:
      switch(results.value)   // BLUESKY values
      { case 0xFFD02F: ret=MW_BTD; break;
        case 0xFF48B7: ret=MW_BTU; break;
        case 0xFF30CF: ret=MW_BTL; break;
        case 0xFF10EF: ret=MW_BTR; break;
        case 0xFFC837:
        case 0xFF50AF: ret=MW_BTC; break;
        case 0xFF40BF: ret=MW_BTE; break;
     } 
    }  
    irrecv.resume();
  }
  return ret;
}
  
void loop()
{ tree.draw();
}

void myfunc()
{ Serial.println("ACTION FIRED!");
  digitalWrite(LED_PIN,!digitalRead(LED_PIN));
}

nid69ita:

?R:

leo72:

llluca: RTC.adjust(DateTime(__DATE__, __TIME__));

DATE e TIME sono costanti predefinite che in fase di compilazione il compilatore sostituisce con l'attuale data e l'attuale orario del computer su cui stai facendo la compilazione.

beh se Leo dice così ha ragione lui, non so come faccia a prendere l'ora dal computer ma mi fido :grin: anzi mi studio come fa a farlo perchè è interessante ;)

però penso che per modificare la data e l'ora una volta staccato dal computer la funzione che ti ho dato io vada bene, prova..

Leggi bene, non vorrei avessi inteso male. Sono valori costanti. Data e ora del preciso momento in cui compili. Se compili alle 13:10:23 del 05/07/2013 il compilatore sostituisce DATE e TIME con questi valori costanti. Anche se resetti Arduino.

sisi ho capito, è comunque una cosa utile che non sapevo :)

@ER:
è come ha detto nid69.
Il compilatore gira su un computer, nel momento in cui compila il codice e vede DATE e TIME, non fa altro che prendere la data e l’ora di quell’istante e metterle nel codice. Ma è un istante congelato, nel senso che tutte le volte che dai alimentazione al circuito e l’RTC ha perso l’orario, verrà ripristinato l’orario della compilazione.
Succede che se compili ora alle 20:28 del 5/05/2013 e poi usi il circuito tra 10 anni, nel momento in cui darai l’alimentazione, vedrai l’orologio partire con un orario vecchio di 10 anni :wink:
E’ un sistema che viene usato per dare almeno un punto di partenza all’orologio.

leo72: @ER: è come ha detto nid69. Il compilatore gira su un computer, nel momento in cui compila il codice e vede DATE e TIME, non fa altro che prendere la data e l'ora di quell'istante e metterle nel codice. Ma è un istante congelato, nel senso che tutte le volte che dai alimentazione al circuito e l'RTC ha perso l'orario, verrà ripristinato l'orario della compilazione. Succede che se compili ora alle 20:28 del 5/05/2013 e poi usi il circuito tra 10 anni, nel momento in cui darai l'alimentazione, vedrai l'orologio partire con un orario vecchio di 10 anni ;) E' un sistema che viene usato per dare almeno un punto di partenza all'orologio.

si ok ho capito, grazie per le spiegazioni :) ci sono anche altre variabili del genere che si possono usare in fase di compilazione?

Conosco queste:
http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

leo72: Conosco queste: http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html

interessante! grazie! ;)

Mi pareva ce ne fossero altre specifiche di avr-cpp ma al momento non mi ricordo se e come le avevo trovate...

leo72: Succede che se compili ora alle 20:28 del 5/05/2013 e poi usi il circuito tra 10 anni, nel momento in cui darai l'alimentazione, vedrai l'orologio partire con un orario vecchio di 10 anni ;)

Per questa ragione cercavo un sistema alternativo per aggironare data e ora senza l'uso di un pc :)Pensa alla comodità di farlo via telecomando (innovativo) :)

Sul fatto che sia innovativo non so. Sul fatto che un qualunque orologio debba avere un metodo per aggiornare l'orario senza attaccare il computer è un bene nonché un obbligo ;)

llluca:

leo72:
Succede che se compili ora alle 20:28 del 5/05/2013 e poi usi il circuito tra 10 anni, nel momento in cui darai l’alimentazione, vedrai l’orologio partire con un orario vecchio di 10 anni :wink:

Per questa ragione cercavo un sistema alternativo per aggironare data e ora senza l’uso di un pc
:)Pensa alla comodità di farlo via telecomando (innovativo) :slight_smile:

Ti allego la mia versione di MENUWIZ.rar e LIQUIDCrystal.rar visto che con le tue hai problemi. Rinomina o fatti una copia delle tue.
Mi rammento ma non sono sicuro che la liquidcrystal è modificata rispetto a quella fornita con arduino. devi togliere la liquidcristal di arduino (sotto le sue librerie) e mettere questa sotto librerie dove hai gli sketch. Mi pare.
I miei include:

#include <Wire.h>
#include <LCD.h>
#include <LiquidCrystal_I2C.h>
#include <LiquidCrystal.h>
//#include <buttons.h>
#include <MENWIZ.h>
#include <IRremote.h>

MENWIZ.rar (758 KB)

LiquidCrystal.rar (436 KB)

Grazie mille XD Ora compila e funziona. Ho semplicemente aggiornato la libreria MENWIZ.h con quella che mi hai fornito tu. evidentemente ne avevo scaricata una vecchia.

Grazie ancora per il preziosissimo aiuto

Luca

ciao,
Ho preso un poco di confidenza con la libreria <MENWIZ.h>
Non è perfetto ma almeno fa + o - quello che richiedevo come soggetto della discussione:

tree.begin(&lcd,16,4); //declare lcd object and screen size to menwiz lib
  tree.addUsrNav(&scanNavIR,6);
  ///////////////////////////////
  //  MODIFICA MINUTI e  ORA     //
  //////////////////////////////
  r=tree.addMenu(MW_ROOT,NULL,    F("<-Orologio->"));
   
   s2=tree.addMenu(MW_SUBMENU,r,F(" cambia min/ora")); 
          //////ORE   
        s3=tree.addMenu(MW_VAR,s2,F(" modifica ora"));
          s3->addVar(MW_AUTO_INT,&h,0,23,1);     
              s3=tree.addMenu(MW_VAR,s2,F(" Aggiorna ora"));
                    s3->addVar(MW_ACTION,ModOra);
                        s3->setBehaviour(MW_ACTION_CONFIRM,false);
         /////Minuti
                   
            s3=tree.addMenu(MW_VAR,s2,F(" modifica minuti"));
                s3->addVar(MW_AUTO_INT,&m,0,59,1);     
             s3=tree.addMenu(MW_VAR,s2,F(" Aggiorna min"));
                  s3->addVar(MW_ACTION,ModMinuti);
            s3->setBehaviour(MW_ACTION_CONFIRM,false);
                    
            ////data
             s2=tree.addMenu(MW_SUBMENU,r,F(" modifica data")); 
                 s3=tree.addMenu(MW_VAR,s2,F(" modifica giorni"));
                      s3->addVar(MW_AUTO_INT,&g,0,31,1);     
                 s3=tree.addMenu(MW_VAR,s2,  F(" modifica mesi"));
                     s3->addVar(MW_AUTO_INT,&me,0,12,1);  
                 s3=tree.addMenu(MW_VAR,s2,F(" modifica anni"));
                       s3->addVar(MW_AUTO_INT,&a,13,50,1); 
                 s3=tree.addMenu(MW_VAR,s2,F(" Aggiorna Data"));
                      s3->addVar(MW_ACTION,ModData);
             s3->setBehaviour(MW_ACTION_CONFIRM,false);
     
        
  /////////////////////////////////////
  //  Visualizza ora e temperatura     //
  ////////////////////////////////////
    s1=tree.addMenu(MW_VAR,r, F(" ora attuale"));
  s1->addVar(MW_ACTION,ora);
    s1->setBehaviour(MW_ACTION_CONFIRM,false);
    s1=tree.addMenu(MW_VAR,r, F(" Temperatura"));
  s1->addVar(MW_ACTION,temp);
  s1->setBehaviour(MW_ACTION_CONFIRM,false);
  
   //////////////////////////////////////
  //  schermata iniziale e di default        //
  //////////////////////////////////////
  
  //  tree.addSplash("Questo orologio\n dotato di una\n   precisione\n    assoluta\n", 400);
  // tree.addUsrScreen(DataOraTemp,1000);

mentre per le funzioni per ora non ho trovato altro di + specifico:

//RTC.adjust(DateTime(now.year(),now.month(),now.day(),now.hour(),now.minute(),0));

void ModMinuti(){
 DateTime now = RTC.now();
  RTC.adjust(DateTime(a,me,d,now.hour(),now.minute(),0));
  
   lcd.setCursor(0,3);
      lcd.print("nuova data ");
     lcd.print(a);
     delay(8000);
}

void ModOra(){
   DateTime now = RTC.now();
   RTC.adjust(DateTime(now.year(),now.month(),now.day(),h,now.minute(),0));
   lcd.setCursor(0,3);
       lcd.print("ORA  ");
       lcd.print(h);
  delay(8000);
}

void ModData(){
 DateTime now = RTC.now();
   if (a ==0 ){ a = now.year();}
                else  {a = 2000+a; }
    if (me ==0 ){ me =now.month();}
    if (g ==0 ){ g = now.day();}
            RTC.adjust(DateTime(a,me,g,now.hour(),now.minute(),0));
 
      lcd.setCursor(0,3);
      lcd.print("data: ");
      lcd.print(g);
      lcd.print(' ');
      lcd.print(me);
     lcd.print(' ');
     lcd.print(a);
     delay(8000);
               }

Vi ringrazio e Attendo suggerimenti

Ciao ho avuto il tuo stesso problema nel mio progetto, principalmente per il fatto che devi far rimanere in “ascolto” arduino fin tanto che non ha finito di comporre, e l’unica soluzione che ho trovato è quella di fare un mio loop fino a quando non finisci l’inserimento dei dati tramite il telecomando e non clicchi “enter”, ti posto come ho risolto io l’aggiornamento del RTC

void setRTC(){
  SETHH=1;
  SETMI=0;
  SETSE=0;
  SETDD=0;
  SETMM=0;
  SETYY=0;
  SETRTC=0;
  do{
    if(SETHH == 1){
      lcd.clear();
      lcd.print("SET ORA: ");
      hour=Numero();
      if(hour>23){
        lcd.clear();
        lcd.print("ORA NON VALIDA");
        delay(2000);
      }
      else{
        ValoreTOT=invio(hour);
        if(ValoreTOT == 18){
          SETHH=0;
          SETMI=1;
          ValoreTOT=99;
        }   
      }
    }
    if(SETMI==1){
      lcd.clear();
      lcd.print("SET MINUTI: ");
      minute=Numero();
      if(minute>60){
        lcd.clear();
        lcd.print("VALORE NON VALIDO");
        delay(2000);
      }
      else{
        ValoreTOT=invio(minute);
        if(ValoreTOT == 18){
          SETMI=0;
          SETSE=1; 
          ValoreTOT=99;
        }

      }
    }
    if(SETSE==1){
      lcd.clear();
      lcd.print("SET SECONDI: ");
      second=Numero();
      if(second>60){
        lcd.clear();
        lcd.print("VALORE NON VALIDO");
        delay(2000);
      }
      else{
        ValoreTOT=invio(second);
        if(ValoreTOT == 18){
          SETSE=0;
          SETDD=1;
          ValoreTOT=99;
        }
      }
    }
    if(SETDD==1){
      lcd.clear();
      lcd.print("SET GIORNO: ");
      dayOfMonth=Numero();
      if(dayOfMonth>31){
        lcd.clear();
        lcd.print("VALORE NON VALIDO");
        delay(2000);
      }
      else{
        ValoreTOT=invio(dayOfMonth);
        if(ValoreTOT == 18){
          SETDD=0;
          SETMM=1;
          ValoreTOT=99;
        }
      }
    }
    if(SETMM==1){
      lcd.clear();
      lcd.print("SET MESE: ");
      month=Numero();
      if(month>12){
        lcd.clear();
        lcd.print("VALORE NON VALIDO");
        delay(2000);
      }
      else{
        ValoreTOT=invio(month);
        if(ValoreTOT == 18){
          SETMM=0;
          SETYY=1;
          ValoreTOT=99;
        }

      }
    }
    if(SETYY==1){
      lcd.clear();
      lcd.print("SET ANNO: ");
      year=Numero();
      if(year<12){
        lcd.clear();
        lcd.print("VALORE NON VALIDO");
        delay(2000);
      }
      else{
        ValoreTOT=invio(year);
        if(ValoreTOT == 18){
          SETYY=0;
          SETRTC=1;
        }
      }
    }
  }
  while (SETRTC==0);
  ValoreTOT=99;
  lcd.clear();
  lcd.print("L'ora e': ");
  lcd.print(hour);
  lcd.print(":");
  lcd.print(minute);
  lcd.print(":");
  lcd.print(second);
  lcd.setCursor(0, 1);
  lcd.print("La data e': ");
  lcd.print(dayOfMonth);
  lcd.print("/");
  lcd.print(month);
  lcd.print("/");
  lcd.print(year);
  delay(4000);
  if(SETRTC==1){
    SETRTC=0;
    setDateDs1307();
    lcd.clear();
    lcd.print("RTC aggiornato");
    delay(2000);
    ValoreTOT=99;
  }
}
byte Numero(){
  byte i=0;
  byte y=0;
  byte bingo;
  byte dato;
  ValoreTOT=99;
  String ConcatenaInput;
  do{
    if (irrecv.decode(&results)) {
      ValoreTOT=PdUno();
      bingo=ValoreTOT;
      lcd.print(bingo);
      regOra[i]=bingo;
      i++;
      if(i==2){
        for(y=0;y<=1;y++){
          ConcatenaInput.concat(regOra[y]);
        }
        dato=ConcatenaInput.toInt();
      }
    }

  }
  while(ValoreTOT != 18);
  return dato;
}

per il menu invece ho risolto in questo modo:

byte printmenutolcd(byte TastoMenu){
  char* puntomenu[]={
    "1-Reg. Orologio ", "2-Prog. Alba", "3-Prog. Tramonto", "4-Acc/Spe luce", "5-Acc/Spe luce N","6-Imp comp luce","7-Acc/Spe presa1", "8-Acc/Spe presa2", "9-Esci"    };
  byte i=0;
  while(TastoMenu==10){
    lcd.clear();
    lcd.print(puntomenu[i]);
    i++;
    delay(500);
    if (irrecv.decode(&results)) {
      TastoMenu=PdUno();
      break;
    }
    delay(1500);
    if(i>=9){
      i=0;
    }
  }
}
byte PdUno(){
  long trsma;
  byte RecVal;
  trsma=results.value;
  if (trsma<4294967295){
    RecVal = translateIR();
    delay(250);
  }
  irrecv.resume(); // Receive the next value
  return RecVal;
}

spero ti possa essere utile, ci ho perso un mare di tempo e sicuramente è ottimizzabile, se non ti è chiara qualcosa contattami pure anche in privato.