Bonjour
j ai actuellement une mega sur la quelle est installer un data logger qui peut gere deux compteurs Enedis Linky
le protocle de transfert serie est en 1200 bit parite even et bien sur il transmet sur la pin 1 vu qu 'a l orignine il etait prevu pour une UNO.
je voudrais pouvoir traiter les trames teleinfo en serial1 ou autre pour pouvoir utiliser le terminal ide en debug mais je ne trouve pas la solution et je plante les info des que je touche aux fonctions serial.
point complementaire il y a aussi une Rtc integre sur la carte et une sd , la sd ne fonctionne pas sur le datalogger, j utilise donc la sd de ma carte officielle ethernet pour un serveur embarquer .
ci dessous un extrait du code utiliser jusqu' a present
/*************** initialisation ***************/
void setup()
{
pinMode(10, OUTPUT); digitalWrite(10, HIGH);
// initialisation du port 0-1 lecture Téléinfo
Serial.begin(1200); UCSR0C = B00100100;
#ifdef message_systeme_USB
Serial.println(F("-Releve Compteur LA NOUE "));
#endif
// verification de la présence de la microSD et si elle est initialisée:
#ifdef message_systeme_USB
if (!SD.begin(chipSelect)) {
Serial.println(F(" > Erreur carte, ou carte absente !"));
}
Serial.println(F(" > microSD initialisee !"));
if (!SD.exists("index.htm")) {
Serial.println("Erreur!!! fichier index.htm absent!");
}
else Serial.println(" > Ok fichier index.htm present! ");
if (!SD.exists("recupCSV.htm")) {
Serial.println("Erreur!!! fichier recupCSV.htm absent!");
}
else Serial.println(" > Ok fichier recupCSV.htm present! ");
if (!SD.exists("reglRTC.htm")) {
Serial.println("Erreur!!! fichier reglRTC.htm absent!");
}
else Serial.println(" > Ok fichier reglRTC.htm present! ");
if (!SD.exists("ConsJour.htm")) {
Serial.println("Erreur!!! fichier Conso Jour absent!");
}
else Serial.println(" > Ok fichier fichier Conso Jour present! ");
#endif
Ethernet.begin(mac, ip);
server.begin();
#ifdef message_systeme_USB
Serial.print(" > IP Serveur: ");
Serial.println(Ethernet.localIP());
#endif
/****initialisation des sorties selection compteur ****/
pinMode(LEC_CPT1, OUTPUT);digitalWrite(LEC_CPT1, HIGH);
pinMode(LEC_CPT2, OUTPUT);digitalWrite(LEC_CPT2, LOW);
/**** initialisation Affichage LED****/
pinMode(LEDVERTE, OUTPUT); digitalWrite(LEDVERTE, HIGH); pinMode(DEMVERTE, OUTPUT); digitalWrite(DEMVERTE, HIGH);
pinMode(LEDBLEU, OUTPUT); digitalWrite(LEDBLEU, HIGH); pinMode(DEMROUGE, OUTPUT); digitalWrite(DEMROUGE, HIGH);
pinMode(LEDROUGE, OUTPUT); digitalWrite(LEDROUGE, HIGH); pinMode(DEMBLEU, OUTPUT); digitalWrite(DEMBLEU, HIGH);
pinMode(AUJROUGE, OUTPUT); digitalWrite(AUJROUGE, HIGH); pinMode(AUJVERTE, OUTPUT); digitalWrite(AUJVERTE, HIGH);
pinMode(AUJBLEU, OUTPUT); digitalWrite(AUJBLEU, HIGH); pinMode(LEDHC, OUTPUT); digitalWrite(LEDHC, HIGH);
/**** initialisation sorties relais de commande****/
pinMode(OPTO, OUTPUT); digitalWrite(OPTO, HIGH);
pinMode(BATCHARGE,OUTPUT);digitalWrite(BATCHARGE,HIGH);pinMode(RST,OUTPUT);digitalWrite(RST,HIGH);
/****initialisation des capteurs****/
pinMode(SONDE, INPUT);pinMode(PSECTEUR, INPUT);
pinMode(FLUX_TELEINFO, INPUT);
/**** initialisation RTC****/
Wire.begin();
#ifdef message_systeme_USB
if (!(DS1307isrunning())) {
Serial.println(F("RTC non configure !"));
#endif
}
RTCgetTime(); // lecture de l'horloge
format_date_heure();
#ifdef message_systeme_USB
Serial.print(F(" > Horloge RTC OK:"));
Serial.println(date_heure);
#endif
Restitution_mode();
}
/**** boucle principale ****/
void loop() // Programme en boucle
{
{
FLUX = digitalRead(FLUX_TELEINFO);//controle la presence teleinfo
SECTEUR = digitalRead(PSECTEUR);//controle presence secteur
}
if (!(DS1307isrunning()) && (reg_horloge < 7)) { // si l'horloge n'est pas configurée
digitalWrite(LEC_CPT1, LOW);
if (!mem_reg_horloge) {
switch (reg_horloge) { // debut de la structure
case 1: Serial.println (F("Entrer Heure: "));
break;
case 2: Serial.println (F("Entrer Minute: "));
break;
case 3: Serial.println (F("Entrer Seconde: "));
break;
case 4: Serial.println (F("Entrer Jour: "));
break;
case 5: Serial.println (F("Entrer Mois: "));
break;
case 6: Serial.println (F("Entrer Annee 20xx: "));
break;
}
mem_reg_horloge = true;
}
if (Serial.available() > 0) { // si caractère dans la file d'attente
//---- lecture du nombre reçu
while (Serial.available() > 0) { // tant que buffer pas vide pour lire d'une traite tous les caractères reçus
inByte = Serial.read(); // renvoie le 1er octet présent dans la file attente série (-1 si aucun)
if (((inByte > 47) && (inByte < 58)) || (inByte == 13 )) {
ReceptionOctet = inByte - 48; // transforme valeur ASCII en valeur décimale
if ((ReceptionOctet >= 0) && (ReceptionOctet <= 9)) ReceptionNombre = (ReceptionNombre * 10) + ReceptionOctet;
// si valeur reçue correspond à un chiffre on calcule nombre
}
else presence_teleinfo = -1;
} // fin while
if (inByte == 13) {
if ((ReceptionNombre > val_max[reg_horloge - 1]) || (ReceptionNombre == -1)) {
Serial.println(F("Erreur"));
ReceptionNombre = 0;
mem_reg_horloge = true;
}
else {
switch (reg_horloge) { // debut de la structure
case 1: heure = ReceptionNombre;
break;
case 2: minute = ReceptionNombre;
break;
case 3: seconde = ReceptionNombre;
break;
case 4: jour = ReceptionNombre;
break;
case 5: mois = ReceptionNombre;
break;
case 6: annee = 2000 + ReceptionNombre;
break;
}
mem_reg_horloge = false;
ReceptionNombre = 0;
++reg_horloge;
if (reg_horloge > 6) {
RTCsetTime();
Serial.println(F("Reglage heure OK - installer le cavalier pour la teleinfo"));
digitalWrite(LEC_CPT1, HIGH);
}
}
}
}
}
else {
RTCgetTime();
// passage à l'heure d'été +1 heure
// la lib RTC a une fonction: dayOfWeek qui donne le jour de la semaine (la DS1307 se charge de tout !)
// réponse: 0 -> dimanche, 1 -> lundi etc...
//
if ((heure == 2) && (minute == 0) && (seconde == 0) && (dayOfWeek == 0) && (mois == 3) && (jour > 24)) {
heure = 3;
RTCsetTime();
}
// passage à l'heure d'hiver -1 heure
if ((heure == 3) && (minute == 0) && (seconde == 0) && (dayOfWeek == 0) && (mois == 10) && (jour > 24) && (mem_chg_heure == 0)) {
heure = 2;
RTCsetTime();
mem_chg_heure = 1;
}
if ((heure == 23) && (minute == 59) && (seconde == 40)) {// pour être sur de pas tomber pendant l'enregistrement toutes les minutes
if ((mem_sauv_journee == 0) && (compteursluOK)) { // un seul enregistrement par jour !
fichier_annee();
mem_sauv_journee = 1;
mem_chg_heure = 0;
}
}
else mem_sauv_journee = 0;
if (seconde == 1) {
if ((mem_sauv_minute == 0) && (compteursluOK)) {// un seul enregistrement par minute !
enregistre();
temphyg();
lecture6indexSurSD();
CalculDecompteJournalier();