/* Sketch zur Erfassung der Impulse eines Stromzaehlers (75U/kWh) und Uebergabe an eine PHP-Datei data2text.php, welche daraus Text-Datei(en) mit den Tageswerten erstellt. Realisiert mit Arduino Uno incl. Ethernet-Shield und EM 1000-WZ von ELV */ ///////////////////////////////////////////////////// #include #include // MAC-Adresse der Netzwerkkarte byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // IP-Adresse des WEB-Servers, an den die Daten uebergeben werden sollan, z.B: DeinWebserver.de IPAddress server(xxx, xxx, xxx, xxx); // lokale LAN-Adresse, Gateway und Subnet IPAddress ip(192,168,192,159); IPAddress gateway(192, 168, 192, 99); IPAddress subnet(255, 255, 255, 0); // Initialisiere Ethernet client library EthernetClient client; char host[] = "DeinWebserver.de"; // DOMAIN eingeben! char url[] = "/xyz/data2text.php"; // Pfad zur PHP-Datei, welche die Daten aufnehmen soll char key[] = "geheimwort"; // kleine Sicherheitsmassnahme: Kennwort fuer Uebernahme Daten in PHP-Datei eingeben char c; int LEDPin=6; // LED an PIN 6 blitzt auf, wenn Impuls erfasst wurde const byte counterPin = 2; // Impuls-Eingang unsigned long millisBetween; unsigned long lastMillis; int counter; unsigned long watt; volatile int inter=0; // Interrupt 0 void setup() { pinMode(LEDPin, OUTPUT); counter = 0; pinMode(counterPin, INPUT); digitalWrite(counterPin, LOW); millisBetween = 0; lastMillis = 0; attachInterrupt(0, impuls, RISING); // Interrupt bei steigende Flanke von Impuls ausloesen Serial.begin(9600); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); Ethernet.begin(mac, ip, gateway, gateway, subnet); } delay(5000); // Verzoegerung, um Netzwerk zu starten Serial.println("Bereit"); Serial.println(); } // Ende setup //////////////////////////////////////////////////////////////////// void loop() { if (inter==1) { // Interrupt 0 ausgeloest ? if (client.connect(server, 80)) { // Verbindung zum Server aufbauen Serial.println("verbunden"); } else { Serial.println("Verbindung gescheitert"); ; } Daten_erfassen(); while(client.connected()) { if (client.available()) { char c = client.read(); Serial.print(c); } // Ende if client.available } // Ende while if (!client.connected()) { Serial.println(); Serial.println("Daten gespeichert....trenne Verbindung."); client.stop(); client.flush(); inter = 0; } // Ende if client.connected } //Ende if Iterrupt } // Ende loop void impuls(){ // Interrupt-Impuls inter = 1; } void Daten_erfassen() { unsigned char bitMaskToSend = 0; unsigned long time = millis(); byte val = digitalRead(counterPin); if (val == HIGH) { millisBetween = time-lastMillis; lastMillis = time; bitSet(bitMaskToSend,1); } unsigned long dataToWrite = millisBetween; if (bitRead(bitMaskToSend,1)) { // 75 Imp = 1kWh (Stromzaehler) // --> 1 Imp = 1000Wh/75 = 13.333333333 Wh // --> 1 Imp = (1000Wh/75) * 3600s = 48000 Ws // --> 1 Imp = (1000Wh/75) * 3600s *1000ms = 48000000 Wms watt = 48000000/dataToWrite; //Serial.print(" Watt: "); //Serial.print(watt); digitalWrite(LEDPin, HIGH); // Kontroll-LED beim Senden kurz aufblitzen lassen delay(1); digitalWrite(LEDPin, LOW); // Counter dient nur zu Kontrollzwecken //Man kann anhand des Counters sehen, ob alle Datensätze übermittelt wurden, oder ob evtl. einer fehlt. //Dazu entspr. Tages-LogDatei in Browser oeffnen und kontrollieren, ob die Datensaetze fortlaufend vorhanden sind. counter = counter + 1; if (counter == 9999) { counter = 0; } // Ende if counter } // Ende if bitRead client.print("GET " + String(url)); client.print("?counter="); client.print(counter); client.print("&watt="); client.print(watt); client.print("&key="); client.print("geheimwort"); // kleine Sicherheitsmassnahme: Daten nur uebernehmen, wenn key= "geheimwort" client.println(" HTTP/1.1"); client.print("Host: DeinWebserver.de"); client.println(); client.println("User-Agent: Arduino"); client.println("Connection: close"); client.println(); } // Ende daten_erfassen