/*  ***************************************************************
Expérimentation Convertisseur Analogique digital
    PIC16F88
    Fusible de configuration par défaut hormis
    INTRC_IO (Horloge interne)
    MikroC
    FB Aka Hearty 2010
Utilisation d'une Diode de signal 1N4148 comme capteur de température

*/ //*************************************************************

unsigned char d1,d2,d3,d4,d5,d6,d7,*text;  //Variables  Pour l'affichage
 unsigned long acquisition;
//Initialisation de la variable de coefficient de référence
//La valeur de la diode diminue lorsque sa température monte
//On soustrait donc la ref à la valeur de capture de l'ADC
//Pour avoir une valeur qui s'incrémente au lieu de décrémenter
int ref;
int temp;
int consigne;
//int tempRS232;
//Formatage de l'affichage des valeurs numériques
#define Affiche   lcd_chr(2,3,d1+48);         lcd_chr_cp('.'); \
                  lcd_chr_cp(d2+48);          lcd_chr_cp(d3+48); \
                  lcd_chr_cp(d4+48);          lcd_out_cp("V "); \
                  lcd_out_cp(" T ");          lcd_chr_cp(d5+48); \
                  lcd_chr_cp(d6+48);          lcd_chr_cp(d7+48); \
                  lcd_out_cp("C");



//Début du programme
void main() {
  ADCON1= 0x04;    // Configure le registre ADCON1=> x04 = b 100 >> AN7->AN0 = DDDDADAA
  OSCCON = 0x70;  // Réglage logiciel de la vitesse de l'oscillateur interne ici 8Mhz
  TRISA  = 0xBF;  // PORTA en entrée  sauf le port 6 en entrée
  TRISB  = 0x00;  // PortB en sortie
  PORTB  = 0;     // PORTB mis à zéro
 // ANSEL  = 0;
 // CMCON  = 7;
  consigne=30;     // consigne de déclenchement  ici 30° pour les tests
  lcd_config(&portb,1,3,7,2,5,0,4);   //connection des PORTS B au LCD
  lcd_cmd(LCD_CURSOR_OFF);
  lcd_cmd(LCD_CLEAR);
  text=("THERMOVOLT");
  lcd_out(1,4,text);
  text=("U ");
  lcd_out(2,1,text);
  ref=116;   //variable à corriger pour l'étalonnage
  PORTA.F6=0;  // mise à zéro du port A 6  (LED éteinte)
  //Usart_Init(19200);            // Initialisation USART module
                                // (8 bit, 19200 baud rate, no parity bit...)

//Partie du programme à boucler
  do {

  acquisition =Adc_Read(0);
  acquisition=acquisition*5000/1023;  //*5 diminue la précision, *5000/1023 résolution la plus fine
  temp = ref - Adc_Read(0);
  temp *= 221 ;           // coefficient de température de la jonction de la diode
  temp /= 102 ;
  temp=18+temp;  // adaptation pour donner une valeur en Celcius
  d1=(acquisition/1000);              //préparation des valeurs acquises en volt
  d2=((acquisition%1000)/100);
  d3=((acquisition%100)/10);
  d4=((acquisition)%10);

  d5=(temp/100);                 //préparation des valeurs acquises en °C
  d6=((temp%1000)%100)/10;
  d7=((temp%1000)%100)%10;


 Affiche;       // affichage des valeurs préparées
  delay_ms(20);

//Enclenchement déclenchement du portA 6  dans une fourchette autour de la consigne
  if (temp>=consigne)      // si la température est supérieure ou égale à la consigne
  PORTA.F6=1;              // activer la LED (simule le relais)
  delay_ms(500);           //petite pause pour eviter les micro variations
  if (temp<=(consigne-4))  // si la valeur  est inférieure ou égale à la consigne
  PORTA.F6=0;              // désactive la LED
  delay_ms(500);           //petite pause pour eviter les micro variations
  } while(1);
}