Welchen C-Code um Sensoren mit Pi4 auszulesen?

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Hallo Leute,


    ich lerne seit über einem Jahr C. Meine aktuelles Projekt ist eine Gewächshaus-Steuerung mit dem Pi4. Das Programm ist soweit fertig. Ich weiß jetzt aber nicht, mit welchen Code-Zeilen ich die Sensor-Werte auslesen kann. Hat jemand Erfahrung damit und kann mir helfen?

    - Sensor DS18B20

    - DHT22

    - BMP180

    - MI Flora Sensor

    :danke_ATDE: und Gruß Willi

  • Die Aussagen das Programm sei fertig und Du weisst nicht wie Du die Sensoren auslesen sollst, schliessen sich ja irgendwie gegenseitig aus. ?

    Was hast Du denn schon gemacht um herauszufinden wie man die jeweiligen Sensoren ansprechen kann? Liste doch mal wie man die jeweils anschliesst, welche Protokolle die ”sprechen” und welche C-Bibliotheken es dafür jeweils gibt. Oder wolltest Du jetzt einfach die komplette Recherche und vielleicht sogar noch die Programmierung hier anderen überlassen? ?

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

  • "Soweit" sollte ausdrücken, dass es fast fertig ist. Halt bis auf den Teil der Sensoreinbindung :conf:

    Bisher hab ich im Netz versucht was zu dem Thema zu finden. Für Python gibt es ja jede Menge Infos, aber für C finde ich das Angebot eher mäßig. Ich möchte deshalb jetzt auch nicht zu Python übergehen, sonder C weiter lernen, weil genau das mein Uranliegen war und ist.

    Bisher habe ich mich nur mit dem DHT22 beschäftigt, um mal einen Anfang zu schaffen. Laut Recherche soll man die Bibliothek "wiringPi.h" oder "pigpio" im Quelltext einbinden.

    Anschluss des Sensors: Pin1 mit 3,3 Volt und Widerstand belegen, Pin2 ist die Datenleitung zu GPIO 2 und Pin4 geht an Ground.

    Viel mehr konnte ich noch nicht herausfinden.

    Im Grunde würde ich mir gerne alles selber erarbeiten, wobei ich eine weitere Hilfestellung nicht ablehnen würde :)

    :helpnew: Ich nehme gern alle (Lese-)Tipps, Hinweise, Anleitungen, Scripts... an :helpnew:

  • Moin @all,

    wenn ich den Link "DHT22" in der Nachricht oben drüber klicke, sind mir im Code noch paar Sachen unklar. Es dreht sich alles um die for-Schleife von Zeile 91 bis 116:

    Warum läuft die Schleife 85 mal für 40 Bit Daten und warum werden die ersten 3 Durchgänge (i=0-i=3/meines Erachtens müsste das auch 'ignore 4 transitions' heißen) in Zeile 108 ausgespart?

    (Würden 4 (0-3) ausgespart, würde es Sinn machen, wenn nur jeder 2 Wert (i%2) gelesen und in den Speicherbytes gespeichert wird. Somit käme man auf 40 Bit Daten als 0 oder 1).

    Warum läuft die while-Schleife in Zeile 94, wenn true, 255 mal? Und warum wird sie für eine Microsekunde unterbrochen?

    (Die Unterbrechung wahrscheinlich, damit das nächste Bit vom Sensor gesendet wird, aber das mit "255" verstehe ich gar nicht. Hat das mit 2hoch8 Möglichkeiten zu tun oder doch mehr mit ASCII?).

    Den Code in Zeile 111 bis 113 verstehe ich auch nicht richtig.

    "dht22_dat[j/8] <<= 1" deute ich so, dass die ersten 8 Bit (j=0) von rechts nach links in das Speicherbyte geschoben werden. Und die zweiten 8 Bit halt in das 2. Speicherbyte (j=1). Die Zeilen 112 und 113 verstehe ich leider zu wenig, um dazu was zu schreiben.

    Schön wäre, wenn mir jemand (möglichst ausführlich) Licht in das Dunkel bringen könnte :danke_ATDE:

    Frohe Weihnachten!

  • > Warum läuft die Schleife 85 mal für 40 Bit Daten

    Weil es 80 Wechsel von 0 auf 1 gibt fuer 40 Bytes

    > Warum läuft die while-Schleife in Zeile 94, wenn true, 255 mal?

    Die laeuft nicht 255 mal so lange der Sensor reagiert. Die 255 sind der "Notausgang" wenn keine Flanke detektiert wird.

    > dht22_dat[j/8] <<= 1

    Macht Platz fuer das naechste Bit. Wenn das folgende if nicht erfuellt ist, bleibt das Bit 0.

  • Es gibt noch ein Problem beim Programm für den DHT22 (Link siehe oben) :

    Wenn ich das Programm bei "Geany" kompiliere, bekomme ich keine Fehlermeldung. Aber wenn ich das Programm kompilieren und starten will, bekomme ich die Fehlermeldung (s.u.), dass die Bibliothek "wiringPi.h", (mit allen im Programm verwendeten Befehlen) nicht erkannt wird.

    Hab mich jetzt länger mit dem gesamten Programm auseinander gesetzt und speziell mit dem Bibliotheks-Fehler, allerdings ohne positivem Ergebnis.

    Hat jemand eine Tipp, wie ich das Problem in den Griff bekomme?

    gcc -Wall -o "DHT22" "DHT22.c" (im Verzeichnis: /home/robert/Pi Code)

    /usr/bin/ld: /tmp/ccjEjxzb.o: in function `read_dht22_dat':

    DHT22.c:(.text+0x138): undefined reference to `pinMode'

    /usr/bin/ld: DHT22.c:(.text+0x144): undefined reference to `digitalWrite'

    /usr/bin/ld: DHT22.c:(.text+0x14c): undefined reference to `delay'

    /usr/bin/ld: DHT22.c:(.text+0x158): undefined reference to `digitalWrite'

    /usr/bin/ld: DHT22.c:(.text+0x160): undefined reference to `delayMicroseconds'

    /usr/bin/ld: DHT22.c:(.text+0x16c): undefined reference to `pinMode'

    /usr/bin/ld: DHT22.c:(.text+0x198): undefined reference to `delayMicroseconds'

    /usr/bin/ld: DHT22.c:(.text+0x1ac): undefined reference to `digitalRead'

    /usr/bin/ld: DHT22.c:(.text+0x1dc): undefined reference to `digitalRead'

    /usr/bin/ld: /tmp/ccjEjxzb.o: in function `main':

    DHT22.c:(.text+0x4fc): undefined reference to `wiringPiSetup'

    collect2: error: ld returned 1 exit status

    Kompilierung fehlgeschlagen.

    22.c" (im Verzeichnis: /home/

    Kompilierung fehlgeschlagen.gcc -Wall -o "DHT22" "DHT22.c" (im Verzeichnis: /home/robert/Pi Code)

    /usr/bin/ld: /tmp/ccjEjxzb.o: in function `read_dht22_dat':

    DHT22.c:(.text+0x138): undefined reference to `pinMode'

    /usr/bin/ld: DHT22.c:(.text+0x144): undefined reference to `digitalWrite'

    /usr/bin/ld: DHT22.c:(.text+0x14c): undefined reference to `delay'

    /usr/bin/ld: DHT22.c:(.text+0x158): undefined reference to `digitalWrite'

    /usr/bin/ld: DHT22.c:(.text+0x160): undefined reference to `delayMicroseconds'

    /usr/bin/ld: DHT22.c:(.text+0x16c): undefined reference to `pinMode'

    /usr/bin/ld: DHT22.c:(.text+0x198): undefined reference to `delayMicroseconds'

    /usr/bin/ld: DHT22.c:(.text+0x1ac): undefined reference to `digitalRead'

    /usr/bin/ld: DHT22.c:(.text+0x1dc): undefined reference to `digitalRead'

    /usr/bin/ld: /tmp/ccjEjxzb.o: in function `main':

    DHT22.c:(.text+0x4fc): undefined reference to `wiringPiSetup'

    collect2: error: ld returned 1 exit status

    Kompilierung fehlgeschlagen.

  • Hallo Willi3

    Wenn Du den Raspberry in C programmieren willst, kann ich Dir dazu die Entwicklungsumgebung VisualStudio dringend empfehlen.

    Dagegen kannst Du Geany und Eclipse vergessen.

    Die liefern Dir bei der Installation sogar ein Projekt für den Rasperry dazu. In dem Projekt wird mittels WiringPi eine Leuchtdiode zum blinken gebracht.

    In das Projekt kannst Du dann Deinen Code einfügen.

    Damit kannst Du Deinen Code debuggen, "Breakpoints on the fly" auf Programmadressen als auch beim Zugriff auf Speicheradressen.

    Variablen sichten und ändern.

    Und alles funktioniert letztlich via gcc, g++ und gdb auf dem Raspberry, Colibri, Linux-PCs usw.

    Und mit C kannst Du immer den schnellsten und effizientesten Code schreiben.

    Übrigens, im angehängten Bild debugge ich ein Projekt in einen Rasperry der etliche Kilometer entfernt ist via Wireguard-Tunnel und Cellular-Modem,

    ohne mich mit den Jungs von der IT im Zielobjekt rumärgern zu müssen. :)

  • Prittzl Da wird versucht eine Objekt-Datei auszuführen, das Berechtigungsproblem ist nicht der Benutzer, sondern das die nicht ausführbar sind. Und das *sind* sie ja auch *nicht*. Selbst wenn sie es währen, was sollte es dann bringen das auszuführen, mit einer Option die eindeutig für den Compiler oder Linker gedacht ist. Das ist einfach Unsinn was da versucht wird.

    “Dawn, n.: The time when men of reason go to bed.” — Ambrose Bierce, “The Devil's Dictionary”

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!