NEWS
(gelöst) I2C-Drucksensor, C-Programm, Einbindung in IoBroker
-
Die Lösung hierzu hat sich in folgendem Beitrag entwickelt:
https://forum.iobroker.net/topic/77667/gelöst-c-programm-auf-slave-mit-rückgabewert-ausführen
Hallo zusammen,
Ich besitze einen I2C-Drucksensor welcher aktuell mit einem C-Programm unter Python auf einem Raspberry abgerufen wird. Das Programm funktioniert seit mehreren Jahren. Derzeit bin ich dabei auf IoBroker umzustellen und weiß nicht wie ich diesen Sensor einbinden kann.
Das C-Programm bekam ich damals zusammen mit dem Sensor. Bin jedoch selber nicht in der Lage das Programm auf Javascript umzustellen oder das C-Programm über Blockly aufzurufen.
Den Druckwert rufe ich aktuell nur 4x am Tag auf, da sich hier nur wenig ändert.Mein IoBroker besteht aus einem Nuc alsMaster und einem Raspberry als Slave. I2C habe ich als Adapter installiert und er läuft schon mit einem PWM - Modul. Die Adresse des Drucksensors mit 0x76 wird sowohl vom Raspberry wie auch vom IoBroker erkannt. Nur was ich in der Instanz unter Generic einstellen muss, weiß ich nicht.
Mein Wunsch ist es, entweder die I2C - Instanz richtig auszufüllen, das C-Programm in Javascript umzuschreiben oder das C-Programm unter Blockly aufzurufen. Kann mir bitte jemand hierbei helfen oder die richtige Richtung zeigen. Gerne bin ich auch für andere Lösungsvorschläge offen.
Falls es wichtig ist. Der Drucksensor hängt an einer CO2 - Flasche welche ich zur Düngung an meinem Aquarium verwende.
Das C-Programm lautet:
#include "stdlib.h" #include "stdio.h" #include "fcntl.h" #include "stdint.h" #include "linux/i2c-dev.h" char buf[4] = { 0, 0, 0, 0 }; double data; char channel; uint16_t *wPtr; const int addr = 0x76; //i2c address of DRTR int file; char *filename = "/dev/i2c-1"; int main() { printf("Open %s\n", filename); if ((file = open(filename, O_RDWR)) < 0) { printf("Failed to open i2c"); exit(EXIT_FAILURE); } printf("Ok, now try access the device..\n"); if (ioctl(file, I2C_SLAVE, addr) < 0) { printf("Failed to access device\n"); exit(EXIT_FAILURE); } printf("Successfull, try to read 2 bytes\n"); wPtr = (uint16_t*)buf; while(1) { if (read(file, buf, 2) != 2) { printf("Failed to read from %s\n", filename); exit(EXIT_FAILURE); } else { data = 0x7FFF & (((int)buf[0]) * 256 + buf[1]); data = data * (100 - 0) / 0x7FFF; //0..100bar // printf("Received data: %02x%02x %.2f\n", buf[0], buf[1], data); printf("Received data: %.2f\n", data); } sleep(1); } exit(EXIT_SUCCESS); }
Ich gehe davon aus, dass hier alle Informationen drin stehen. Nur ich finde bzw. verstehe diese nicht.
Wenn weitere Informationen notwendig sind, kann ich die liefern.
Viele Grüße
Ralf -
Es gibt einen i2c-Adapter. Kommst du mit dem nicht weiter?
https://github.com/UncleSamSwiss/ioBroker.i2c
Ist auch schon geraume Zeit stabil:
github: 1.2.1 latest: 1.2.1 for 36 months stable: 1.2.1 for 36 months
-
@thomas-braun
Hallo,
ja, diesen habe ich wie geschrieben mit anderer Hardware bereits am laufen.Wenn ich in diesem ein generisches Gerät anlege, weiß ich nicht was ich unter Register und Datentyp eintragen muss. Meine Test waren bis jetzt erfolglos.
Gruß Ralf -