Librairie Universelle Pour la Téléinformation


  • Staff

    Pourquoi ? Travaillant sur différents projets utilisant la téléinformation dans des environnements assez variés (Arduino, Raspberry, Spark Core, ESP8266, …) j’en avais un peu marre de devoir faire des copier/coller de mon code original écrit il y a quelques années… Continue Reading

    Click here to see the full blog post



  • Bonjour,

    Vraiment du bon boulot.
    Merci.



  • Re,

    Tout fonctionne parfaitement sur un Moteino, jusqu'à l'utilisation de la fonction Radio.

    J'ai pris Arduino_Softserial_Etiquette.ino comme exemple.

    J'ai uniquement ajouter la fonction radio.initialize( RF69_868MHZ, NODEID, NETWORKID ) à la fin de Setup().

    L'execution est bloquée. Rien ne s'affiche.

    Dans la librairie RFM69.cpp, si l'on commente les lignes :

    //do writeReg(REG_SYNCVALUE1, 0xAA); while (readReg(REG_SYNCVALUE1) != 0xAA);
    //do writeReg(REG_SYNCVALUE1, 0x55); while (readReg(REG_SYNCVALUE1) != 0x55);
    //while ((readReg(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00); // wait for ModeReady

    ca fonctionne à nouveau (la partie Teleinfo, pas la partie radio bien sur).
    La fonction radio.initialize ne bloque plus.

    Une idée de ce qui peut se passer ?

    Cordialement.


  • Staff

    Bonjour,

    Merci pour le commentaire. C'est rigolo quand j'ai développé la librairie je l'ai fait sur un moteino ;-) mais je n'ai pas activé la radio, faudrait que j'essais!
    Mais je ne suis pas surpris que ce çà ne fonctionne pas, le SoftSerial c'est vraiment pas terrible et surtout incompatible avec d'autres librairies. C'est pas sa faute, mais il prends une IRQ à chaque changement d'état sur la pin soft RX, donc çà le travaille pas mal. Quand je vois déjà comment il torpille le millis(), j'imagine avec le moteino et les IRQ (quoique çà peut être asynchrone) çà pourrait marcher
    Il y a 3 solutions pour se sortir de là:

    • Privilégier la liaison Série Hardware, et switcher la pin RX (D0) entre celle de l'adaptateur FTDI pour l'upload la téléinfo une fois le sketch uploadé, ouais je sais, galère!!
    • Passer sur un moteino mega qui a 2 liaisons série hard et utiliser Serial1 pour la téléinfo ;-)
    • Activer l'OTA sur le moteino, comme çà les upload se font en RF et la liaison série hard reste disponible pour la téléinfo ;-)


  • Bonjour,
    J'ai change de Moteino - Tout fonctionne bien.

    Je dois avoir un probleme HW sur la Moteino précedente: les codes basic RF69 ne fonctionnent pas non plus : bloquent au niveau de radio.initialize.

    Cordialement.


  • Staff

    Ah cool alors :-)

    j'aime pas trop le initialize de la librairie d'origine de Felix, car justement en cas de problème çà bloque et on ne sait jamais d'ou çà vient.
    Je l'avais déjà modifié pour çà, regarde sur mon git rfm69.cpp la fonction me retourne true si module trouvé ou false si time-out (50ms)

    bool RFM69::initialize(byte freqBand, byte nodeID, byte networkID)
    {
      unsigned long start_to;
      const byte CONFIG[][2] =
      {
        /* 0x01 */ { REG_OPMODE, RF_OPMODE_SEQUENCER_ON | RF_OPMODE_LISTEN_OFF | RF_OPMODE_STANDBY },
        /* 0x02 */ { REG_DATAMODUL, RF_DATAMODUL_DATAMODE_PACKET | RF_DATAMODUL_MODULATIONTYPE_FSK | RF_DATAMODUL_MODULATIONSHAPING_00 }, //no shaping
        /* 0x03 */ { REG_BITRATEMSB, RF_BITRATEMSB_55555}, //default:4.8 KBPS
        /* 0x04 */ { REG_BITRATELSB, RF_BITRATELSB_55555},
        /* 0x05 */ { REG_FDEVMSB, RF_FDEVMSB_50000}, //default:5khz, (FDEV + BitRate/2 <= 500Khz)
        /* 0x06 */ { REG_FDEVLSB, RF_FDEVLSB_50000},
    
        /* 0x07 */ { REG_FRFMSB, (freqBand==RF69_315MHZ ? RF_FRFMSB_315 : (freqBand==RF69_433MHZ ? RF_FRFMSB_433 : (freqBand==RF69_868MHZ ? RF_FRFMSB_868 : RF_FRFMSB_915))) },
        /* 0x08 */ { REG_FRFMID, (freqBand==RF69_315MHZ ? RF_FRFMID_315 : (freqBand==RF69_433MHZ ? RF_FRFMID_433 : (freqBand==RF69_868MHZ ? RF_FRFMID_868 : RF_FRFMID_915))) },
        /* 0x09 */ { REG_FRFLSB, (freqBand==RF69_315MHZ ? RF_FRFLSB_315 : (freqBand==RF69_433MHZ ? RF_FRFLSB_433 : (freqBand==RF69_868MHZ ? RF_FRFLSB_868 : RF_FRFLSB_915))) },
    
        // looks like PA1 and PA2 are not implemented on RFM69W, hence the max output power is 13dBm
        // +17dBm and +20dBm are possible on RFM69HW
        // +13dBm formula: Pout=-18+OutputPower (with PA0 or PA1**)
        // +17dBm formula: Pout=-14+OutputPower (with PA1 and PA2)**
        // +20dBm formula: Pout=-11+OutputPower (with PA1 and PA2)** and high power PA settings (section 3.3.7 in datasheet)
        ///* 0x11 */ { REG_PALEVEL, RF_PALEVEL_PA0_ON | RF_PALEVEL_PA1_OFF | RF_PALEVEL_PA2_OFF | RF_PALEVEL_OUTPUTPOWER_11111},
        ///* 0x13 */ { REG_OCP, RF_OCP_ON | RF_OCP_TRIM_95 }, //over current protection (default is 95mA)
    
        // RXBW defaults are { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_5} (RxBw: 10.4khz)
        /* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_16 | RF_RXBW_EXP_2 }, //(BitRate < 2 * RxBw)
        //for BR-19200: //* 0x19 */ { REG_RXBW, RF_RXBW_DCCFREQ_010 | RF_RXBW_MANT_24 | RF_RXBW_EXP_3 },
        /* 0x25 */ { REG_DIOMAPPING1, RF_DIOMAPPING1_DIO0_01 }, //DIO0 is the only IRQ we're using
        /* 0x29 */ { REG_RSSITHRESH, 220 }, //must be set to dBm = (-Sensitivity / 2) - default is 0xE4=228 so -114dBm
        ///* 0x2d */ { REG_PREAMBLELSB, RF_PREAMBLESIZE_LSB_VALUE } // default 3 preamble bytes 0xAAAAAA
        /* 0x2e */ { REG_SYNCCONFIG, RF_SYNC_ON | RF_SYNC_FIFOFILL_AUTO | RF_SYNC_SIZE_2 | RF_SYNC_TOL_0 },
        /* 0x2f */ { REG_SYNCVALUE1, 0x2D },      //attempt to make this compatible with sync1 byte of RFM12B lib
        /* 0x30 */ { REG_SYNCVALUE2, networkID }, //NETWORK ID
        /* 0x37 */ { REG_PACKETCONFIG1, RF_PACKET1_FORMAT_VARIABLE | RF_PACKET1_DCFREE_OFF | RF_PACKET1_CRC_ON | RF_PACKET1_CRCAUTOCLEAR_ON | RF_PACKET1_ADRSFILTERING_OFF },
        /* 0x38 */ { REG_PAYLOADLENGTH, 66 }, //in variable length mode: the max frame size, not used in TX
        //* 0x39 */ { REG_NODEADRS, nodeID }, //turned off because we're not using address filtering
        /* 0x3C */ { REG_FIFOTHRESH, RF_FIFOTHRESH_TXSTART_FIFONOTEMPTY | RF_FIFOTHRESH_VALUE }, //TX on FIFO not empty
        /* 0x3d */ { REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_2BITS | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF }, //RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent)
        //for BR-19200: //* 0x3d */ { REG_PACKETCONFIG2, RF_PACKET2_RXRESTARTDELAY_NONE | RF_PACKET2_AUTORXRESTART_ON | RF_PACKET2_AES_OFF }, //RXRESTARTDELAY must match transmitter PA ramp-down time (bitrate dependent)
        //* 0x6F */ { REG_TESTDAGC, RF_DAGC_CONTINUOUS }, // run DAGC continuously in RX mode
        /* 0x6F */ { REG_TESTDAGC, RF_DAGC_IMPROVED_LOWBETA0 }, // run DAGC continuously in RX mode, recommended default for AfcLowBetaOn=0
        {255, 0}
      };
    
      pinMode(_slaveSelectPin, OUTPUT);
      SPI.begin();
     
      // Set time out to 50ms
      #define TIME_OUT 50
      
      start_to = millis() ;
    
      do 
        writeReg(REG_SYNCVALUE1, 0xaa); 
      while (readReg(REG_SYNCVALUE1) != 0xaa && millis()-start_to < TIME_OUT);
    
      if (millis()-start_to >= TIME_OUT) 
        return (false);
        
      // Set time out 
      start_to = millis()  ;  
      do 
          writeReg(REG_SYNCVALUE1, 0x55);
      while (readReg(REG_SYNCVALUE1) != 0x55 && millis()-start_to < TIME_OUT);
      
      if (millis()-start_to >= TIME_OUT) 
        return (false);
      for (byte i = 0; CONFIG[i][0] != 255; i++)
        writeReg(CONFIG[i][0], CONFIG[i][1]);
    
      // Encryption is persistent between resets and can trip you up during debugging.
      // Disable it during initialization so we always start from a known state.
      encrypt(0);
    
      setHighPower(_isRFM69HW); //called regardless if it's a RFM69W or RFM69HW
      setMode(RF69_MODE_STANDBY);
      // Set time out 
      start_to = millis() ;
    	while (((readReg(REG_IRQFLAGS1) & RF_IRQFLAGS1_MODEREADY) == 0x00) && millis()-start_to < TIME_OUT); // Wait for ModeReady
      if (millis()-start_to >= TIME_OUT) return (false);
      attachInterrupt(_interruptNum, RFM69::isr0, RISING);
    
      selfPointer = this;
      _address = nodeID;
      return true;
    }
    
    


  • Bonjour,

    Je me demandais si il était possible d'utiliser facilement l'ESP8266 et la téléinfo ?? en effet les deux utilise le serial il faudrait donc un softserial et un serial physique ça ne risque pas de poser des problèmes lors de la communication ?

    Merci d'avance !


  • Staff

    Bonjour,

    Oui c'est ce qui est fait avec la carte WifInfo, mais en revanche on perd la serial. J'utilise le TXD1 (la 1/2 uart serial restante) pour le débug.

    J'ai essayé le soft serial (sur l'entrée téléinfo), pas concluant, ça génère tellement d'interruption que ça ralenti le processus.
    Ceci dit, comme on est réseau avec l'ESP rien n'empêche d'utiliser une interface style telnet.



  • Bonjour,

    Très bon travail, ca faisait un bail que j'avais pas lu de liste chainée :-)
    Sinon, la fonction sendJSON est plus qu'utile (Pour Jeedom dans mon cas :-) ).
    Petite question/correction de bug dans sendJSON :

    le bloc de code suivant ne nous fait-il pas sauter la première étiquette d'emblé à la première exécution de la boucle :
    // Loop thru the node
    while (me->next) {
    // go to next node
    me = me->next;

    Bonne Soirée


  • Staff

    @J6B
    Merci merci, dans la nouvelle version tous les retours se font en JSON ;-)
    Normalement la 1ere entrée de la liste chainée est vide (histoire de toujours avoir un pointeur en cas de liste vide justement) donc le me->next pointe bien sur la réelle 1ere entrée de la liste. et si la liste est vide le 1er me->next vaut null



  • Bonjour,
    je m’intéresse aux nouvelles technologies et à la domotique.
    Je souhaite avoir un relevé de ma conso électrique dans l'environnement Domoticz.
    Pour se faire après lecture sur différents forums je me suis équipé d'un Arduino Nano et d'un Opto SFH620. Le but de mon installation est de transférer les trames via un RF433.
    Sur différents forums le montage fonctionne et la remontée d'infos se fait bien via le mode RF433.
    Le problème me concernant est que je suis en Tempo triphasé et le scripts pour l'Aruino sont écrits pour les monophasé
    Pensez-vous que votre script peut fonctionner pour un Arduino Nano et un abonnement Tempo triphasé ?
    Si oui est-il possible de le partager sur le forum "Easydomoticz" pour essayer de l'adapter pour qu'il puisse fonctionner en RF433.
    Je n'y connais rien en progs d'où peut-être des questions bêtes !!!

    En tout cas félicitation pour votre travail.

    Fred


  • Staff

    @fred
    Normalement le code dans l'Arduino (donc ça doit marcher sur Nano) ne fait que transmettre les informations.

    Tu parles de quel code ? quel sketch tu mets dans ton Arduino?


Log in to reply
 

Looks like your connection to hallard.me's community was lost, please wait while we try to reconnect.