Seite 1 von 1

Impulse zählen?

Verfasst: Do Jul 18, 2019 4:30 pm
von Zugschlus
Hallo,

jetzt sitze ich hier mit meinem chinesischen Regenmesser mit Wippe und Reedkontakt, der bei jedem Kippen der Wippe einmal kurz durchschaltet, und meinem Wiregate Multi I/O Interface. Der Wolf hat es ordentlich erkannt, und wenn ich mir jetzt das 1Wire-Interface vom Wolf anschaue:

Bild

dann dämmert's mir, dass das Multi I/O Interface womöglich gar keine Impulse zählen kann sondern nur Pegel in Meldungen umwandelt und der Timberwolf, der z.B. den Port alle 30 Sekunden abfragt, einen zwischendrin vorbeigekommenen Impuls gar nicht mitbekommt, weil der Reedkontakt einfach nur einmal kurz durchschaltet und dann wieder in den Grundzustand zurückfällt.

Wie ist die kanonische Lösung für "Impulseingang in Timberwolf"?

Grüße
Marc

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 4:40 pm
von jensgulow
KNX-Tasterschnittstelle z.B. Gira 111800 .... die zählt Impulse und sendet nach x sec. den Wert und stellt dann den Zähler zurück

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 4:58 pm
von Zugschlus
jensgulow hat geschrieben: Do Jul 18, 2019 4:40 pm KNX-Tasterschnittstelle z.B. Gira 111800 .... die zählt Impulse und sendet nach x sec. den Wert und stellt dann den Zähler zurück
Da draußen hab ich kein KNX, und will auch keins haben (jedenfalls nicht ohne Linienkoppler), und für den Spielkram hab ich auch kein dreistelliges Budget.

Eher wird das dann mein erstes Arduino-Projekt. Wie bekomme ich denn Daten aus einem Arduino in den Wolf?

Grüße
Marc

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 5:38 pm
von dreanaught
Hallo Marc,

der 1-Wire Sensor von Multi I/O unterstützt (zumindes theoretisch, ich hab das noch nicht validiert) latching.
Das heißt, er könnte sich merken, dass der IO einmal gewechselt hat, jetzt aber wieder in der Ausgangsstellung ist.

In wieweit das über den TW bzw. Busmaster konfigurierbar bzw. abfragbar ist weis ich leider noch nicht.
Ich hoffe mal das die Wippe nicht im sekunden-Takt kippt. Sonst wird es mit der Abfrage-Kadenz also der Frequenz in der der Sensor ausgelesen wird schwierig. Siehe
dreanaught hat geschrieben: Fr Jul 12, 2019 7:10 am Je nachdem wie "schnell" die Impulse kommen, könnte man möglicherweise die im Chip verbaute latch-Funktion verwenden. Dann muss aber die Anzahl der Abfragen des Zustands am IO in einer höheren Frequenz erfolgen als die Impulse von dem Sensor ausgelöst werden.
Steigt die Impulsfrequenz, über die Abfrage-Frequenz "verlierst" du Impulse...
Hier das Datasheet vom DS2413
Grüße,
Markus

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 7:15 pm
von Zugschlus
Die Wippe kippt einmal pro ~ 2 ml. Meine Idee wäre, die Fläche so weit zu vergrößern, dass ich einen Klick pro 30 ml pro m² bekomme. Bei einem Wolkenbruch mit 60 l pro m² in zehn Minuten wären das schon drei Klicks pro Sekunde, aber wann hat man schon so einen Wolkenbruch?

Ich glaube, ich mach daraus mal mein erstes Arduino-Projekt und kippe die Daten erstmal in den Volkszähler, so lange der Timberwolf noch keine Möglichkeit hat, Daten über Ethernet anzunehmen.

Grüße
Marc

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 7:51 pm
von Advenoni
Hallo Marc,

ich habe bei mir ein ähnliches Projekt. Wandle ein PWM-Signal eines CO2-Sensors, kein VOC in einem Arduino in einen Temperaturwert um.
Den Temperaturwert schicke ich dann über eine 1-Wire-Simulation an den TWS.
Ähnliches sollte mit dem Regensensor (der kommt bei mir hoffentlich noch diese Woche) auch möglich sein.

Gruß,
Martin

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 8:00 pm
von Zugschlus
1-Wire-Simulation? Das klingt interessant, erklär mal.

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 8:10 pm
von Advenoni
Geht im großen und ganzen über ne fertige Bibliothek. Einschränkung hier ist allerdings, dass wegen dem Timing während der 1-Wire-Kommunikation alle Interrupt deaktiviert sein müssen. Ich denke aber fast, dass zur Erfassung der Impulse kein Interrupt nötig sein dürfte.
Da bei mir der Sensor seinen Wert jede Sekunde aktualisiert, mich der Wert aber eigentlich nur alle 5 Minuten interessiert war es mir egal.
Habe aber zur Sicherheit noch das deutlich schwankendere Analogsignal des Sensor mit ausgewertet.
Das Arduino-Programm ist dann recht übersichtlich:

Code: Alles auswählen

#include <DS18B20.h>
#include <OneWireHub.h>

volatile unsigned long aktueller_Impuls;
volatile unsigned long letzter_positiver_Impuls;
volatile unsigned long letzter_negativer_Impuls;
unsigned long letzter_negativer_Impuls_sp;
volatile unsigned long Impuls_high;
volatile unsigned long Impuls_low;

const unsigned long Aufloesung=5000;
const unsigned long Min_high=2;
const unsigned long Min_low=2;
const int PWM_Eingang=2;
const unsigned long Timeout=1500;
const int Analog_Eingang=0;
const unsigned long Analog_min=82; //~0,4V
const unsigned long Analog_max=409; //~2V
const int LED=13;
bool LED_Ausgang;

volatile unsigned long CO2_PWM;
unsigned long CO2_PWM_sp;
unsigned long CO2_Analog;
unsigned long CO2_Analog_sp;
unsigned long CO2_Analog_Diff=300;
float CO2_real;

const uint8_t pin_onewire   { 3 };

auto hub    = OneWireHub(pin_onewire);

auto ds18b20_pwm = DS18B20(0x28, 0x8F, 0xBD, 0x2A, 0x07, 0x00, 0x02); // DS18B20: Auswertung PWM
auto ds18b20_analog = DS18B20(0x28, 0x8F, 0xBD, 0x2A, 0x07, 0x00, 0x01); // DS18B20: Auswertung Analog

void setup() {
  Serial.begin(9600);
  pinMode(PWM_Eingang, INPUT);
  pinMode(LED, OUTPUT);
  // Interrupt definieren
  attachInterrupt(digitalPinToInterrupt(PWM_Eingang), Zaehlen, CHANGE);
  hub.attach(ds18b20_pwm);
  hub.attach(ds18b20_analog);
  Serial.println("Setup beendet");
}

void Zaehlen() { 
  aktueller_Impuls = millis();
  if (digitalRead(PWM_Eingang)) {
    Impuls_low = aktueller_Impuls - letzter_negativer_Impuls;
    letzter_positiver_Impuls = aktueller_Impuls;
  }
  else {
    Impuls_high = aktueller_Impuls - letzter_positiver_Impuls;
    letzter_negativer_Impuls = aktueller_Impuls;
  }  
}

void loop() {
  hub.poll();
  if ((letzter_negativer_Impuls_sp != letzter_negativer_Impuls) && (Impuls_high > 0 ) && (Impuls_low > 0) && (Impuls_high < 1000 ) && (Impuls_low < 1000) && (Impuls_high + Impuls_low > 1000) && (Impuls_high + Impuls_low < 1010)) {
    CO2_PWM = Aufloesung * (Impuls_high - Min_high) / (Impuls_high + Impuls_low - Min_high - Min_low);
    letzter_negativer_Impuls_sp=letzter_negativer_Impuls;
  }
  CO2_Analog = (analogRead(Analog_Eingang) - Analog_min) * Aufloesung / (Analog_max - Analog_min);

  if (CO2_PWM_sp!=CO2_PWM) {
    LED_Ausgang = !LED_Ausgang;
    digitalWrite(LED, LED_Ausgang);
    CO2_PWM_sp = CO2_PWM;
    // (CO2_real+55)*36
    // CO2_real*40
    CO2_real = (float)CO2_PWM / 40.0;
    ds18b20_pwm.setTemperature(CO2_real);
  }
  else if (abs(CO2_Analog-CO2_Analog_sp)>CO2_Analog_Diff) { 
    CO2_Analog_sp = CO2_Analog;
    // (CO2_real+55)*36
    CO2_real = (float)CO2_Analog / 40.0;
    ds18b20_analog.setTemperature(CO2_real);
  }
}
Gruß,
Martin

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 8:19 pm
von Zugschlus
Und der 1-Wire-Bus hängt dann direkt auf einem GPIO-Pin oder is da noch elektrische Beschaltung notwendig?

Re: Impulse zählen?

Verfasst: Do Jul 18, 2019 8:22 pm
von Advenoni
Hängt direkt drauf