Aiuto 'traduzione' codice

Ciao a tutti, in questi giorni sono riuscito a recuperare in internet del codice che mi servirà per una sorta di datalogger. Funziona tutto, solo che gran parte del codice l’ho preso ‘alla cieca’. Chiedevo quindi se qualcuno ha tanta pazienza per farmi capire cosa queste funzioni fanno. Giusto per comprendere cosa sto facendo e non andare sempre a chiedere e cercare in giro.

Grazie mille in anticipo!

byte decToBcd(byte val)
{
  return ( (val/10*16) + (val%10) );
}
// Conversione decimale binario a normali numeri decimali
byte bcdToDec(byte val)
{
  return ( (val/16*10) + (val%16) );
}
/* 
 1) Imposta la data e l'ora del DS1307
 2) Avvia l'orologio
 3) Imposta la modalità di ora in orologio a 24 ore
 */
void setDateDs1307(byte second, // 0-59
byte minute, // 0-59
byte hour, // 1-23
byte dayOfWeek, // 1-7
byte dayOfMonth, // 1-28/29/30/31
byte month, // 1-12
byte year) // 0-99
{
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.write(decToBcd(second)); // 0 to bit 7 avvia l'orologio
  Wire.write(decToBcd(minute));
  Wire.write(decToBcd(hour));
  Wire.write(decToBcd(dayOfWeek));
  Wire.write(decToBcd(dayOfMonth));
  Wire.write(decToBcd(month));
  Wire.write(decToBcd(year));
  Wire.write(0x10); // invia 0x10 (hex) 00010000 (binario) al registro di controllo - si attiva ad onda quadra
  Wire.endTransmission();
}
// Ottiene la data e l'ora dal DS1307
void getDateDs1307(byte *second,
byte *minute,
byte *hour,
byte *dayOfWeek,
byte *dayOfMonth,
byte *month,
byte *year)
{
  // Ripristina il puntatore del registro
  Wire.beginTransmission(DS1307_I2C_ADDRESS);
  Wire.write(0);
  Wire.endTransmission();
  Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
  // Alcuni di questi sono necessari, perché le maschere di alcuni bit sono bit di controllo
  *second = bcdToDec(Wire.read() & 0x7f);
  *minute = bcdToDec(Wire.read());
  *hour = bcdToDec(Wire.read() & 0x3f); // Occorre modificare questo se 12 ore am/pm
  *dayOfWeek = bcdToDec(Wire.read());
  *dayOfMonth = bcdToDec(Wire.read());
  *month = bcdToDec(Wire.read());
  *year = bcdToDec(Wire.read());
}

void setup(){
  
  lcd.begin(16, 2); //setta le dimensioni dell'lcd
  
  Serial.begin(9600);
  pinMode(53, OUTPUT); //per il MEGA è il pin 53, per l'UNO il 10
   if (!SD.begin(4)) {
    Serial.println("initialization failed!");
    return;
  }
  
  Wire.begin();       // ??????? ??????????? ?? TWI ??????            

  ///// ?????? ????????? ?? ??????????? 
  Wire.beginTransmission(B1001000); // ?????? ?? ??? ??????? 
  Wire.write(0x01);                  // ??????? ???????? 01
  Wire.write(0x60);                  // ?????? ????????? 0.0625
  Wire.endTransmission();           // ???????? ???????? 

  ///// ?????? ????????? ?? ?????????? ???????????  
  Wire.beginTransmission(B1001000); // ?????? ?? ??? ??????? 
  Wire.write(0x00);                  // ??????? ???????? 00
  Wire.endTransmission();           // ???????? ????????
  
  //RTC
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  Wire.begin();
  Serial.begin(9600);
 /*
 Modificare i successivi valori se si desidera impostare l'orologio.
 Occorre attivare la linea setDateDs1307 una volta quindi rimuovere
 la chiamata.
 */
  second = 0;
  minute = 24;
  hour = 20;
  dayOfWeek = 3;
  dayOfMonth = 20;
  month = 8;
  year = 13;

  //setDateDs1307(second, minute, hour, dayOfWeek, dayOfMonth, month, year);


Wire.beginTransmission(B1001000); // ?????? ?? ??? ??????? 
  Wire.write(0x01);                  // ??????? ???????? 01
  Wire.write(0x60);                  // ?????? ????????? 0.0625
  Wire.endTransmission();           // ???????? ???????? 

  ///// ?????? ????????? ?? ?????????? ???????????  
  Wire.beginTransmission(B1001000); // ?????? ?? ??? ??????? 
  Wire.write(0x00);                  // ??????? ???????? 00
  Wire.endTransmission();           // ???????? ????????
  
  


}
void loop(){
  Wire.requestFrom(B1001000, 2); // ??????? 2 ????? ?? ???????                                                                              
  reading = Wire.read();      // ??????? ??????? ??????? ???? 
                                 // ? ??????????? ?????????? ? ??
  reading = reading << 8;        // ???????? 8 ??????? ??????  
  reading |= Wire.read();     // ??????? ????????? ???? ?????
                                 // ???????????? ??????? ? ????????
  reading = reading >> 4;        // ?????? ?????? 4 ??????? ???????

  ///// ?? ?????????? ????? ????????? ????????????? 
  temperature = (float)reading/16; // ??????? ?? 16 ?????????? ????
                                   // ????????????? ???????? 
                                   
  //RTC
  byte second, minute, hour, dayOfWeek, dayOfMonth, month, year;
  getDateDs1307(&second, &minute, &hour, &dayOfWeek, &dayOfMonth, &month, &year);

Il codice ovviamente non è completo, non ho bisogno di capire nell’insieme cosa fa, ma le singole funzioni cosa provocano :slight_smile: