#include <SPI.h>
#include <Wire.h>

#define MCP3428_ADDRESS 0x68 // Adresse I2C du MCP3428
#define VREFMCP 0.0000625// Tension de référence en volt

// Définir les broches
const int CS_PIN = 53;
const float VREF = 1.36; // Référence de tension

//0.253
//ref1 = 0.507

//Vref=0.589

// Initialisation
void setup() {
	Serial.begin(9600);
	SPI.begin();
	pinMode(CS_PIN, OUTPUT);
	digitalWrite(CS_PIN, HIGH); // Désactive le CS au démarrage

	Serial.println(" initialisé et prêt à tester.");
}

byte getChannelConfigByte(int channel) {
  byte configByte = 0x88; // Configuration par défaut pour le canal 1

  if (channel == 1) {
    configByte = 0xA8;
  } else if (channel == 2) {
    configByte = 0xC8;
  } else if (channel == 3) {
    configByte = 0xE8;
  }

  return configByte;
}

float MCP3428_Read(uint8_t channel) {
       
    Wire.beginTransmission(MCP3428_ADDRESS);
    Wire.write(getChannelConfigByte(channel));
    Wire.endTransmission();
    
    delay(200);
  byte config,byte1,byte2;
    while(1){
        Wire.requestFrom(MCP3428_ADDRESS, 3);
        byte2 = Wire.read();
        byte1 = Wire.read();
        config = Wire.read();
        if(config>>8==0) //tant qu'il a pas fini
            break;
    }

    int value = ((byte2) << 8) | byte1;
    Serial.print(value);
    return ((float)value * 62.5)/1000000;
}

float lireADS8345(uint8_t channel) {
	// Préparer les données pour la commande de lecture
	uint8_t commandHigh = 0xC0 | ((channel & 0x07) << 3);

	digitalWrite(CS_PIN, LOW); // Activer le CS

 switch(channel){
   case 0:
    SPI.transfer(0b10000111); // Envoyer la première partie de la commande 
    break;
  case 1:
    SPI.transfer(0b11000111); // Envoyer la première partie de la commande 
    break;
  case 2:
    SPI.transfer(0b10010111); // Envoyer la première partie de la commande 
    break;
  case 3:
    SPI.transfer(0b11010111); // Envoyer la première partie de la commande 
    break;
  case 4:
    SPI.transfer(0b10100111); // Envoyer la première partie de la commande 
    break;
  case 5:
    SPI.transfer(0b11100111); // Envoyer la première partie de la commande 
    break;
  case 6:
    SPI.transfer(0b10110111); // Envoyer la première partie de la commande 
    break;
  case 7:
    SPI.transfer(0b11110111); // Envoyer la première partie de la commande 
    break;
 }
	delay(10); // Attendre un peu pour la stabilisation du signal
	uint8_t resultHigh = SPI.transfer(0x00); // Lire la première partie du résultat
	uint8_t resultLow = SPI.transfer(0x00); // Lire la seconde partie du résultat

	digitalWrite(CS_PIN, HIGH); // Désactiver le CS

	// Combiner les parties haute et basse du résultat
	uint16_t  valeur = (resultHigh << 8) | resultLow;

 	float tension = ((valeur&0x3FFF)/16384.0)*VREF;



	return tension;
}

void loop() {
  int i = 0;
  //for (i =0; i<4;i++){
    /*float tension = lireADS8345(i);
    //Serial.print(i);
    Serial.print(" Tension: ");
    Serial.print(tension, 3); // Affiche la tension avec 3 décimales
    Serial.print(" V     ");
    */

    float tension = lecture(i);
    Serial.print("     ");
    Serial.print(i);
    Serial.print(" Tension: ");
    Serial.print(tension, 10); // Affiche la tension avec 3 décimales
    Serial.println(" V");

    delay(1000); // Attendre 1 seconde avant la prochaine lecture

  //}
}

/*
  salé 9760

*/
/*
OUT1 
REF1 FIX
OUT2 FIX
V+
V-
OUT3
V+_OUT
V-_OUT

0 Tension: 0.438 V 
1 Tension: 0.506 V 
2 Tension: 0.291 V
3 Tension: 0.329 V
4 Tension: 0.343 V
5 Tension: 0.348 V
6 Tension: 0.296 V
7 Tension: 0.164 V
*/