[RISOLTO]Settare RTC manualmente.

Salve, sono riuscito a settare tutto tranne questa <now.dayOfTheWeek>cioè il giorno .

[code]
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3F, 20, 4); // Display  I2C 16 x 2
RTC_DS1307 RTC;
int P1 = 5; // Button SET MENU'
int P2 = 6; // Button +
int P3 = 7; // Button -
char daysOfTheWeek[7][12] = {"DOM", "LUN", "MAR", "MER", "GIO", "VEN", "SAB"};

int hourupg;
int minupg;
int yearupg;
int monthupg;
int dayupg;
int gio;
int menu = 0;
void setup()
{

  lcd.init();
  lcd.backlight();
  lcd.clear();
  pinMode(P1, INPUT_PULLUP);
  pinMode(P2, INPUT_PULLUP);
  pinMode(P3, INPUT_PULLUP);
  Serial.begin(9600);
  Wire.begin();
  RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // Set the date and time at compile time
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  //RTC.adjust(DateTime(__DATE__, __TIME__)); //removing "//" to adjust the time
  int menu = 0;
}

void loop()
{

  if (digitalRead(P1) == LOW)
  {
    menu = menu + 1;
  }
  if (menu == 0)
  {
    DisplayDateTime(); 

  }
  if (menu == 1)
  {
    DisplaySetHour();
  }
  if (menu == 2)
  {
    DisplaySetMinute();
  }
  if (menu == 3)
  {
    DisplaySetYear();
  }
  if (menu == 4)
  {
    DisplaySetMonth();
  }
  if (menu == 5)
  {
    DisplaySetDay();
  }
  if (menu == 6)
  {
    Display_gio();
  }
  if (menu == 7)
  {
    StoreAgg();
    delay(500);
    menu = 0;
  }
  delay(100);
}

void DisplayDateTime ()
{
  DateTime now = RTC.now();

  lcd.setCursor(0, 1);
  lcd.print("Hour:");
  if (now.hour() <= 9)
  {
    lcd.print("0");
  }
  lcd.print(now.hour(), DEC);
  hourupg = now.hour();
  lcd.print(":");
  if (now.minute() <= 9)
  {
    lcd.print("0");
  }
  lcd.print(now.minute(), DEC);
  minupg = now.minute();
  lcd.print(":");
  if (now.second() <= 9)
  {
    lcd.print("0");
  }
  lcd.print(now.second(), DEC);

  lcd.setCursor(0, 0);
  lcd.print("Date: ");
  if (now.day() <= 9)
  {
    lcd.print("0");
  }
  lcd.print(now.day(), DEC);
  dayupg = now.day();
  lcd.print("/");
  if (now.month() <= 9)
  {
    lcd.print("0");
  }
  lcd.print(now.month(), DEC);
  monthupg = now.month();
  lcd.print("/");
  lcd.print(now.year(), DEC);
  yearupg = now.year();
  lcd.setCursor(2, 3);
  lcd.print("DAY   ");
  lcd.print(" ");
  lcd.print(daysOfTheWeek[now.dayOfTheWeek()]);//?
 
}
void DisplaySetHour()
{
  // time setting
  lcd.clear();
  DateTime now = RTC.now();
  if (digitalRead(P2) == LOW)
  {
    if (hourupg == 23)
    {
      hourupg = 0;
    }
    else
    {
      hourupg = hourupg + 1;
    }
  }
  if (digitalRead(P3) == LOW)
  {
    if (hourupg == 0)
    {
      hourupg = 23;
    }
    else
    {
      hourupg = hourupg - 1;
    }
  }
  lcd.setCursor(0, 0);
  lcd.print("Set time:");
  lcd.setCursor(0, 1);
  lcd.print(hourupg, DEC);
  delay(200);
}

void DisplaySetMinute()
{
  // Setting the minutes
  lcd.clear();
  if (digitalRead(P2) == LOW)
  {
    if (minupg == 59)
    {
      minupg = 0;
    }
    else
    {
      minupg = minupg + 1;
    }
  }
  if (digitalRead(P3) == LOW)
  {
    if (minupg == 0)
    {
      minupg = 59;
    }
    else
    {
      minupg = minupg - 1;
    }
  }
  lcd.setCursor(0, 0);
  lcd.print("Set Minutes:");
  lcd.setCursor(0, 1);
  lcd.print(minupg, DEC);
  delay(200);
}

void DisplaySetYear()
{
  // setting the year
  lcd.clear();
  if (digitalRead(P2) == LOW)
  {
    yearupg = yearupg + 1;
  }
  if (digitalRead(P3) == LOW)
  {
    yearupg = yearupg - 1;
  }
  lcd.setCursor(0, 0);
  lcd.print("Set Year:");
  lcd.setCursor(0, 1);
  lcd.print(yearupg, DEC);
  delay(200);
}

void DisplaySetMonth()
{
  // Setting the month
  lcd.clear();
  if (digitalRead(P2) == LOW)
  {
    if (monthupg == 12)
    {
      monthupg = 1;
    }
    else
    {
      monthupg = monthupg + 1;
    }
  }
  if (digitalRead(P3) == LOW)
  {
    if (monthupg == 1)
    {
      monthupg = 12;
    }
    else
    {
      monthupg = monthupg - 1;
    }
  }
  lcd.setCursor(0, 0);
  lcd.print("Set Month:");
  lcd.setCursor(0, 1);
  lcd.print(monthupg, DEC);
  delay(200);
}

void DisplaySetDay()
{
  // Setting the day
  lcd.clear();
  if (digitalRead(P2) == LOW)
  {
    if (dayupg == 31)
    {
      dayupg = 1;
    }
    else
    {
      dayupg = dayupg + 1;
    }
  }
  if (digitalRead(P3) == LOW)
  {
    if (dayupg == 1)
    {
      dayupg = 31;
    }
    else
    {
      dayupg = dayupg - 1;
    }
  }
  lcd.setCursor(0, 0);
  lcd.print("Set Day:");
  lcd.setCursor(0, 1);
  lcd.print(dayupg, DEC);
  delay(200);
}
void Display_gio() {
  lcd.clear();
  if (digitalRead(P2) == LOW)
  {
    if (gio == 7)
    {
      gio = 1;
    }
    else
    {
      gio = gio + 1;
    }
  }
  if (digitalRead(P3) == LOW)
  {
    if (gio == 1)
    {
      gio = 7;
    }
    else
    {
      gio = gio - 1;
    }
  }
  lcd.setCursor(0, 0);
  lcd.print("Set gio:");
  lcd.setCursor(0, 1);
  lcd.print(gio, DEC);
  delay(200);
}
void StoreAgg()
{
  // Variable saving
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("SAVING IN");
  lcd.setCursor(0, 1);
  lcd.print("PROGRESS");
  RTC.adjust(DateTime(yearupg, monthupg, dayupg, hourupg, minupg, 0));
  delay(200);
}

[/code]

Non serve settarlo l'RTC deriva il giorno della settimana partendo dalla data

fabpolli:
Non serve settarlo l'RTC deriva il giorno della settimana partendo dalla data

Se vorrei cambiare ?

Scusa funziona come dicevi tu cambiando il numero del giorno cambia anche la scritta.
Grazie.

[quote author=wingamesyun link=msg=4611489 date=1590074372]
char daysOfTheWeek[7][12] = {"DOM", "LUN", "MAR", "MER", "GIO", "VEN", "SAB"};
[/quote]
Una nota: inutile definire 12 byte per ogni elemento quando tu ne usi sempre solo 4 (dato che usi il formato abbreviato di 3 caratteri, più il terminaotre di stringa), impostalo come "daysOfTheWeek[7][4]" che sono solo 28 byte invece di 82 della preziosa RAM. E' sempre bene evitare di sprecare spazio di memoria, tanto più se non ne userai mai tanta. Cosa analoga per la altre variabili "int" che potresti definire "byte" se contengono solo valori positivi minori di 255, ad esempio:
[code]byte hourupg;
byte minupg;
byte monthupg;
byte dayupg;
byte menu = 0;

Poi altre due cose, che spero ti possano essere utili a migliorare "stilisticamente" il programma, ma soprattutto per renderlo più leggibile anche per te.

Intanto abituati da subito a mettere sempre qualche commento. Non tanto per programmi piccoli come questo, ma ti tornerà molto utile quando farai programmi più estesi, non solo per renderli più comprensibili anche a chi li mostrerai (noi;)) ma soprattutto per te: se riprendi un progetto di un anno prima ricorderai esattamente lo scopo di ogni blocco di codice?
Poi per il menu ma in generale tutti i punti in cui hai più di 2 o 3 if con la stessa variabile, invece di tutte quelle if() usa lo switch().
Poi quando devi mostrare valori numerici a 2 cifre come l'ora, oltre ad essere inutile specificare "DEC" (è il formato predefinito), invece di mettere tutti quegli if() crea una tua funzione e poi usala, ad esempio una lcdprint() alla quale passare la stringa che precede il valore, e poi il valore.
Vedi come diventa tutto più chiaro e semplice:

...
void loop()
{
  // Pulsante selezione
  if (digitalRead(P1) == LOW) {
    ++menu;
    // Attendo il rilascio del pulsante
    while ( digitalRead(P1) == LOW ) delay(50);
  }

  // MENU
  switch (menu) {
  case 0:
    DisplayDateTime(); 
    break;
  case  1:
    DisplaySetHour();
    break;
  case  2:
    DisplaySetMinute();
    break;
  case  3:
    DisplaySetYear();
    break;
  case  4:
    DisplaySetMonth();
    break;
  case  5:
    DisplaySetDay();
    break;
  case  6:
    Display_gio();
    break;
  case  7:
    StoreAgg();
    delay(500);
    menu = 0;
    break;
  }
  delay(100);
}

void DisplayDateTime ()
{
  DateTime now = RTC.now();
  hourupg = now.hour();
  minupg = now.minute();

  lcd.setCursor(0, 1);
  lcdprint("Hour:", now.hour());
  lcdprint(":". now.minute());
  lcdprint(":", now.second());
...
}

void lcdprint(char *label, byte valore) {
  if ( label[0] > 0 ) lcd.print(label);
  if ( valore < 10 ) lcd.print("0");
  lcd.print(valore);
}

PS: ti ho anche modificato la lettura del pulsante per il cambio menu perché altrimenti tenendo premuto il pulsante avresti cambiato menu 10 volte al secondo :wink: ).

Grazie sempre per tutti consigli ,
nello sketch completo ho usato lo switch ,devo solo modificare le variabili.