14-06-2025, 12:51 PM
Au cas où, ci-joint le petit code pour Arduino Nano connecté au PC par port USB, sur lequel on utilise une librairie altsoftSerial permettant de créer des liens série sur d'autres Pins.
Ce code affiche les données Linky, sans traitement, et m'a permis de démontrer la panne du TIC ( toutes les données étaient à zéro, seul kle bit de parité "vivait" ).
/**********************************************************************************************************************************
INTERFACE Linky Arduino pc
"AltSoftSerial.h" utilise Rx 8 et Tx 9 - & pwm D10 inutilisable pour générer une horloge, car AltSofSerial utilise le timer 1 (D9 - D10)
************************************************************************************************************************************/
#define SER_BUF_SIZE 1024
#include "AltSoftSerial.h"
AltSoftSerial Rx_Linky; // Attention, pins 8 pour Rx sur Arduino Nano et pin 9 pour le Tx depuis Arduino!
int Horloge = 0;
int ledPin = 12;
void setup() {
byte V = 0;
pinMode(ledPin, OUTPUT);
// deux clignotements rapides pour tester la Led connectée sur la pin D12.
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
delay(250);
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
Serial.begin(115200); // on initialise le lien série PC <-> Arduino Nano (Via USB)
Rx_Linky.begin(9600); // Baud Rate Linky Arduino default 8 bits sans parité. -> Il faudra masquer le bit 8.
delay(50);
Rx_Linky.flush();
Serial.flush();
delay(10);
Serial.println("initialisation et purge ports série");
}
unsigned long previousETX= millis();
// ****************************
// * Source de Mesures LINKY *
// ****************************
int boucle_appel_Linky = 0;
void LectureLinky() { //Lecture port série du LINKY .
byte V = 0;
boucle_appel_Linky++;
if (boucle_appel_Linky > 4000) {
boucle_appel_Linky = 0;
Rx_Linky.flush();
Serial.println("Attente Linky 4000 boucles = 8s");
}
while (Rx_Linky.available() > 0)
{
boucle_appel_Linky = 0;
// Le port série fonctionne en 7 bits parité paire
// La Réception se fait en 8 bits, pas de parité
// il faudra forcer le bit 8 à 0 à réception
// mais dans le cas de ma panne TIC, il n'y a que le bit parité ( ie le 8e ), qui bouge !
V = Rx_Linky.read();
switch (V) {
case 0: // valeur nulle reçue (donc bit de parité à zéro)
Serial.print("0-");
break;
// 128 64 32 16 8 4 2 0
case 128: // valeur 1 0 0 0 0 0 0 0
Serial.print("128-"); // ( valeur nulle reçue sur 7 bits, mais avec bit de parité à 1 ! )
break;
default:
byte B = (V & 0x7F); // On masque le bit de parité ( bit 7, de 0 à 7) 0111 1111 pour obtenir un caractère ASCII
// on ne le fait pas avant pour pouvoir capturer toutes les données "vides", c.a.d avec les 7 bits de données à zéro
// et on imprime si B <>2 (STX) ou 3 (ETX)
switch (B) {
case 2:
digitalWrite(ledPin, HIGH);
Serial.println();
Serial.println("received STX"); // début de trame Linky
break;
case 3 :
digitalWrite(ledPin, LOW);
Serial.println();
Serial.println("received ETX"); // fin de trame Linky
Serial.println();
break;
default : // contenu du message
Serial.print(char(B));
break;
}
break;
}
}
}
void loop() {
if (Rx_Linky.available()) // a'ton reçu un caractère sur le port Série Linky ?
{
LectureLinky(); // on lit et on affiche
}
else if (Serial.available()) // a-t'on reçu un caractère de contrôle du PC (si on veut implanter d'autres possibilités...)
{
byte outcoming_byte = (byte) Serial.read(); // on lit le caractère reçu du PC
}
}
Ce code affiche les données Linky, sans traitement, et m'a permis de démontrer la panne du TIC ( toutes les données étaient à zéro, seul kle bit de parité "vivait" ).
/**********************************************************************************************************************************
INTERFACE Linky Arduino pc
"AltSoftSerial.h" utilise Rx 8 et Tx 9 - & pwm D10 inutilisable pour générer une horloge, car AltSofSerial utilise le timer 1 (D9 - D10)
************************************************************************************************************************************/
#define SER_BUF_SIZE 1024
#include "AltSoftSerial.h"
AltSoftSerial Rx_Linky; // Attention, pins 8 pour Rx sur Arduino Nano et pin 9 pour le Tx depuis Arduino!
int Horloge = 0;
int ledPin = 12;
void setup() {
byte V = 0;
pinMode(ledPin, OUTPUT);
// deux clignotements rapides pour tester la Led connectée sur la pin D12.
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
delay(250);
digitalWrite(ledPin, HIGH);
delay(250);
digitalWrite(ledPin, LOW);
Serial.begin(115200); // on initialise le lien série PC <-> Arduino Nano (Via USB)
Rx_Linky.begin(9600); // Baud Rate Linky Arduino default 8 bits sans parité. -> Il faudra masquer le bit 8.
delay(50);
Rx_Linky.flush();
Serial.flush();
delay(10);
Serial.println("initialisation et purge ports série");
}
unsigned long previousETX= millis();
// ****************************
// * Source de Mesures LINKY *
// ****************************
int boucle_appel_Linky = 0;
void LectureLinky() { //Lecture port série du LINKY .
byte V = 0;
boucle_appel_Linky++;
if (boucle_appel_Linky > 4000) {
boucle_appel_Linky = 0;
Rx_Linky.flush();
Serial.println("Attente Linky 4000 boucles = 8s");
}
while (Rx_Linky.available() > 0)
{
boucle_appel_Linky = 0;
// Le port série fonctionne en 7 bits parité paire
// La Réception se fait en 8 bits, pas de parité
// il faudra forcer le bit 8 à 0 à réception
// mais dans le cas de ma panne TIC, il n'y a que le bit parité ( ie le 8e ), qui bouge !
V = Rx_Linky.read();
switch (V) {
case 0: // valeur nulle reçue (donc bit de parité à zéro)
Serial.print("0-");
break;
// 128 64 32 16 8 4 2 0
case 128: // valeur 1 0 0 0 0 0 0 0
Serial.print("128-"); // ( valeur nulle reçue sur 7 bits, mais avec bit de parité à 1 ! )
break;
default:
byte B = (V & 0x7F); // On masque le bit de parité ( bit 7, de 0 à 7) 0111 1111 pour obtenir un caractère ASCII
// on ne le fait pas avant pour pouvoir capturer toutes les données "vides", c.a.d avec les 7 bits de données à zéro
// et on imprime si B <>2 (STX) ou 3 (ETX)
switch (B) {
case 2:
digitalWrite(ledPin, HIGH);
Serial.println();
Serial.println("received STX"); // début de trame Linky
break;
case 3 :
digitalWrite(ledPin, LOW);
Serial.println();
Serial.println("received ETX"); // fin de trame Linky
Serial.println();
break;
default : // contenu du message
Serial.print(char(B));
break;
}
break;
}
}
}
void loop() {
if (Rx_Linky.available()) // a'ton reçu un caractère sur le port Série Linky ?
{
LectureLinky(); // on lit et on affiche
}
else if (Serial.available()) // a-t'on reçu un caractère de contrôle du PC (si on veut implanter d'autres possibilités...)
{
byte outcoming_byte = (byte) Serial.read(); // on lit le caractère reçu du PC
}
}
V14.25 modifiée. 1 serveur UxIx3, 1 Linky de référence, 1 client Triac CE tampon + 1 client SSR CE tampon + 1 client SSR sur CE tri + 3 clients SSR sur 3 radiateurs bain d'huile d'appoint. Variateurs de fréquence Piscine.
8 panneaux (3 SE 2 S, 3 SO ) 425Wc sur 4 HM800 produisent 20kWh par jour au 16 Mars.
8 panneaux (3 SE 2 S, 3 SO ) 425Wc sur 4 HM800 produisent 20kWh par jour au 16 Mars.