Pages: [1]   Go Down
Author Topic: Arduino + teleinfo  (Read 1139 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertTeleinfoTestSimpleLectureTrame 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
Logged

Offline Offline
Faraday Member
**
Karma: 34
Posts: 5213
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 http://www.mon-club-elec.fr/pmwiki_mon_club_elec/pmwiki.php?n=MAIN.ArduinoExpertTeleinfoTestSimpleLectureTrame 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
http://arduino.cc/forum/index.php/topic,108382.msg813860/topicseen.html#msg813860
et ici
http://arduino.cc/forum/index.php/topic,82555.0.html
Logged

0
Offline Offline
Full Member
***
Karma: 0
Posts: 175
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

 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.
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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)

Code:
#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
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 1
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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://Http://arduino.douez.net
Logged

Pages: [1]   Go Up
Jump to: