Arduino + teleinfo

Bonsoir

Je voulais juste savoir si quelqu'un avait déjà développé sa solution de teleinfo (UNO + carte téléinfo).

Je galère depuis pas mal de temps pour quelque chose qui parait simple en théorie mais je n'arrive pas au résultat escompté !!!

Du coup, je reprends tout depuis les début. J'ai juste essayé le code suivant Shield Téléinfo : Acquisition simple d'une trame de téléinformation en provenance d'un compteur EDF. - Mon Club Elec mais même ca ne fonctionne pas. Je n'arrive jamais à avoir une trame complète avec son début et sa fin.

Je ne vous parle pas du mélange avec un shield ethernet en plus, il doit y avoir des imcompatibilités entre les 2..

Si des personnes ont bossé sur le sujet, j'aimerais bien avoir un retour

Merci

Quikdav:
Bonsoir

Je voulais juste savoir si quelqu'un avait déjà développé sa solution de teleinfo (UNO + carte téléinfo).

Je galère depuis pas mal de temps pour quelque chose qui parait simple en théorie mais je n'arrive pas au résultat escompté !!!

Du coup, je reprends tout depuis les début. J'ai juste essayé le code suivant Shield Téléinfo : Acquisition simple d'une trame de téléinformation en provenance d'un compteur EDF. - Mon Club Elec mais même ca ne fonctionne pas. Je n'arrive jamais à avoir une trame complète avec son début et sa fin.

Je ne vous parle pas du mélange avec un shield ethernet en plus, il doit y avoir des imcompatibilités entre les 2..

Si des personnes ont bossé sur le sujet, j'aimerais bien avoir un retour

Merci

bonjour
ça a été discuté ici

et ici
http://arduino.cc/forum/index.php/topic,82555.0.html

Après le sketch à deux compteurs, il vient de sortir un sketch à base de websocket ce qui permet la gestion du système sur le navigateur web avec les informations venant directement de l'Arduino.
C'est beaucoup plus pratique et moderne avec tjrs la téléinfo.

merci à lui pour ce travail.

Bonjour,

mon projet comporte une carte Mega, un shield ethernet et une carte teleinfo rs232. Après avoir un peu galéré
au début (a cause du bug String/Free), j'ai tout réécrit pour me passé des String et depuis cela fonctionne inpec

ci dessous une partie de mon projet (seulement le module teleinfo)

#include <HardwareSerial.h>
#include <Statistic.h>

#define L_MAX_MSG  25

char teleinfoInputString[L_MAX_MSG+1];
int teleinfoNbCarRec;

unsigned long teleinfoLastChange = 0;

char szHCHC[L_HCHX+1] = "";
char szHCHP[L_HCHX+1] = "";
char szPTEC[L_PTEC+1] = "";
char szLastPAPP [L_PAPP+1] = "";
char szLastIINST [L_IINST+1] = "";

Statistic statPAPP;
Statistic statIINST;

//String sLPAPP = "";
//String sLIINST = "";

void setupTeleinfo()
{

  LOGINFO(CR"******************************************"CR);
  LOGINFO("Initializing Teleinfo... ");

  //init 
  TELEINFO_SERIAL.begin(1200);
  //configure port 1 en 7/1/e
  UCSR1C = B00100100;

  statPAPP.clear();
  statIINST.clear();

  teleinfoInitBufRec();
  
  teleinfoLastChange = millis();

  pinMode(recPin, OUTPUT);
  digitalWrite(recPin, HIGH); 

  LOGINFO("OK"); 
  LOGINFO(CR"******************************************"CR);

}
// init buffer de reception 
void teleinfoInitBufRec(void)
{
  teleinfoNbCarRec = 0;
  teleinfoInputString[0] = 0;  
}

//ajoute un caractere dans le buffer de reception 
void teleinfoAddCar(char c)
{
  teleinfoInputString[teleinfoNbCarRec++] = c;
  teleinfoInputString[teleinfoNbCarRec] = 0;
}

int teleinfoBufRecLengh(void)
{
  return strlen(teleinfoInputString);
}

char *teleinfoBufRec(void)
{
  return teleinfoInputString;
}

void checkTeleinfo()
{
  teleinfoLec(true);
  
  //chien de garde teleinfo
  unsigned long ulNow = millis();
  if(ulNow>teleinfoLastChange && ((ulNow - teleinfoLastChange)>5000))
  {
    ErreurVie(VID_ERREUR_TELEINFO,true);
  }
  else if(ulNow>teleinfoLastChange)
  {
    ErreurVie(VID_ERREUR_TELEINFO,false);
  }
  //rebooclage
  else if(ulNow<teleinfoLastChange)
  {
    teleinfoLastChange = ulNow;
  } 
}

void teleinfoLec(boolean Tout)
{
  
  static byte recCours = false;
  
  while (TELEINFO_SERIAL.available()) 
  { 
    // get the new byte:
    char inChar = (char)TELEINFO_SERIAL.read();
    
    
    
    if(inChar <=4)
    {
       teleinfoInitBufRec();
       recCours = false;
    }
    else 
    { 
      if(inChar == 0x0a)  // debut de group
      {
        teleinfoInitBufRec();
        recCours = true;
      }
      else if(recCours == true && inChar == 0x0d)  // fin de group
      {
        if(checkSumOK(teleinfoBufRec()))
        {
          traitMesssage(teleinfoBufRec());
        }
        else
        {
          LOGDEBUG2PAR("Rec message incorrect !! (%d)(%s)"CR,strlen(teleinfoInputString),teleinfoInputString);
        }
        
        teleinfoInitBufRec();
        recCours = false;  
        
        // si une trame complete et demande de schedule
        if(Tout == false)
        {       
          return ;
        }
        
      }
      else if(recCours == true)
      {
        if(teleinfoNbCarRec>=L_MAX_MSG)
        {
          LOGINFO2PAR("Rec message incorrect !! (%d)(%s)"CR,strlen(teleinfoInputString),teleinfoInputString);
          
          // trame trop longue init 
          teleinfoInitBufRec();
          recCours = false;
        }
        else
        {
          teleinfoAddCar(inChar);
        }
      }
    } 
  }
}

byte checkSumOK(char *Message)
{
  int i;
  unsigned char checksum =0;
  int msgLength = strlen(Message);

  // trame pas valide
  if(msgLength <= 2)
  {
    return 0;
  }

  for(i=0;i<(msgLength-2);i++)
  {
    checksum += Message[i];
  }

  checksum = (checksum & 63) + 32 ;
  
  return (checksum == Message[msgLength-1]);
} 

void traitMesssage(char *msg)
{
  char bufTmp[50+1];
  
  //ledRec.on();
  digitalWrite(recPin, HIGH);
  
  //message compteur heure creuse
  if (!strncmp(msg,"HCHP",4))
  {
    STRNCPY(szHCHP,&msg[5],L_HCHX);

    LOGDEBUG1PAR("Rec HCHP : %s"CR,szHCHP); 
  }
  else if (!strncmp(msg,"HCHC",4))
  {
    STRNCPY(szHCHC,&msg[5],L_HCHX);
  
    LOGDEBUG1PAR("Rec HCHC : %s"CR,szHCHC); 

  }
  else if (!strncmp(msg,"PAPP",4))
  {
    STRNCPY(bufTmp,&msg[5],L_PAPP);
    int ip=atoi(bufTmp);   

    LOGDEBUG1PAR("Rec PAPP : %d"CR,ip);    
/*
    if(sLPAPP != "")
    {
      sLPAPP += ":";  
    }
    
    sLPAPP += String(bufTmp);
*/
    statPAPP.add(ip);
  }
  else if (!strncmp(msg,"IINST",5))
  {
    STRNCPY(bufTmp,&msg[6],L_IINST);
    
    int ii=atoi(bufTmp);
    
    LOGDEBUG1PAR("Rec IISNT : %d"CR,ii);
/*
    if(sLIINST != "")
    {
      sLIINST += ":";  
    }
    
    sLIINST += bufTmp;
*/    
    statIINST.add(ii);
  }
  else if (!strncmp(msg,"PTEC",4))
  {
    STRNCPY(bufTmp,&msg[5],L_PTEC);
    
    if(strncmp(bufTmp,szPTEC,L_PTEC))
    {
      STRNCPY(szPTEC,bufTmp,L_PTEC);
      WebClientSendEtatHC((strncmp(szPTEC,"HC..",4)==0));  
    }
    
    LOGDEBUG1PAR("Rec PTEC : %s"CR,szPTEC);

  }
  
  teleinfoLastChange = millis();
    
  //ledRec.off();
  digitalWrite(recPin, LOW);
}

char * getLastHCHC(void)
{
    return szHCHC;  
}

char * getLastHCHP(void)
{
  return szHCHP;
}

String getListePAPP()
{
  return "";//sLPAPP;
}

String getListeIINST()
{
  return "";//sLIINST;
}  

char * getLastPAPP(boolean calcul)
{
  if(calcul == false)
  {
    return szLastPAPP;
  }
  
  if(statPAPP.count() == 0)
  { 
     return (char*)"0";
  }
  
  int p = round(statPAPP.average());
  
  sprintf(szLastPAPP,"%d",p);
  
  //sLPAPP = "";
  
  statPAPP.clear();
  return szLastPAPP;
}

char * getLastIINST(boolean calcul)
{
  if(calcul == false)
  {
    return szLastIINST;
  }
  
  if(statIINST.count() == 0)
  { 
     return (char*)"0";
  }

  int i = round(statIINST.average());
  sprintf(szLastIINST,"%d",i);
  
  //sLIINST = "";
  statIINST.clear();
  return szLastIINST;
}

char * getLastPTEC(void)
{
  return szPTEC;
}

boolean teleinfoDatasOK(void)
{
  
  if(szPTEC[0] != 0 && szHCHP[0] != 0 && szHCHC[0] != 0 && statIINST.count() >0 && statPAPP.count() >0)
  {
    return true;
  }
  
  return false;
}

setupTeleinfo() lancer dans le setup principal
et checkTeleinfo() lancer dans le loop()

ce code n'est pas utilisable dans l’état (il y a plusieurs autres modules dans mon projet)
mais il y a toutes la gestion de la réception des trames et leurs décodage.

ken@vo
Phil

J'ai realisé un montage avec un arduino uno + shield w5100 permettant de récupérer le teleinfo et ensuite mettre un histo à jour sur un site distant. Le montage n'a pas besoin de pc pour fonctionner.
Http://arduino.douez.net