Omvormers en logging

We hebben op dit moment 8 omvormers. Te weten:

  1. Solarmax 2000S
  2. Steca 500
  3. Steca 500
  4. Steca 300
  5. Steca 300
  6. Steca 300
  7. Gridfit 250LV
  8. OK4E

Daar blijft het niet bij. 4,5,6 zijn samengevoegd tot 1 grote omvormer, Steca300x3.

S0 meters

De vetgedrukte omvormers worden bemeten door een viertal DIN kWh meters die voor elke 0.5Wh een korte puls afgeven.

omvormerbord

Hoe gaat dit nu in zijn werk? De zonnepanelen wekken stroom op. Op het moment dat een van de meters merkt dat er 0.5Wh ( dus 1/2000e! Wh ) is opgewekt dan wordt kleine schakeling verbonden waardoor er een stroompje gaat lopen. Op bovenstaande foto zijn allemaal losse draadjes te zien. Deze draden zijn op de 4 meters aangesloten. Aan de andere kant zit de eerder genoemde Arduino.

Arduino

Deze puls komt aan bij de Arduino op het prototype bordje die ik zelf in elkaar heb gezet. Dit printje zit er tussen voor de veiligheid, het z.g.n galvanisch scheiden van de systemen. De chip in het midden is een optocoupler chip. Wanneer er aan de ene kant een stroompje loopt gaat er in de chip een ledje branden. Dit wordt opgemerkt door een gevoelige sensor die ook weer een schakeling sluit.

Dit voorkomt ook ruis op de lijn. In mijn eerste setup had ik deze optocoupler er niet tussen zitten. Toen meette ik een heleboel rotzooi op de lijn. De kabels van de Arduino naar de S0 meters werkt namelijk als een soort antenne.

Op de Arduino komt de puls binnen op 1 van de pins waar de Arduino een z.g.n interrupt controller op heeft zitten. Dit houdt heel kort in dat wanneer er op 1 van deze pins een signaal binnenkomt de processor meteen aandacht daaraan gaat besteden. Het lijkt wel wat op een deurbel waar op gedrukt wordt.

Op de Arduino draait software die ik deels heb gecopieerd en deels zelf heb geschreven. Hieronder staan een aantal korte stukjes van de code:

// STECA1, Steca500 set 3 panels east. backside of the house.
#define STECA1_INTERRUPT 0
#define STECA1_PIN 2        
unsigned long steca1FallTime;  //Time of front raising
unsigned long steca1RiseTime;  //Time of front falling
String steca1String = "S";

Per omvormer geef ik aan op welke interrupt die aangesloten zit. In dit geval op interrupt 0, welke weer zit op PIN 2. Verder een tweetal variabelen waarmee ik precies kan meten straks wanneer een puls begint en wanneer die eindigt. En ik geef aan wat de waarde is die ik weer door wil geven. Daarover later meer.

// SCHELLCOUNT INFO
unsigned long MIN_PULSE_WIDTH_SCHC = 20;        // minimal pulse width SCHELLCOUNT;
unsigned long MAX_PULSE_WIDTH_SCHC = 55;        // maximal pulse width SCHELLCOUNT;

Vanaf de fabrikant is aangegeven hoe lang een puls duurt. In het geval van een Schellcount meter duurt een puls dus minimaal 20ms en maximaal 55ms. Als we straks een puls meten die te kort of te lang is dan weten we zeker dat deze niet goed was. Dit maakt alles weer een stukje stabieler.

 attachInterrupt( STECA1_INTERRUPT, Steca1InterruptHandler, CHANGE );

Deze regel code laat de Arduino weten dat interupt 0 moet worden afgevangen wanneer de pin veranderd van waarde ( van laag naar hoog of van hoog naar laag ). En wanneer dit gebeurd dat de “Steca1InterruptHandler” moet worden gestart. Dit is een apart stukje code die hieronder wordt besproken.

void Steca1InterruptHandler()
{

   unsigned long interruptTime; // Total time of interupt pulse.
 
   if ( digitalRead( STECA1_PIN ) == LOW ) 
   {
      steca1FallTime = millis(); //get time of pulse going down
   }
   else
   {
      steca1RiseTime = millis();                              //get time of pulse going up
      interruptTime = steca1RiseTime - steca1FallTime;      //measure time between down and up

      if ( interruptTime >= MIN_PULSE_WIDTH_SCHC && interruptTime <= MAX_PULSE_WIDTH_SCHC ) 
      {
         Serial.print(steca1String);  
         ChangeLedStatus();
      } else {
        if ( DEBUG ) { 
           // pulse was too short or too long.
           Serial.println( interruptTime );
        }  
        
      }
   } 
}

Ik controleer eerst of een puls begint of eindigd. Als de puls eindigd kan ik bepalen wat de lengte van de puls is geweest. Wanneer de pulslengte goed is wordt de LED op de Arduino veranderd en wordt er via de seriele kabel verstuurd dat we een correcte puls hebben gevonden. In dit geval wordt er over de seriele kabel een “S” teken verstuurd.

Samengevat

Er wordt 0.5Wh opgewekt door de zonnepanelen. De S0 meter geeft een korte puls af. Deze wordt door de Arduino ontvangen, controleert deze en geeft een signaal door aan de computer waar die op zit aangesloten. Maar we zijn er nog niet. De computer moet ook nog wat doen!

Software

Op Trinity heb ik een stuk software geschreven in Java. Deze software luistert de hele tijd naar de USB poort waar de Arduino op zit aangesloten. De Arduino geeft afhankelijk van de omvormer een andere letter door:

  • “S”, Steca500 1
  • “G”, De Gridfit
  • “A”, Steca500 2
  • “B”, 3xSteca300

Wat er in het kort gebeurd is dat er de hele tijd tekens binnenkomen via de kabel. Bijvoorbeeld “SASABG”. Twee pulsen voor beide Steca500 omvormers, een puls voor de Steca300x3 en een voor de Gridfit 250LV.

Elke keer als er een letter wordt ontvangen dan is dit voor de software een “gebeurtenis” oftewel een event in het Engels. En daar zit hem de hele functionaliteit in. Afhankelijk van dit event kan ik precies bepalen WAT er moet gebeuren. Een event afvangen is simpel:

event

Er kan in 1 event meer data binnenkomen, per onderdeel van deze string controleer ik wat voor karakter het is. Wanneer het dus een “S” is start ik de steca1Logger om iets te doen.

Wat nu gebeurd is eenvoudig. Ik bepaal de tijd tussen twee pulsen. Gesteld er zit 10 seconden tussen twee pulsen dan is dus bekend dat in de afgelopen 10 seconden 0.5Wh is opgewekt. Dat is om te rekenen naar het vermogen in W. Dat sla ik uiteindelijk op in een bestand op de server Trinity. Dit alles wordt ook op het scherm getoond zodat ik kan zien wat er gebeurd.

Untitled

Solarmax 2000S

Hier hoef ik weinig voor te doen. Ik heb een stukje software draaien op Trinity die via het netwerk de omvormer kan uitlezen.  Deze schrijft automatisch op een plek op Trinity per dag een bestand weg.

OK4E

De OK4E is net zo saai. Hiervoor draait een oud programma die ooit door IQUE software is geschreven. Dit pakket werkt nog steeds prima onder Windows 7.

1000

Ook dit programma schrijft logbestanden weg op Trinity.

Log bestanden

Alle logbestanden komen binnen op 1 centrale plek op Trinity. Namelijk op c:\omvormerdata

logbestanden

jSunnyreports

jSunnyreports is zo geconfigureerd dat hij bij alle bestanden kan onder deze map en vanuit daar maakt hij alle grafieken en JSON files. Over die laatste straks meer, die komen bij de domoticasectie weer terug.