Einbindung Ultrasound_HC_SR04Firmata

Begonnen von Bjoern777, 15 Januar 2017, 08:49:02

Vorheriges Thema - Nächstes Thema

Bjoern777

Hallo zusammen,

hier wiedermal das Thema Ermittlung des Wasserstandes einer Zisterne.
Ich habe mir schon diverse Anleitungen angesehen, aber irgendwie ist für mich das passende nicht dabei gewesen (oder ich hab's einfach nicht gefunden).

Im Keller werkelt ein RPi mit FHEM, der über KNX/I2C Komponenten die Hausautomation übernimmt. An den Pi will ich einen Arduino mit Firmata per USB anschliessen, der kabelgebunden den Füllstand der Zisterne ermittelt, die Gasuhr und den Wasserzähler über S0 ausliest.

Rausgefunden habe ich, dass die Anbindung von Ultraschallsensoren über Firmata nicht "einfach so" funktioniert. Für Snap4Arduino gibt es eine modifizierte Firmata Version, die scheinbar ein neues sysex command implementiert:

[...]
  case 0x08: //Get the distance
    Serial.write(START_SYSEX);
    Serial.write(STRING_DATA);
    pinMode(9,OUTPUT);
    pinMode(8,INPUT);
    Serial.println(ultrasonic.Ranging(CM)); //ultrasonic.Ranging(CM)
    Serial.write(END_SYSEX);
[...]

In dem Beispielprogramm für Snap4Arduino sieht die Abfrage so aus:

this.arduino.board.sp.write(new Buffer([0xF0, 0x08, 0xF7]));

0xF0 => Start
0x08 => Wert abfragen
0xF7 => Ende

Was müsste ich in FHEM tun, damit die Werte nutzbar werden?

Vielen Dank für eure Hilfe!

Bjoern777

Hallo zusammen,

habe mir jetzt mal das Firmata Perl Modul angesehen. Da ist ein interessantes Bsp. für die Anbindung eines DHT11 Sensors dabei.
Das habe ich geändert, um die Werte erstmal per Perl Programm aus dem Arduino rauszubekommen. Irgendwie funktioniert das aber auch noch nicht

#!/usr/bin/perl

use strict;
use warnings;
use Device::Firmata::Constants qw/ :all /;
use Device::Firmata;

use constant US_CMD => 0x08;

$Device::Firmata::DEBUG = 1;

my $device = Device::Firmata->open('/dev/ttyUSB0')
  or die "Could not connect to Firmata Server";

$device->observe_sysex( \&onSysexMessage, undef );
$device->observe_string( \&onStringMessage, undef );

$device->sampling_interval(1000);

$device->sysex_send( US_CMD );

sub onSysexMessage {
    my $sysex_message = shift;

    my $command = $sysex_message->{command};
    my $data = $sysex_message->{data};

    print "command: $command\n";
    print "data: $data\n";

}

sub onStringMessage {
    my $string = shift;
    print "string: $string\n";
}


Als Ergebnis kommt

>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,79,f7
>f0,7a,68,07,f7
>f0,f0,f7
>f0,08,f7
>f0,f7,f7

Ich hätte erwartet, dass eine von den on* Funktionen aufgerufen wird. Alles noch sehr komisch... :(