#include #include #include "LibTeleinfo.h" /****************************** Defines *******************************/ /****************************** Constants *****************************/ #define TIC_RX_PIN 3 #define TIC_TX_PIN 4 #define LEDPIN 13 // Pour clignotement LED asynchrone unsigned long blinkLed = 0; uint8_t blinkDelay= 0; const char HEURES_PLEINES_JOUR_ROUGE[8] = "HPJR"; const char HEURES_CREUSES_JOUR_ROUGE[8] = "HCJR"; const char HEURES_PLEINES_JOUR_BLANC[8] = "HPJW"; const char HEURES_CREUSES_JOUR_BLANC[8] = "HCJW"; const char HEURES_PLEINES_JOUR_BLEU[8] = "HPJB"; const char HEURES_CREUSES_JOUR_BLEU[8] = "HCJB"; const char PERIODE_TARIFAIRE[8] = "NGTF"; const int PIN_RELAIS_CIRCULATEUR_RADIATEURS = 5; const int PIN_RELAIS_PAC = 6; const int PIN_RELAIS_CIRCULATEUR_PLANCHER_CHAUFFANT = 7; /************************* Global variables ***************************/ /************************* Object instanciation ***********************/ SoftwareSerial Serial10(TIC_RX_PIN, TIC_TX_PIN); TInfo tinfo; /**************************** Routines ******************************/ void activerChauffage() { Serial.println(F("ACTIVATION chauffage !")); digitalWrite(PIN_RELAIS_CIRCULATEUR_RADIATEURS, LOW); digitalWrite(PIN_RELAIS_CIRCULATEUR_PLANCHER_CHAUFFANT, LOW); digitalWrite(PIN_RELAIS_PAC, LOW); } void desactiverChauffage() { Serial.println(F("DESACTIVATION chauffage !")); digitalWrite(PIN_RELAIS_CIRCULATEUR_RADIATEURS, HIGH); digitalWrite(PIN_RELAIS_CIRCULATEUR_PLANCHER_CHAUFFANT, HIGH); digitalWrite(PIN_RELAIS_PAC, HIGH); } /* ====================================================================== Function: printUptime Purpose : print pseudo uptime value Input : - Output : - Comments: compteur de secondes basique sans controle de dépassement En plus SoftwareSerial rend le compteur de millis() totalement A la rue, donc la precision de ce compteur de seconde n'est pas fiable du tout, dont acte !!! ====================================================================== */ void printUptime(void) { Serial.print(millis()/1000); Serial.print(F("s\t")); } /****************************** Setup *******************************/ void setup() { // Configure Teleinfo Soft serial Serial.println(F("Set Baud")); Serial.begin(115200); Serial.print(F("TIC RX = ")); Serial.println(TIC_RX_PIN); Serial10.begin(9600); // Init teleinfo tinfo.init(); // Attacher les callbacks dont nous avons besoin tinfo.attachADPS(ADPSCallback); tinfo.attachData(DataCallback); tinfo.attachNewFrame(NewFrame); tinfo.attachUpdatedFrame(UpdatedFrame); pinMode(PIN_RELAIS_CIRCULATEUR_RADIATEURS, OUTPUT); pinMode(PIN_RELAIS_CIRCULATEUR_PLANCHER_CHAUFFANT, OUTPUT); pinMode(PIN_RELAIS_PAC, OUTPUT); printUptime(); Serial.println(F("PROGRAM STARTED")); } /****************************** Processing ****************************/ void DataCallback(ValueList * me, uint8_t flags) { Serial.println(F("")); printUptime(); Serial.println(F("New data")); if (flags & TINFO_FLAGS_ADDED) Serial.print(F("NEW -> ")); if (flags & TINFO_FLAGS_UPDATED) Serial.print(F("MAJ -> ")); // Display values Serial.println(F("DATA")); Serial.print(me->ts); Serial.print(" - "); Serial.print(me->name); Serial.print("="); Serial.println(me->value); if (strcmp(me->name, PERIODE_TARIFAIRE) == 0) { Serial.print(F("Période tarifaire = ")); Serial.println(me->value); if (strcmp(me->value, HEURES_PLEINES_JOUR_ROUGE) == 0) desactiverChauffage(); else activerChauffage(); } if ((strcmp(me->name, "SINSTS1") == 0) || (strcmp(me->name, "SINSTS2") == 0) || (strcmp(me->name, "SINSTS3") == 0)) { Serial.print(F("Puissance app. Instantanée soutirée (")); Serial.print(me->name); Serial.print(F(") = ")); Serial.println(me->value); } } /* ====================================================================== Function: ADPSCallback Purpose : called by library when we detected a ADPS on any phased Input : phase number 0 for ADPS (monophase) 1 for ADIR1 triphase 2 for ADIR2 triphase 3 for ADIR3 triphase Output : - Comments: should have been initialised in the main sketch with a tinfo.attachADPSCallback(ADPSCallback()) ====================================================================== */ void ADPSCallback(uint8_t phase) { Serial.println(F("")); printUptime(); // Monophasé if (phase == 0 ) { Serial.println(F("ADPS")); } else { Serial.print(F("ADPS PHASE #")); Serial.println('0' + phase); } } /* ====================================================================== Function: NewFrame Purpose : callback when we received a complete teleinfo frame Input : linked list pointer on the concerned data Output : - Comments: - ====================================================================== */ void NewFrame(ValueList * me) { Serial.println(F("")); // Start short led blink digitalWrite(LEDPIN, HIGH); blinkLed = millis(); blinkDelay = 50; // 50ms printUptime(); Serial.println(F("FRAME -> SAME AS PREVIOUS")); // Display values Serial.println(F("DATA")); Serial.print(me->ts); Serial.print(" - "); Serial.print(me->name); Serial.print("="); Serial.println(me->value); } /* ====================================================================== Function: UpdatedFrame Purpose : callback when we received a complete teleinfo frame Input : linked list pointer on the concerned data Output : - Comments: it's called only if one data in the frame is different than the previous frame ====================================================================== */ void UpdatedFrame(ValueList * me) { Serial.println(F("")); // Start long led blink digitalWrite(LEDPIN, HIGH); blinkLed = millis(); blinkDelay = 100; // 100ms printUptime(); Serial.println(F("FRAME -> UPDATED")); } /******************************* Loop *********************************/ void loop() { static char c; // On a reçu un caractère ? if ( Serial10.available() ) { c = Serial10.read() ; Serial.print(c & 0x7F); // Gerer tinfo.process(c); } }