Zuverlässiger Sigfox-kWh-Zähler mit Arduino MKR Fox 1200
Benötigte Bauteile
| Arduino MKR Fox 1200 | Mit integriertem Sigfox-Modul (868 MHz) | 1 |
| Steckbrett (Breadboard) | 1 | |
| Steckbrücken | 1 Set | |
| CNY70 Reflexionslichtschranke | Erkennt schwarze Markierung auf Ferraris-Zähler-Rad | 1 |
| Widerstand 221 Ω | Für IR-LED der CNY70 | 1 |
| Widerstand 10 kΩ | Pull-Up für Fototransistor | 1 |
| Widerstand 100 Ω | 1 | |
| Drehpotentiometer | Justierung Empfindlichkeit/Schwelle | 1 |
| Taster 12 mm (SparkFun) | Für Kalibrierung & Start | 1 |
| LED (beliebig) | Statusanzeige | 1 |
Software & Dienste
- Arduino IDE
- Sigfox Backend (Device registrieren, Callbacks einrichten)
- ThingSpeak (IoT-Plattform für Diagramme)
Projektbeschreibung
1. Kurzfassung
Dieses Tutorial zeigt, wie man einen alten Ferraris-Stromzähler (Drehscheibenzähler) ans Internet anbindet. Der Zähler hat eine rotierende Aluminiumscheibe mit reflektierender Farbe und einem schwarzen Strich. Jede Passage des Strichs = 1 Umdrehung. Bei diesem Zähler entsprechen 120 Umdrehungen = 1 kWh.
2. Hardware & Netzwerk
Arduino MKR Fox 1200 mit eingebautem Sigfox-Modem (LPWAN, 868 MHz ISM-Band). Sigfox erlaubt 140 Uplink-Nachrichten pro Tag (je 12 Byte Payload). Nachrichten landen in der Sigfox-Cloud und können per Callback weitergeleitet werden.
ThingSpeak dient als visualisierende Plattform. Der Sigfox-Callback schreibt die empfangenen Daten direkt in einen ThingSpeak-Channel – Diagramme aktualisieren sich in Echtzeit.
3. Praktischer Aufbau
- Verdrahtung gemäß Schaltplan (siehe unten). Stromversorgung per USB-Powerbank oder Laptop-USB.
- Code hochladen (siehe Code-Sektion).
- ThingSpeak einrichten:
- Channel 1 anlegen: Name, Beschreibung, Field 1 = „Consumption“.
- Channel 2 anlegen (basiert auf Channel 1), MATLAB Analysis aktivieren mit Code:
readChannelID = TYPE_CHANNEL1_ID_HERE;
readAPIKey = 'TYPE_CHANNEL1_READ_API_KEY_HERE';
writeChannelID = TYPE_CHANNEL2_ID_HERE;
writeAPIKey = 'TYPE_CHANNEL2_API_KEY_HERE';
data = thingSpeakRead(readChannelID, 'ReadKey', readAPIKey,'OutputFormat','table');
analyzedData = data;
analyzedData.('Consumption') = (data.('Consumption') + YOUR_CURRENT_CONSUMPTION_STATUS_IN_WH)/1000;
thingSpeakWrite(writeChannelID, analyzedData, 'WriteKey', writeAPIKey);
- Sigfox Callback anlegen (backend.sigfox.com → Callbacks):
- Type: DATA UPLINK
- Channel: URL
- Custom Payload Config:
status::uint:32:little-endian - URL Pattern:
https://api.thingspeak.com/update?api_key=THINGSPEAK_WRITE_API_KEY_CHANNEL1&field1={customData#status} - HTTP Method: GET
4. Montage & Logik
CNY70 mit doppelseitigem Klebeband auf das Zählerglas kleben – genau über der Mitte der Drehscheibe (siehe Foto „Installation“).
Inbetriebnahme:
- Taster 2× drücken → Kalibriermodus: LED leuchtet bei reflektierendem Bereich, erlischt bei schwarzem Strich.
- Nach erfolgreicher Kalibrierung Taster 1× drücken → Normalbetrieb.
- Gerät zählt Umdrehungen (Auflösung: 3 Umdrehungen = 25 Wh). Alle 30 Minuten wird der aktuelle Zählerstand (kWh) per Sigfox gesendet.
5. Ergebnis
In ThingSpeak sehen Sie den Stromverbrauch als zeitliches Diagramm – ideal für Verbrauchsanalyse, Lastprofil-Erkennung, Abrechnungskontrolle.
Code
Sigfox kWh electric energy power meter (Arduino .ino)
#include <SigFox.h>
int DIODE = 13; // Status-LED
int BTN = 12; // Taster
int BTN_state = 0, BTN_prev = 0, BTN_NR_OF_PRESS = 0;
int CALC = 0;
unsigned long i = 0;
uint32_t CONSUMPTION = 0; // Zählerstand in Wh
boolean SHINE = false; // reflektierender Bereich erkannt
boolean KARDAN = false; // Zählflanke gesperrt
void setup() {
pinMode(DIODE, OUTPUT);
pinMode(BTN, INPUT);
Serial.begin(9600);
if (!SigFox.begin()) {
Serial.println("Sigfox-Modul nicht verfügbar.");
}
}
void loop() {
int sensor = analogRead(A3); // CNY70 an A3
BTN_state = digitalRead(BTN);
// Taster-Flankenerkennung
if (BTN_state != BTN_prev) {
if (BTN_state == HIGH) BTN_NR_OF_PRESS++;
}
BTN_prev = BTN_state;
// Modus 0: Kalibrierung (BTN_NR_OF_PRESS % 3 == 0 → 0,3,6...)
if (BTN_NR_OF_PRESS % 3 == 0) {
if (sensor > 300 && sensor < 950) digitalWrite(DIODE, HIGH);
else digitalWrite(DIODE, LOW);
}
// Modus 1: Zählen (BTN_NR_OF_PRESS == 4)
if (sensor < 1020 && SHINE == false) SHINE = true; // Hell erkannt
if (sensor > 1020 && SHINE == true && BTN_NR_OF_PRESS == 4) { // Dunkel (Strich) erkannt
CALC++;
SHINE = false;
}
// 3 Striche = 25 Wh
if (CALC % 3 == 0 && CALC != 0 && KARDAN == false) {
KARDAN = true;
CONSUMPTION += 25;
}
if (CALC % 3 != 0) KARDAN = false;
// Modus 2: Senden alle 30 Min (BTN_NR_OF_PRESS % 4 == 0 → nach 4. Druck)
if (BTN_NR_OF_PRESS % 4 == 0) {
digitalWrite(DIODE, LOW);
if (SHINE == false) {
for (millis(); (millis() - i) > 1800000; ) { // 1.800.000 ms = 30 Min
i = millis();
SigFox.debug();
SigFox.beginPacket();
SigFox.write(CONSUMPTION);
SigFox.endPacket();
}
}
}
}
Schaltplan
Verbindungen: CNY70 an A3 (Analog), Taster an D12, LED an D13, Widerstände gemäß Bauteilliste. MKR Fox 1200 wird per USB versorgt (5 V).
Wichtige Hinweise
- Zählerart: Funktioniert nur bei Ferraris-Zählern mit sichtbarer Drehscheibe & schwarzem Strich. Nicht für digitale Zähler (S0-Schnittstelle nötig).
- Sigfox-Limit: 140 Nachrichten/Tag → 30-Minuten-Intervall = 48 Nachrichten/Tag → im Limit.
- Kalorien: 120 Umdrehungen/kWh → 1 U = 8,33 Wh. 3 U = 25 Wh Auflösung – gut genug für Trendanalyse.
- Stromversorgung: Für Dauerbetrieb Netzteil (5 V, ≥500 mA) oder Powerbank mit Pass-Through-Laden nutzen.
- ThingSpeak Channel 2: Addiert den initialen Zählerstand (in Wh) zum empfangenen Delta-Wert → absoluter Verbrauch in kWh.
Herstellungsprozess
- Smart Thirst Alert: DIY Pflanzen-Alarm für optimale Bewässerung
- Italienische Word Clock mit Arduino Nano, NeoPixel, LCD & RTC
- Arduino-Pins sparen: 4x3 Tastenfeld mit nur 3 Anschlüssen verbinden
- Bluetooth-Temperaturmonitor mit Arduino Nano
- DIY Auto-Ranging Kapazitätsmesser (10 pF – 10 µF) – Einfacher Arduino-Nano-Bau
- Berührungsloses Gesten-Schloss: Sicherer Zugang mit APDS-9960 & Arduino
- Arduino Nano Begleiter-Set – Essentielle Bauteile & Werkzeuge für DIY-Elektronik
- USB-MIDI-Adapter für Arduino Micro / Leonardo – Komplettes Bauteil-Kit & Code
- Isolierter Analogeingang für Arduino: Spannung/Strom galvanisch trennen
- Präziser Reaktionszeit-Test mit Arduino UNO