X-beliebigen Wasserzähler auslesen?

Gibt es schon was Neues zu berichten?

Gesendet von meinem S2 mit Tapatalk

Noch nicht dazu gekommen, werde mich aber wohl nachher endlich mal daransetzen und den Lötkolben in die Hand nehmen :wink:

Dieser Tage gibt es endlich erstes Feedback von mir, denn ich habe heute mal zum Lötkolben gegriffen :wink:

Kurzfassung: Das funktioniert so prinzipiell sehr gut, die Lichtschranke ist am Zähler direkt auf dem Glasfenster fixiert, die Messwerte die im Arduino ankommen (Ditigalpin als Ausgang + Vorwiderstand + LED, Analogpin + Pulldown + Fototransistor als Eingang) sind brauchbar. Was ich mache ist, die LED gepulst betreiben (50 Millisekunden Intervalle) und die Veränderung(!) der Helligkeit am Fototransistor von „LED aus“ zu „LED an“ messen. Dadurch bekomme ich einen vom Umgebungslicht unabhängigen (mit dem Raumlicht getestet) Messwert, der deutlich ansteigt wenn der Zeiger unter der Lichtschranke ist.

Dafür muss ich mir nun noch eine kluge Auswertung programmieren. Wenn das ganze fertig ist, kann ich auch Fotos machen, eine Stückliste etc. posten, sofern Interesse daran besteht.

Nicht schön, aber selten:
aludose_klein.jpg

Links unten der Arduino Uno, rechts eine kleine Relaisplatine (KEMO glaube ich) und oben ein Relais mit Gleichrichter zum Abfangen des Klingelsignals.

Die Komponenten sind alle etwas „überqualifiziert“, da das Gerätchen wirklich nicht viel zu tun hat:

-Klingelsignal erkennen
-Klingel abschalten
-Gaszähler per Reed-Kontakt auslesen
-Wasserzähler auslesen mittels Lichtschranke über dem kleinen roten Rädchen

Ich habe aber prinzipiell die Möglichkeit und Kapazität, noch Funktionalität hinzuzufügen. Es sind ja immerhin noch drei Relais und zahlreiche Arduino-Pins frei.

Als Anschlussbuchsen für die Klingel (ist wirklich eine ganz konventionelle 8V-Wechselstromklingel) und die Sensorik habe ich jeweils über DIN-Stecker realisiert, Strom und USB über die Buchsen am Arduino. Die Relaisplatine hat nochmal einen extra Spannungsregler verpasst bekommen, damit das Mini-IC auf der Arduino-Platine nicht überlastet wird.

Die Platinen sind mit einem speziellen Montageband im Gehäuseinnern aufgeklebt, liegen also natürlich nicht einfach auf dem blanken Blech…

Was den Arduino-Quellcode betrifft, nun ja, ich werde ihn mal posten und mich eventuellen Fragen stellen:

// signaling led for calibration status (hardwirder on board)
#define PIN_SIGNAL_LED 13
// led for water meter, aimed at red wheel
#define PIN_WATER_TX 11
// photo transistor for water meter, aimed at red wheel
#define PIN_WATER_RX 0

// reed contact for gas meter
#define PIN_GAS_RX 10

// relay attached to doorbell
#define PIN_DOORBELL_RX 9

// relay to silence doorbell
#define PIN_DOORBELL_INHIBITOR 8

// alternating flag for strobing water meter led etc.
boolean alternatingFlag = true;

// byte for input handling from serial
byte inpuptByte = 0;

// variables for water meter reading
int waterAbsOld = 0;
int waterAbs = 0;
int waterDiff = -1;
int waterDiffMin = 1023;
int waterDiffMax = 0;
int waterDiffRange = 0;
boolean waterCalibrating = true;
byte waterRedWheelPos = 0;
unsigned long waterCounter = 0;
unsigned long waterCounterOld = 0;
byte waterCalibrationStatus = 0;
byte waterCalibrationStatusOld = 255;

// varbiables for door bell
boolean doorbellFlag = false;
boolean doorbellFlagOld = true;
boolean doorbellInhibitor = false;
boolean doorbellInhibitorOld = true;

// variables for gas meter
boolean gasFlag = false;
boolean gasFlagOld = false;
int gasDebounce = 0;
unsigned long gasCounter = 0;
unsigned long gasCounterOld = 0;

// counter variable for status output interval
int countLoop = 0;

void setup()
{
  Serial.begin(9600);
  
  pinMode(PIN_SIGNAL_LED, OUTPUT);
  pinMode(PIN_WATER_TX, OUTPUT);
  pinMode(PIN_GAS_RX, INPUT);
  pinMode(PIN_DOORBELL_RX, INPUT);
  pinMode(PIN_DOORBELL_INHIBITOR, OUTPUT);
}

void loop()
{
  delay(10);
  alternatingFlag = !alternatingFlag; 
  
  // make the water meter ir led strobe
  digitalWrite(PIN_WATER_TX, alternatingFlag);
  delay(5);
  
  // read from photo transistor
  waterAbs = analogRead(PIN_WATER_RX);
  
  // calculate difference between "led off" and "led on"
  if(alternatingFlag) waterDiff = waterAbs - waterAbsOld;
  waterAbsOld = waterAbs;
  
  // calibration
  if(waterCalibrating && (waterDiff > 0))
  {
    if(waterDiff > waterDiffMax) waterDiffMax = waterDiff;
    if(waterDiff < waterDiffMin) waterDiffMin = waterDiff;
    waterDiffRange = waterDiffMax - waterDiffMin;
    
    digitalWrite(PIN_SIGNAL_LED, alternatingFlag);
  }
  else if(waterDiffRange < 100) digitalWrite(PIN_SIGNAL_LED, false);
  
  // if the red wheel can be read properly
  if(waterDiffRange >= 100)
  {
    // check for red wheel position (waterDiff follows a sinus like curve)
    switch(waterRedWheelPos)
    {
      case 0: // low point
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, false);
        if(waterDiff > (waterDiffMin + (waterDiffRange / 3))) waterRedWheelPos = 1;
        break;
      case 1: // rising
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, false);
        if(waterDiff > (waterDiffMax - (waterDiffRange / 4))) waterRedWheelPos = 2;
        break;
      case 2: // high point
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, false);
        if(waterDiff < (waterDiffMax - (waterDiffRange / 3))) waterRedWheelPos = 3;
        break;
      case 3: // falling
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, true);
        if(waterDiff < (waterDiffMin + (waterDiffRange / 4)))
        {
          waterRedWheelPos = 0;
          waterCounter++;
          if(waterCalibrating) waterCalibrationStatus++;
          if(waterCalibrationStatus >= 3) waterCalibrating = false;
        }
        break;
    }
    
    // if unusually high or low values are measured, something must
    // be wrong with the sensor
    if(!waterCalibrating)
    {
      if(waterDiff < (waterDiffMin - (waterDiffRange / 5))) waterCalibrationStatus = 4;
      if(waterDiff > (waterDiffMax + (waterDiffRange / 5))) waterCalibrationStatus = 5;
    }
  }

  // set doorbell flag to true when someone rings
  if(digitalRead(PIN_DOORBELL_RX))
  {
    doorbellFlag = true;
  }
  
  // gas impulse speed is very low
  if(gasDebounce == 0)
  {
    gasFlag = digitalRead(PIN_GAS_RX);
    if(gasFlag != gasFlagOld)
    {
      if(gasFlag) gasCounter++;
      gasDebounce = 200;
    }
  }
  else gasDebounce--;
  gasFlagOld = gasFlag;
  
  // output the status as a json string
  countLoop++;
  if((waterCounter != waterCounterOld)
   ||(waterCalibrationStatus != waterCalibrationStatusOld)
   ||(doorbellFlag != doorbellFlagOld)
   ||(doorbellInhibitor != doorbellInhibitorOld)
   ||(gasCounter != gasCounterOld)
   ||(countLoop > 500))
  {
    Serial.print("{\"water\" : ");
    Serial.print(waterCounter);
    Serial.print(", \"wcalib\" : \"");
    switch(waterCalibrationStatus)
    {
      case 0: Serial.print("uncal"); break;
      case 1: Serial.print("learn"); break;
      case 2: Serial.print("learn"); break;
      case 3: Serial.print("ok"); break;
      default: Serial.print("error"); break;
    }
    Serial.print("\", \"bell\" : ");
    
    if(doorbellFlag)
      Serial.print("true");
    else
      Serial.print("false");
    
    Serial.print(", \"bsilenc\" : ");
    
    if(doorbellInhibitor)
      Serial.print("true");
    else
      Serial.print("false");
    
    Serial.print(", \"gas\" : ");
    Serial.print(gasCounter);
    
    Serial.println("}");
    countLoop = 0;
    
    doorbellFlagOld = doorbellFlag;
    doorbellInhibitorOld = doorbellInhibitor;
    waterCounterOld = waterCounter;
    waterCalibrationStatusOld = waterCalibrationStatus;
    gasCounterOld = gasCounter;
  }
  
  // handle input (single characters)
  while(Serial.available() > 0)
  {
    inpuptByte = Serial.read(); 
    switch(inpuptByte)
    {
      case 'D': // doorbell reset, inhibitor ON
        digitalWrite(PIN_DOORBELL_INHIBITOR, true);
        doorbellInhibitor = true;
        doorbellFlag = false;
        break;
      case 'd': // dorrbell reset, inhibitor OFF
        digitalWrite(PIN_DOORBELL_INHIBITOR, false);
        doorbellInhibitor = false;
        doorbellFlag = false;
        break;
      case 'C': // recalibrate water meter reading
        waterDiffMin = 1023;
        waterDiffMax = 0;
        waterDiffRange = 0;
        waterCalibrating = true;
        waterCalibrationStatus = 0;
        break;
      case 'S': // immediate status output
        countLoop = 10000;
        break;
      case 'E': // reset water meter error status
        if(waterCalibrationStatus > 3) waterCalibrationStatus = 3;
        break;
    }
  }
}

Die besagte Lichtschranke vom großen C habe ich mittels eines alten Honigdeckels auf dem Zähler fixiert, ich weiß nicht ob das abbildungswürdig ist.

Der Code gibt die Stati als JSON-String zurück:

{"water" : 27, "wcalib" : "ok", "bell" : false, "bsilenc" : false, "gas" : 53}

Der Eintrag water steht für den Zählerstand des Wasserzählers (das Gerät fängt natürlich nach Reset bei 0 an, da muss man IPS-seitig dann später den korrekten Stand ausrechnen).
Der Eintrag wcalib gibt Auskunft über die Kalibrierung der Wasserzähler-Ausleseeinheit. Die Kalibrierung findet nach Neustart automatisch statt, kann aber auch später manuell aus IPS heraus ausgelöst werden.
Die Einträge bell und bsilenc geben Auskunft darüber, ob die Klingel betätigt wurde bzw. stummgeschaltet ist.
Schlussendlich gibt gas über den (internen) Stand des Gaszählers Auskunft. Auch dieser Wert muss IPS-seitig natürlich mit dem korrekten Offset versehen werden.

Soweit erstmal. Demnächst dann das Gegenstück, nämlich das IPS-Skript das mit der kleinen Aludose kommuniziert.

Dann das Entsetzen darüber, wie viel Wasser in so eine Badewanne geht :smiley:

Zum Auslesen verwende ich nun eine Registervariable mit folgendem Handlerskript:

<?

// Datem aus Registervariable auslesen und zusammenfügen
$data  = RegVar_GetBuffer($_IPS['INSTANCE']);
$data .= $_IPS['VALUE'];

// Wenn mehrere Datensätze vorhanden sind, nur den neusten nehmen
if(strpos($data, '}{') !== false)
{
	$data = substr($data, strrpos($data, '}{') + 1);
}

// Versuchen, den Datensatz zu parsen
$decoded = json_decode($data);

// falls Parsen erfolgreich
if($decoded)
{
	// über die Elemente laufen und Variable entsprechend erstellen/setzen
	foreach($decoded as $entryName => $entryValue)
	{
	   switch(gettype($entryValue))
	   {
	      case "boolean":
				$vid = CreateVariableByName($_IPS['SELF'], $entryName, 0);
				break;
	      case "integer":
	      case "double":
				$vid = CreateVariableByName($_IPS['SELF'], $entryName, 1);
				break;
	      case "string":
				$vid = CreateVariableByName($_IPS['SELF'], $entryName, 3);
				break;
		}
		SetValue($vid, $entryValue);
	}
	// Puffer leeren
	$data = '';
}

// Puffer setzen
RegVar_SetBuffer($_IPS['INSTANCE'], $data);

function CreateVariableByName($id, $name, $type)
{
  global $IPS_SELF;
  $vid = @IPS_GetVariableIDByName($name, $id);
  if($vid === false)
  {
      $vid = IPS_CreateVariable($type);
      IPS_SetParent($vid, $id);
      IPS_SetName($vid, $name);
      IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
  }
  return $vid;
}
?>

Verändert sich eine der beiden Zählervariablen, so rechne ich das Delta zudem auf den „richtigen“ Zählerstand:

<?

$counterId = 50301  /*[Tableau\Hausgeräte\Wasserzähler]*/ ;

$value = $_IPS['VALUE'];
$oldValue = $_IPS['OLDVALUE'];

if($value < $oldValue) $oldValue = 0;

$counter = GetValue($counterId);
$counter += ($value - $oldValue);
SetValue($counterId, $counter);

?>

Das läuft. Es ist also möglich, einen Wasserzähler wie meinen (und aller Wahrscheinlichkeit viele andere Modelle ebenfalls) optisch abzutasten und auszulesen. Leider gibt es dazu kein fertiges Produkt, was mich tatsächlich etwas wundert, angesichts der Tatsache dass es bei mir wirklich hervorragend funktioniert.

Wenn hieran Interesse besteht, könnte ich mir die Mühe machen, nochmal ein etwas klarer dokumentiertes Bastelprojekt mit Stückliste und Schritt-für-Schritt-Anleitung daraus zu machen. Dazu hätte ich dann aber gern zuerst etwas Feedback, damit ich weiß dass es sich auch lohnen würde.

Hallo,
ich würde mich für den Lesekopf- und Auswertungs-Hardware interessieren.

Gruß Helmut

Hi,

Ich hätte auch Interesse. Allerdings habe ich eine Wago im Einsatz und würde gerne hierüber den Lesekopf auswerten. Was für Signale gibt denn der Lesekopf aus? Welche Betriebsspannung braucht er?

Gesendet von meinem GT-I9100 mit Tapatalk 2

Da Kann ich nur Zustimmen.

Gruß Daniel

Habe auch Interesse … ist wirklich eine tolle Leistung, was da gezeigt wird.

Meinen Wasserzähler auslesen habe ich auch noch auf der Liste. Nachdem der Wasserzweckbervand da nicht kooperativ ist bezüglich Zähler mit S0 bleibt auch mir nur eine optische Lösung.

Zunächst einmal die Stückliste:

[ul]
[li]1x Arduino UNO + Netzteil, z.B. 6V mit Hohlstecker 2.1 mm (andere Ardunio-Versionen sind ebenfalls möglich, habe es aber damit nicht getestet)[/li][li]1x Reflexlichtschranke „Reflexions-Lichtschranke MRL 601“ vom großen C[/li][li]1x Vorwiderstand 100 Ohm für LED[/li][li]1x Pulldown-Widerstand 10 KOhm für Eingangs-Pin[/li][/ul]

Verbunden wird zunächst der Analogeingang A0 über den Pulldown-Widerstand mit dem Masse-Pin. Der Anschluss der Lichtschranke an den Arduino ist denkbar simpel: Die LED (beiligende Anschlussbelegung beachten) zwischen einem der Digitalpins und der Masse, mit in Reihe geschaltetem Vorwiderstand. Der Fototransistor zwischen dem +5V-Pin und Analogeingangs-Pin A0. Fertig ist die Laube!

Dann muss die Lichtschranke irgendwie mehr oder minder elegant am Zähler fixiert werden und zwar so, dass der kleine rote Zeiger pro Durchlauf einmal den Erfassungsbereich der Lichtschranke durchläuft. Zu beachten ist, dass das ganze zwecks Zählertausch abnehmbar gestaltet sein sollte. Die Abbildung zeigt meine eigene „Prototyp“-Lösung mit einem gerade greifbaren, unsanft bearbeiteten Honigdeckel. Das sollte man natürlich nach erfolgreichem Test noch mal hübsch machen, es funktioniert aber auch so schon.

Anschließend muss der Arduino-Quellcode hochgeladen werden. Das Modul führt ihn anschließend automatisch sofort aus. Die Einheit gibt daraufhin periodisch über die serielle Schnittstelle (gewrappt per USB-Chip FTDI) den Zählerstand der Einheit als JSON-Paket zurück. Hierbei werden nach kurzer Kalibrierung die Durchläufe des kleinen Zeigers gezählt, beginnend bei 0 pro Reset. Es muss also PC-seitig noch sichergestellt werden, dass der Zählerstand korrekt aufaddiert wird und nicht bei jedem Reset wieder von 0 beginnt.

Quellcode:


// Signalisierungs-LED für den Kalibrierungs-Status der Einheit
#define PIN_SIGNAL_LED 13
// Der Digital-Pin, an dem die LED der Lichtschranke hängt:
#define PIN_WATER_TX 11
// Der Analogeingangs-Pin, an dem der Fototransistor hängt:
#define PIN_WATER_RX 0

// Boolesche Variable, deren Status pro Schleifendurchlauf alterniert
boolean alternatingFlag = true;

// Variablen für die Auswertung der Lichtschranke und Impulszählung
int waterAbsOld = 0;
int waterAbs = 0;
int waterDiff = -1;
int waterDiffMin = 1023;
int waterDiffMax = 0;
int waterDiffRange = 0;
boolean waterCalibrating = true;
byte waterRedWheelPos = 0;
unsigned long waterCounter = 0;
byte waterCalibrationStatus = 0;

// Zählervariable für periodische Statusausgabe
int countLoop = 0;

// Eingabe-Byte
byte inpuptByte = 0;

void setup()
{
  Serial.begin(9600);
  
  pinMode(PIN_SIGNAL_LED, OUTPUT);
  pinMode(PIN_WATER_TX, OUTPUT);
}

void loop()
{
  delay(10);
  alternatingFlag = !alternatingFlag; 
  
  // Lichtschranken-LED flackern lassen
  digitalWrite(PIN_WATER_TX, alternatingFlag);
  delay(5);
  
  // einlesen des Analogwerts vom Fototransistor
  waterAbs = analogRead(PIN_WATER_RX);
  
  // Differenz ausrechnen zwischen LED aus und LED ein
  if(alternatingFlag) waterDiff = waterAbs - waterAbsOld;
  waterAbsOld = waterAbs;
  
  // Kalibrierung
  if(waterCalibrating && (waterDiff > 0))
  {
    if(waterDiff > waterDiffMax) waterDiffMax = waterDiff;
    if(waterDiff < waterDiffMin) waterDiffMin = waterDiff;
    waterDiffRange = waterDiffMax - waterDiffMin;
    
    digitalWrite(PIN_SIGNAL_LED, alternatingFlag);
  }
  else if(waterDiffRange < 100) digitalWrite(PIN_SIGNAL_LED, false);
  
  // wenn das rote Rädchen korrekt erfasst werden kann
  if(waterDiffRange >= 100)
  {
    // Position des Rädchens verfolgen (Messwert ähnelt einer Sinuskurve)
    switch(waterRedWheelPos)
    {
      case 0: // Minimum
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, false);
        if(waterDiff > (waterDiffMin + (waterDiffRange / 3))) waterRedWheelPos = 1;
        break;
      case 1: // steigend
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, false);
        if(waterDiff > (waterDiffMax - (waterDiffRange / 4))) waterRedWheelPos = 2;
        break;
      case 2: // Maximum
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, false);
        if(waterDiff < (waterDiffMax - (waterDiffRange / 3))) waterRedWheelPos = 3;
        break;
      case 3: // fallend
        if(!waterCalibrating) digitalWrite(PIN_SIGNAL_LED, true);
        if(waterDiff < (waterDiffMin + (waterDiffRange / 4)))
        {
          waterRedWheelPos = 0;
          waterCounter++;
          if(waterCalibrating) waterCalibrationStatus++;
          if(waterCalibrationStatus >= 3) waterCalibrating = false;
        }
        break;
    }
    
    // wenn ungewöhnlich hohe oder niedrige Messwerte erfasst werden, muss etwas
    // schiefgelaufen sein. Status entsprechend setzen.
    if(!waterCalibrating)
    {
      if(waterDiff < (waterDiffMin - (waterDiffRange / 5))) waterCalibrationStatus = 4;
      if(waterDiff > (waterDiffMax + (waterDiffRange / 5))) waterCalibrationStatus = 5;
    }
  }

  // Ausgabe des Zählerstands und Kalibrierungs-Status als JSON-String
  countLoop++;
  if(countLoop > 500)
  {
    Serial.print("{\"water\" : ");
    Serial.print(waterCounter);
    Serial.print(", \"wcalib\" : \"");
    switch(waterCalibrationStatus)
    {
      case 0: Serial.print("uncal"); break;
      case 1: Serial.print("learn"); break;
      case 2: Serial.print("learn"); break;
      case 3: Serial.print("ok"); break;
      default: Serial.print("error"); break;
    }
    Serial.println("\"}");
    countLoop = 0;
  }
  
  // Falls Daten empfangen werden, Eingabe unterscheiden
  while(Serial.available() > 0)
  {
    inpuptByte = Serial.read(); 
    switch(inpuptByte)
    {
      case 'C': // Neu kalibrieren
        waterDiffMin = 1023;
        waterDiffMax = 0;
        waterDiffRange = 0;
        waterCalibrating = true;
        waterCalibrationStatus = 0;
        break;
      case 'S': // sofort Status ausgeben
        countLoop = 10000;
        break;
      case 'E': // Fehlerstatus zurücksetzen
        if(waterCalibrationStatus > 3) waterCalibrationStatus = 3;
        break;
    }
  }
}

Falls noch Fragen offen sind, bitte stellen, dann überarbeite ich diese Anleitung!

Ein paar Hinweise noch:
-Anschlussleitung für die Lichtschranke verlängern und den Arduino in ein Gehäuse stecken müsste man natürlich auch noch machen. Insbesondere in einem feuchten Keller hat eine nackte Platine kein schönes Leben. Ich habe als Gehäuse eine Aludose verwendet, weil diese eine gewisse Abschirmung bietet.
-Die Lichtschranke ist teuer, nicht erschrecken. Sie „passt“ aber eben genau für unsere Anwendung hier und liefert eindeutige Ergebnisse.
-Der Arduino UNO kann natürlich auch noch ganz andere Dinge nebenbei erledigen. Er ist für diese Anwendung überqualifiziert. Bei mir ist er z.B. noch für die Türklingelanbindung und den Gaszähler zuständig und selbst dabei langweilt er sich noch…

Noch mal einen kleinen Nachtrag zum Thema Sensus PulsUnit:

Heute war hier in Hamburg eine Gebäudetechnik-Messe. Ich hatte zufällig Freikarten und habe mir das mal angesehen. Bei der Gelegenheit habe ich dann auch gleich mal jemanden von Sensus „geschnappt“ und nachgefragt, wie diese PulsUnit denn nun wirklich funktioniert.

Laut der Auskunft des Sensus-Mitarbeiters handelt es sich (also doch!) um eine optische Abtastung, die aber nur (und das geht wie ich finde aus den ganzen Broschüren die man so als PDF bekommt überhaupt nicht hervor) mit speziell dafür vorbereiteten Zählern funktioniert. Nass- oder Trockenläufer sei übrigens egal.

Sie hatten diese Zähler auch in der Auslage und sie verfügten natürlich über ganz spezielle „rote Rädchen“ mit einer reflektierenden Fläche, die bei Verwendung des PulsUnit-Aufsatzes dann auch automatisch an der richtigen Stelle liegt…

Wer also das Vergnügen noch nicht hatte, die PulsUnit mal mit seinem Zähler auszuprobieren: Spart euch die Anschaffung, außer wenn der Zähler von Sensus ist und über ein wie beschrieben ausgeführtes Rädchen verfügt!

Die gute Nachricht ist natürlich: Meine Bastellösung funktioniert bislang auch präzise und das ohne spezielles Rädchen :wink:

Na dann bin ich ja mal neugiering. Habe gerade die Teile bestellt. Nur den Deckel vom Honigglas gab es nirgens verfügbar…:stuck_out_tongue:

Wenn dir da eine schönere Lösung einfällt, wäre ich ebenfalls interessiert. Der WAF meines Honigdeckels ist denkbar gering.

Hab mir jetzt auch die Teile bestellt, aber versuch das ganze noch über ein Ethernet-Shield über LAN zu versenden. Mit USB bin ich seit 1-Wire auf Kriegsfuß…
Aber ne Frage zur Lichtschranke: hast du die bewusst unterhalb der Mittelachse des Zeigers positioniert? Ich hätte die jetzt genau auf die Achse des Zeigers ausgerichtet, so dass die Lichtschranke parallel zum Zeiger sitzt.

Gruß & Danke für die Info,
dfhome

Die Lichtschranke hat eine einfache Optik aus Kunststoff, die auf einen punktähnlichen Fleck in der Mitte zwischen IR-Diode und Fototransistor, einige Millimeter entfernt, fokussiert ist. Insofern dürfte es so wie du vorschlägst ebenso gut gehen. Die „Drehung“ der Lichtschranke ist nach meinen Tests relativ unerheblich.

So, die Bauteile (immer noch ohne Honigdeckel) sind komplett. Versuche das am Wochenende mal aufzubauen und werde berichten.

Wäre ja sehr interessiert, eine honigdeckelfreie Variante von einem etwas anspruchsvolleren Bastler zu sehen… :smiley:

Das dies mit einem X-beliebigen Wasserzähler funktioniert kann ich leider nicht bestätigen.

Mich haben die Stadtwerke Lünen kürzlich mit diesem Zähler beglückt.

Mein_Zaehler.jpg

Der verweigert sich bisher erfolgreich jedem Ausleseversuch.

Gruß,
Ralla