Events

:

:

Elektronik | Funk | Software

Der Technik-Blog

  • Social Media

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden

    Der Technik-Blog

    Arduino Smartmeter S0 Watt Counter

    Arduino Smartmeter

    Alex @ AEQ-WEB

    Am Markt gibt es sehr viele Stromzähler bzw. Subzähler die in der Lage sind, ihre Daten an ein anderes System weiterzugeben. Dafür gibt es verschiedene Schnittstellen wie den ModBus, S0 oder auch Serial. In diesem Artikel geht es um das mitschreiben von verbrauchten Wattstunden mittels eines Arduino Board über S0.

    Wie funktioniert S0

    Das S0 System von Stromzählern ist ein einfacher Impuls, der bei jedem verbrauchten Watt erzeugt wird. Dieses System hat absolut nichts mit der bekannten S0-Schnittstelle vom ISDN zu tun. In dem Zähler befindet sich meistens ein Optokoppler oder Relais, das nach jedem verbrauchten Watt einen kurzen Impuls gibt, indem der angeschlossene Stromkreis geschlossen wird. Die Impulszeit ist nicht standardisiert und je nach Hersteller unterschiedlich. In der Regel dauert ein Impuls etwa 20 - 100 Millisekunden. Ebenso gibt es auch keine bestimmte Größe pro Impuls. Bei den meisten Zählern entspricht ein Impuls einem verbrauchten Watt. Auf Wikipedia gibt es eine genaue Beschreibung von der S0-Schnittstelle.

    Werbung:

    Anschluss an den Ardunio

    Um eine S0-Schnittstelle mit dem Arduino zu verbinden, wird lediglich ein Widerstand benötigt. Die 5V-Spannungsversorgung vom Arduino wird die S0-Klemme vom Zähler durchgeschliffen und geht zu einem Interrupt-Pin (D2). Damit der digitale Eingang vom Arduino ein genaues Signal bekommt wird hier in Serie zur Masse ein PullDown-Widerstand von etwa 10 KOhm geschaltet. Gibt der Zähler einen Impuls, so geht der Pegel am digitalen Eingang in dieser Zeit von Low auf High.

    Wattstunden zählen und Speichern

    Mittels Interrupt werden am Arduino die Wattstunden gezählt. Der Beispielcode enthält eine Integer-Variable, die bei jedem Impuls um eine Eins erhöht wird. Damit kann der Wattverbrauch seit dem Programmstart mitgezählt werden. Bei einem Reset oder Stromausfall gehen jedoch am Arduino die gezählten Wattstunden verloren. Um dies zu verhindern, kann der Zählerstand in einem bestimmten Intervall auf den internen EEPROM gespeichert werden. Um den EEPROM jedoch zu schonen, sollte der Schreibvorgang im Dauerbetrieb nur alle paar Stunden durchgeführt werden.

    Der Beispielcode

    Wenn die Software startet, wird der Zählerstand vom EEPROM eingelesen und die Integer Variable "wh_total" damit beschrieben. Parallel dazu startet auch ein weiterer Counter, der die verbrauchten Wattstunden seit dem Reset bzw. Systemstart mitzählt. Die S0-Impulse werden als Interrupt empfangen. Bei jedem Interrupt wird die Counter-Funktion aufgerufen und die beiden Zählerstände um den Wert "1" erhöht. Die Speicherung des Zählerstandes in den EEPROM erfolgt nach einem definierbaren Intervall. Achtung: In diesem Beispiel werden aufgrund der Einfachheit alle Zählerstände als Integer definiert. Integer ist ein Zahlenwert-Datentyp, der bis max 32.767 bzw. 65.535 als unsigned Integer geht. Damit ist es möglich, bis zu 65 Kilowattstunden zu zählen. Wenn das nicht ausreicht, kann anstatt dem Datentyp Integer auch Long verwendet werden.

    Werbung:

    #include <EEPROM.h>
    
    int interval = 5;  //Counter refresh and save interval
    
    int wh_start, wh_total;
    int pulseCount, crontimer;
     
    void setup() {
    Serial.begin(9600);
    attachInterrupt(0, onPulse, FALLING);
    }
    
    void loop() {
      if(millis()/1000 > crontimer+interval){
        crontimer = millis()/1000;
        wh_total = read_counter(0);
        wh_total = wh_total+pulseCount;
        save_counter(0, wh_total);
        pulseCount = 0; 
        
        Serial.print("Start Wh: ");
        Serial.println(wh_start);
        Serial.print("Total Wh: ");
        Serial.println(wh_total);
        Serial.println("================");
      }
    }
    
    int read_counter(int address)
    {
      long byte_2 = EEPROM.read(address);
      long byte_1 = EEPROM.read(address + 1);
      return ((byte_2 << 0) & 0xFFFFFF) + ((byte_1 << 8) & 0xFFFFFFFF);
    }
    
    void save_counter(int address, int value)
    {
      byte byte_2 = (value & 0xFF);
      byte byte_1 = ((value >> 8) & 0xFF);
      EEPROM.update(address, byte_2);
      EEPROM.update(address + 1, byte_1);
    }
    
    void onPulse()
    {
        pulseCount++;
        wh_start++;
    }


    122X122

    Über den Autor

    Alex, der Gründer von AEQ-WEB. Seit über 10 Jahren beschäftigt er sich mit Computern und elektronischen Bauteilen aller Art. Neben den Hardware-Projekten entwickelt er auch Webseiten, Apps und Software für Computer.

    Top Artikel in dieser Kategorie:

    Arduino LM358 PT1000 Sensor Converter

    Temperatur messen mit PT1000 & Arduino

    • Video
    • DE/EN

    PT1000 Sensoren können nicht direkt analog mit einem Mikrocontroller gemessen werden. Wie baut man einen Messwandler mit dem LM358 für den PT1000 und Arduino?

    Weiterlesen
    Arduino IRFZ44N PWM MOSFET Load Control

    Arduino MOSFET Steuerung

    • Video
    • DE/EN

    In diesen Artikel zeigen wir wie man große Lasten mittels eines MOSFET-Transistors über das Arduino Board steuert und die Drehzahl von einem Motor regelt

    Weiterlesen

    Social Media

    YouTube

    Werbung:


    Neue Artikel


    Events

    • Keine zukünftigen Events vorhanden