Go Down

Topic: Emoncms - Modbus Datalogger - probleme EthernetServer/EthernetClient (Read 1 time) previous topic - next topic

Simone72

Bonjour tout le monde,

J'ouvre ce Topic pour demander de l'aide concernant un problème de programmation, au même temps sera tutoriels pour les autres.

Après avoir bien galeré un peu avec mes souvenirs de code en C je suis arrivé a récupérer les données que mon compteur électrique (ULYS MD80-M + ULYSCOM MODBUS) me passe en Modbus.
Pour l'interface RS485 j'ai utilisé un driver comme celui-ci.

Les exemples du ModbusMaster et le librairies je les ai trouvées ici et ici.

Puis j'ai voulu datalogguer les données dans la carte SD qui est présent sur le Ethernet Shield, pour la chronologie de l'historique j'ai intégré un RTC comme ça, librerie ici.



Depuis, je pouvais faire mon beau fichier .CSV et l'écrire sur la carte SD.
Donc, je voulut voir les valeurs les plus intéressants sur une petite page web avec un simple rafraîchissement de 5 sec, comme dans l'exemple serveur Web, que je ai trouvé dans l'API Arduino.



Ravi du résultat maintenant je voulais quelque chose de plus sophistiqué, toujours à la recherche, j'ai trouvé ce petit projet bien fait ou ils utilisent Pachube mais que ensuite j'ai découvert être devenu Xively, donc la fin de l'Opensource...  :smiley-sad-blue:

Puis je me suis souvenu avoir vu un beau projet anglais OpenEnergyMonitor utilisant Arduino pour compter les consomation d'électricité.
Toujours à la recherche j'ai découvert ce Playground pour Emoncms qui m'a aidé à mettre les données en forme avant de les envoyér à la base de données, malheureusement c'est en Italien  ;)  ma langue maternelle.

Maintenant les données sont transférées à mon compte Emoncms qui fonctionne très bien,
malheureusement le sympathique serveur web qui m'affichait les données en temps réel ne fonctionne plus...
Réunir la partie Server avec la partie Client sur Arduino n'est pas chose aisé!  :smiley-sad-blue:

Je pense d'avoir fait une vrais embrouille avec les If et les While ... et pas seulement cela, voici la partie du Loop:
Code: [Select]

void loop(){
 
 modbus_update();
 timer.run();
  
  // if there's incoming data from the net connection.
  // send it out the serial port.  This is for debugging
  // purposes only:
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if there's no net connection, but there was one last time
  // through the loop, then stop the client:
  if (!client.connected() && lastConnected) {
    Serial.println();
    Serial.println("Disconnecting...");
    client.stop();
  }
  
  // if you're not connected, and at least <postingInterval> milliseconds have
  // passed sinceyour last connection, then connect again and
  // send data:
  if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {
  
    //Create Data to Emoncms.org
    
      Voltage = (Compact2Word(12,readRegs1))/1000.0;
      Current = (Compact2Word(22,readRegs1))/1000.0;
      PowerFactor = readRegs1[27]/1000.0;
      ActivePower = Compact3Word(6,readRegs2)/1000.0;
      Frequency = readRegs2[33]/1000.0;
      ActiveEnergy = (Compact3Word(9,readRegs3))/10000.0;
      
      
    //send values
    sendData();
    
    Serial.println(Voltage);
    Serial.println(Current);
    Serial.println(PowerFactor);
    Serial.println(ActivePower);
    Serial.println(Frequency);
    Serial.println(ActiveEnergy);
  }
  // store the state of the connection for next time through
  // the loop:
  lastConnected = client.connected();

    
  
  
 EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    // an http request ends with a blank line
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        Serial.write(c);
        // if you've gotten to the end of the line (received a newline
        // character) and the line is blank, the http request has ended,
        // so you can send a reply
        if (c == '\n' && currentLineIsBlank) {
          // send a standard http response header
          client.println("HTTP/1.1 200 OK");
            // output the value of each analog input pin
            readTime();
            client.print("Date "); client.print(monthday); client.print("/"); client.print(month); client.print("/"); client.print(year);
            client.print("  Hour "); client.print(hour); client.print(":"); client.print(minute); client.print(":"); client.print(second); client.println("<br />");
            float a =0;
            client.print("Voltage "); client.print(Voltage, 2); client.println("V <br />");
            client.print("Current "); client.print(Current, 2); client.println("A <br />");  
            client.print("Power Factor "); client.print(PowerFactor, 2); client.println(" <br />");
            client.print("Active Power "); client.print(ActivePower, 2); client.println("W <br />");
            client.print("Apparent Power "); client.print((a = Compact3Word(18,readRegs2))/1000, 2); client.println("VA <br />");
            client.print("Reactive Power "); client.print((a = Compact3Word(30,readRegs2))/1000, 2); client.println("VAR <br />");
            client.print("Frequency "); client.print(Frequency, 2); client.println("Hz <br />");
            client.print("Active Energy "); client.print(ActiveEnergy, 2); client.println("KWh <br />");
            client.print("Inductive apparent Energy "); client.print((a = Compact3Word(33,readRegs3))/1000, 2); client.println("VAh <br />");
            client.print("Capacitive apparent Energy "); client.print((a = Compact3Word(57,readRegs3))/1000, 2); client.println("VAh <br />");
            client.println("<br />");
            client.println("</html>");
            break;
        }
        if (c == '\n') {
          // you're starting a new line
          currentLineIsBlank = true;
        }
        else if (c != '\r') {
          // you've gotten a character on the current line
          currentLineIsBlank = false;
        }
      }
    }
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    client.stop();
    Serial.println("client disconnected");
  }
}

// this method makes a HTTP connection to the server:
void sendData() {
  // if there's a successful connection:
  if (client.connect(emoncms, 80)) {
    Serial.println("Connecting...");
    // send the HTTP GET request:
    client.print("GET /api/post?apikey="); // GET /api/post?apikey=Myapikey&node=0&json={Voltage:236548,Current:14785,Power-Factor:78548,Active-Power:485250}
    client.print(apikey);
    if (node > 0) {
      client.print("&node=");
      client.print(node);
    }
    client.print("&json={Voltage:");
    client.print(Voltage, 2);    
    client.print(",Current:");
    client.print(Current, 2);
    client.print(",Power-Factor:");
    client.print(PowerFactor, 2);  
    client.print(",Active-Power:");
    client.print(ActivePower, 2);
    client.print(",Frequency:");
    client.print(Frequency, 2);
    client.print(",Active-Energy:");
    client.print(ActiveEnergy, 2);  
    client.println("} HTTP/1.1");
    client.println("Host:emoncms.org");
    client.println("User-Agent: Arduino-ethernet");
    client.println("Connection: close");
    client.println();

    // note the time that the connection was made:
    lastConnectionTime = millis();
  }
  else {
    // if you couldn't make a connection:
    Serial.println("Connection failed");
    Serial.println("Disconnecting...");
    client.stop();
  }
}


Pour ceux qui veulent tester et me dire se il peut le corriger je vous joins le fichier.ino
Merci d'avance,

Simone
2 X Arduino MEGA 2560

Simone72

Voici le lien vers le Topic de DanielaES à partir du quel j'ai essayé de mettre en pratique les conseils de Zoomkat... :'(

Ainsi que les librairies utilisées:
SimpleModbusMasterV10.h
SimpleTimer.h
EmonLib.h

Le restants font partie de L'API 1.5.8:
SPI.h
SD.h
Wire.h
Ethernet.h

Voilà c'est tout... j'espère que quelqu'un puisse trouver la solution... :smiley-confuse:
2 X Arduino MEGA 2560

Go Up