[Besoin d'aide] - Alleger mon programme

Bonjour à tous!

Après de longues recherches, essais plus ou moins couronnées de succès, je suis parvenu à réaliser un programme qui me convient en partie !

Celui-ci est fonctionnel, mais je penses qu'il est simplifiable !

Et c'est là que je fait appel à vous!

Si vous pouviez me donner des pistes pour simplifier/alléger mon programme ou encore relever mes erreurs, je vous en remercie d'avance.

Ce programme est destiné à transmettre des relevés de consommation électrique sous forme JSON à chaque fois que l'on se connecte à son IP:Port.

Voici mon code :

#include <SPI.h>
#include <Ethernet.h>
#include <Wire.h>
#include <RTClib.h>  
#include "EmonLib.h"             

EnergyMonitor ct1, ct2, ct3, ct4, ct5, ct6, ct7, ct8, ct9, ct10, ct11, ct12;      

RTC_DS1307 rtc; 

byte mac[] = { 0x0a, 0xb5, 0xc4, 0x55, 0x3e, 0xf1 };
IPAddress ip(192,168,0,120);
EthernetServer serveur(4200);

static char valeur;
static String y;
static String d1;
static String d2;
static String m1;
static String m2;
static String h1;
static String h2;
static String mn1;
static String mn2;
static String s1;
static String s2;
static float E_0; 
static float E_1;
static float E_2;
static float E_3;
static float E_4; 
static float E_5;
static float E_6;
static float E_7;
static float E_8; 
static float E_9;
static float E_10;
static float E_11;
static float E_12;
static boolean S_1;
static boolean S_2;
static boolean S_3;
static boolean S_4;

int a = 2; 
int b = 3;

void setup() {
  Serial.begin(9600);
  pinMode(a,OUTPUT); // MOC3041 positif
  pinMode(b, OUTPUT); //  3 // MOC3041 negatif
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  
  Ethernet.begin(mac, ip);
  delay(1000);
  Wire.begin(); 
      if (!rtc.begin()) {
         Serial.println("RTC echec");}
      if (! rtc.isrunning()) {
         Serial.println("RTC is NOT running!");
         rtc.adjust(DateTime(F(__DATE__), F(__TIME__))); }   
  serveur.begin();

  S_1 = 0;
  S_2 = 0;
  S_3 = 0;
  S_4 = 1;
  
}

void loop() {
  horodatage();
  donnees();
  EthernetClient client = serveur.available();
  if (client) { 
    while(client.connected()) { 
      if(client.available()) {GET(client);} // A-t-il des choses à dire ?
      pilotage();
      repondre(client);
      break;
    }
  }
  delay(10);
  client.stop();
}

void GET(EthernetClient cl) {
  boolean lu = 0; //variable pour indiquer l'état de lecture
  while (cl.available()) { // tant qu'il a des infos à transmettre
    char c = cl.read(); // on lit le caractère
    delay(10); //delai de lecture
    if (c == '?' && lu == 0) { //si "?" repéré
      c = cl.read(); //on lit le caractère suivant qui contient la donnée
      valeur = c;
      }
  }
}

void horodatage(){
  DateTime now = rtc.now();  
  y= String(now.year(), DEC);
  d1= String(now.day()/10, DEC);
  d2= String(now.day()%10, DEC);
  m1= String(now.month()/10, DEC);
  m2= String(now.month()%10, DEC);
  h1= String(now.hour()/10, DEC);
  h2= String(now.hour()%10, DEC);
  mn1= String(now.minute()/10, DEC);
  mn2= String(now.minute()%10, DEC);
  s1= String(now.second()/10, DEC);
  s2= String(now.second()%10, DEC);
}

void donnees(){
   // ADC pin, Vcal Calibration, phase_shift // note:  UK/EU Vcal = 268.97; USA Vcal = 130.0;
  ct1.voltage(0, 268.97, 1.7);                   
  ct2.voltage(0, 268.97, 1.7);
  ct3.voltage(0, 268.97, 1.7);
  ct4.voltage(0, 268.97, 1.7);
  ct5.voltage(0, 268.97, 1.7);                   
  ct6.voltage(0, 268.97, 1.7);
  ct7.voltage(0, 268.97, 1.7);
  ct8.voltage(0, 268.97, 1.7);
  ct9.voltage(0, 268.97, 1.7);                   
  ct10.voltage(0, 268.97, 1.7);
  ct11.voltage(0, 268.97, 1.7);
  ct12.voltage(0, 268.97, 1.7);
  
  // CT Current calibration   // (2000 turns / 22 Ohm burden resistor = 90.909)
  ct1.current(1, 90.9); 
  ct2.current(2, 90.9);
  ct3.current(3, 90.9);
  ct4.current(4, 90.9);
  ct5.current(5, 90.9); 
  ct6.current(6, 90.9);
  ct7.current(7, 90.9);
  ct8.current(8, 90.9);
  ct9.current(9, 90.9); 
  ct10.current(10, 90.9);
  ct11.current(11, 90.9);
  ct12.current(12, 90.9);

  // .calcVI: Calculate all. No.of half wavelengths (crossings), time-out 
  ct1.calcVI(20,2000);
  ct2.calcVI(20,2000);
  ct3.calcVI(20,2000);
  ct4.calcVI(20,2000);
  ct5.calcVI(20,2000);
  ct6.calcVI(20,2000);
  ct7.calcVI(20,2000);
  ct8.calcVI(20,2000);
  ct9.calcVI(20,2000);
  ct10.calcVI(20,2000);
  ct11.calcVI(20,2000);
  ct12.calcVI(20,2000);
  
  E_0  = ct1.realPower; 
  E_1  = ct2.realPower; 
  E_2  = ct3.realPower; 
  E_3  = ct4.realPower; 
  E_4  = ct5.realPower; 
  E_5  = ct6.realPower; 
  E_6  = ct7.realPower; 
  E_7  = ct8.realPower; 
  E_8  = ct9.realPower; 
  E_9  = ct10.realPower; 
  E_10 = ct11.realPower; 
  E_11 = ct12.realPower; 
  E_12 = 0; 
    
}

void pilotage() {
 if (valeur == '1') {
    digitalWrite(a,HIGH);
    digitalWrite(b,HIGH);
    S_1 = 1;
    S_2 = 0;
    S_3 = 0;
    S_4 = 0;
  }
  if (valeur == '2') {
    digitalWrite(a,HIGH);
    digitalWrite(b,LOW);
    S_1 = 0;
    S_2 = 1;
    S_3 = 0;
    S_4 = 0;
  }
  if (valeur == '3') {
    digitalWrite(a,LOW);
    digitalWrite(b,HIGH);
    S_1 = 0;
    S_2 = 0;
    S_3 = 1;
    S_4 = 0;
    }
  if (valeur == '4') {
    digitalWrite(a,LOW);
    digitalWrite(b,LOW);
    S_1 = 0;
    S_2 = 0;
    S_3 = 0;
    S_4 = 1;
    }
}

void repondre(EthernetClient client) {
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: application/json");
  client.println("Access-Control-Allow-Origin: *");
  client.println();
  client.println("{");
  client.print("\t\"DH\": ");
  client.print("\"");
  client.print(y);
  client.print("-");
  client.print(m1);
  client.print(m2);
  client.print("-");
  client.print(d1);
  client.print(d2);
  client.print(" ");
  client.print(h1);
  client.print(h2);
  client.print(":");
  client.print(mn1);
  client.print(mn2);
  client.print(":");
  client.print(s1);
  client.print(s2);
  client.print("\"");
  client.println(",");
  client.print("\t\"A0\": ");
  client.print(E_0);
  client.println(",");
  client.print("\t\"A1\": ");
  client.print(E_1);
  client.println(",");
  client.print("\t\"A2\": ");
  client.print(E_2);
  client.println(",");
  client.print("\t\"A3\": ");
  client.print(E_3);
  client.println(",");
  client.print("\t\"A4\": ");
  client.print(E_4);
  client.println(",");
  client.print("\t\"A5\": ");
  client.print(E_5);
  client.println(",");
  client.print("\t\"A6\": ");
  client.print(E_6);
  client.println(",");
  client.print("\t\"A7\": ");
  client.print(E_7);
  client.println(",");
  client.print("\t\"A8\": ");
  client.print(E_8);
  client.println(",");
  client.print("\t\"A9\": ");
  client.print(E_9);
  client.println(",");
  client.print("\t\"A10\": ");
  client.print(E_10);
  client.println(",");
  client.print("\t\"A11\": ");
  client.print(E_11);
  client.println(",");
  client.print("\t\"A12\": ");
  client.print(E_12);
  client.println(",");
  client.print("\t\"s1\": ");
  client.print(S_1);
  client.println(",");
  client.print("\t\"s2\": ");
  client.print(S_2);
  client.println(",");
  client.print("\t\"s3\": ");
  client.print(S_3);
  client.println(",");
  client.print("\t\"s4\": ");
  client.print(S_4);
  client.println();
  client.println("}");
}

Merci à tous d'avance !

bonjour
j'arrive, je ne peut malheureusement t'aider a optimiser, mais par contre c'est marrant je suis sur un projet similaire avec en plus une mesure pour l'autoconsommation.
Je ne sais pas comment cela se passe pour toi, mais dans mon cas la calibration, malgré tous les outils ne me semble pas simple.
Par contre je n'envoie ps comme toi sur leur site mais sur une BDD perso
Peut être je pourrais t'être utile sur un autre point: je surveille ton post
AlainDpicardie

1 - Lorsque tu as plusieurs variables de même type auxquelles tu appliques des traitements identiques, mets les dans un tableau:

 EnergyMonitor ct[12];
float E[12];

for ( int =0; i<12; i++ ) {
  ct[i].voltage(0, 268.97, 1.7);
  ct[i].current(1, 90.9); 
  ct[i].calcVI(20,2000);
  E[i] = ct[i].realPower; 
}

2 - inutile de créer toutes ces Strings d1, d2, m1, m2 ... pour t'en servir 1 seule fois en les imprimant. Fais directement

  client.print ( now.month()/10, DEC ) ;

en plus le code est plus clair

Salut à tous !

Alors, Alaindepicardie, moi aussi je vais exploiter une BDD sur un Orange Pi Zero.

Mais là, je n'y connait pas grand chose pour le moment!

Je verrais plus tard, lorsque la partie Arduino me satisfera pleinement!

A biggil, merci pour l'explication et le code boucle répétitif!
Pour mes String à répétion, je le fais car je travaille en parralèle sur un autre programme qui enverra ces données dans une BDD via un "INSERT Query" et j'ai besoin d'envoyer l'horodatage que j'ai en 1 seul "paquet"

je vais tester vos infos, et vous redis tout ça!

Merci à vous!