#include <OneWire.h>

// DS18S20 Temperature chip i/o
OneWire ds(7);  // on pin 10

//Déclaration du tableau :
// ***** QUESTION 1.2 page 5 **********

byte i;

// Déclaration d'un tableau de 12 octets
  byte scratchpad[12];
  
//Déclaration d’une variable de type Octet de nom octetdepoidsfort ; 
// ******* QUESTION 4.1 page 7
//Déclaration d’une variable de type Octet de nom octetdepoidsfaible ;
byte octetdepoidsfaible ;

//Déclaration d’une variable de taille 16 bits non signée de nom temperature ;
 word Temperature ;

//Déclaration d’une variable de type nombre à virgule de nom temperaturecelsius ;
 float temperaturecelsius ;
  
void setup(void) {
  // initialize inputs/outputs
  // start serial port
  Serial.begin(9600);
}

void loop(void) {
 
 // Demande de mesure de Température : Start Conversion Convert T [44h]
 
 // Following the conversion, the resulting thermal data is stored in the 2-byte temperature register in the scratch- pad memory
  // ***** QUESTION 2.1 page 6 **********              // Initialisation du Bus
  // ***** QUESTION 2.1 page 6 **********         // Selection de l'esclave ds.select(nomdutableau)
  // ***** QUESTION 2.1 page 6 **********        // the resulting thermal data is stored in the 2-byte temperature register.

  delay(1000);     // maybe 750ms is enough, maybe not
  // we might do a ds.depower() here, but the reset will take care of it.

// Lecture du SCRATCH PAD : Read Scratchpad 
  // ***** QUESTION 3.1 page 6 **********              // Initialisation du Bus
  // ***** QUESTION 3.1 page 6 **********         // Selection de l'esclave ds.select(nomdutableau)
  // ***** QUESTION 3.1 page 6 **********         // Read Scratchpad [BEh]
//The data transfer starts with the least sig- nificant bit of byte 0 and continues through the scratchpad until the 9th byte (byte 8 – CRC) is read. 

//Mise en mémoire des 9 Octets du "SCratch Pad"  dans le tableau data[i]
  for ( i = 0; i < 9; i++) {           
    scratchpad[i] = ds.read();
  }

// Octet de poids faible : La variable "Octet de poids faible" reçoit la case 0 du tabelau
  octetdepoidsfaible = scratchpad[0];
// Octet de poids fort : La variable "Octet de poids fort" reçoit la case 1 du tabelau
  octetdepoidsfort = scratchpad[1];

 // Affichage en hexa du contenu de l'octect de poids faible et de l'octet de poids fort
  Serial.println("Octets du Scratch PAd en Hexa = ");
  Serial.print("Octet de poids fort = ");
// Afficher sur le moniteur série le contenu de la variable octetdepoidsfort en hexadécimal
  Serial.println(octetdepoidsfort, HEX);

  Serial.print("Octet de poids faible = ");
// Afficher sur le moniteur série le contenu de la variable octetdepoidsfaible en hexadécimal
  Serial.println(octetdepoidsfaible, HEX);

//Concaténation des deux octets dans la variable « temperature » 
  Temperature = word(octetdepoidsfort,octetdepoidsfaible);

Serial.print("Temperature en hexa = ");
//Afficher la valeur hexadécimale du mot « Temperature ».
Serial.println(Temperature, HEX);
 
 // Conversion en Température 
 
// Conversion à partir des éléments lus sur la documentation constructeur 
  temperaturecelsius = Temperature * 0.0625 ;

  Serial.print("Temperature en °C = ");
  // Affichage de la température sur le moniteur série
  Serial.println(temperaturecelsius);
}