C++: Temperatur auslesen

  • Hallo RPi Forum,
    Bin gerade dabei ein C++ (wiringPi) Programm zu schreiben das die Temperatur in "/sys/class/thermal/Thermal_zone0/temp" ausliest und dann je nach Temperatur Lämpchen ein und ausschaltet. Leider funktioniert das Programm nicht und ich finde den Fehler nicht. Beim start des Programmes passiert einfach nichts (richtig angeschlossen), aber ich glaube aber das der Pfad zur Datei nicht geht. Welche andere Methode ich verwenden kann um die Temperatur zu bekommen (Außer einem Sensor) weiß ich nicht. Ich hoffe ihr könnt mir helfen...

    Hier der Source Code (wiringPi):

    #include <wiringPi.h>
    #include <iostream>
    #include <fstream>
    #include <string>

    using namespace std;

    int main()
    {
    pinMode(0, OUTPUT);
    pinMode(1, OUTPUT);
    pinMode(2, OUTPUT);

    ifstream datei;
    string temptext;
    int temperatur;
    int pin = 0;

    while(1)
    {

    datei.open("/sys/class/thermal/thermal_zone0/temp", ios::in);

    while(!datei.eof())
    {
    getline(datei, temptext);
    }

    temperatur = atoi(temptext.c_str());
    temperatur = static_cast<int>((temperatur / 1000));

    if(temperatur <= 30)
    {
    digitalWrite(pin, LOW);
    pin = 0;
    digitalWrite(0, HIGH);
    }

    if(temperatur > 30 && temperatur < 50)
    {
    digitalWrite(pin, LOW);
    pin = 1;
    digitalWrite(1, HIGH);
    }

    if(temperatur >= 50)
    {
    digitalWrite(pin, LOW);
    pin = 2;
    digitalWrite(2, HIGH);
    }
    }

    return 0;
    }

    Ich danke euch schon mal für eure Antworten

    Max

    Einmal editiert, zuletzt von Maxtheprinz (9. August 2013 um 01:08)


  • Hallo RPi Forum,
    Bin gerade dabei ein C++ (wiringPi) Programm zu schreiben das die Temperatur in "/sys/class/thermal/Thermal_zone0/temp" ausliest und dann je nach Temperatur Lämpchen ein und ausschaltet. Leider funktioniert das Programm nicht

    ...

    Max

    Hi,
    ich kann jetzt ad hoc keinen Fehler finden ... aber ich denke, Du kommst selber drauf, wenn Du Dir vorstellst, dass die Schleife einige Millionen mal pro Sekunde durchlaufen wird.

    cu,
    -ds-

  • @Maxtheprinz

    Als erstes solltest du als Anfänger soviel Fehler Meldungen einbauen wie geht...
    Die schleife wird bei unserer Taktrate ca. 40.000 bis 50.000 mal pro Sekunde durchlaufen.
    Dein fehler ist hier...

    [font="Courier New"]while(!datei.eof())[/font]
    [font="Courier New"] {[/font]
    [font="Courier New"] getline(datei, temptext);[/font]
    [font="Courier New"] }
    [/font]
    Die zweite Zeile kann leer sein!
    Hier der richtige weg...


    [font="Courier New"]#include <iostream>[/font]
    [font="Courier New"]#include <fstream>[/font]
    [font="Courier New"]#include <string>[/font]
    [font="Courier New"]using namespace std;[/font]


    [font="Courier New"]/* Entry Point */[/font]
    [font="Courier New"]int main (int argc, char **argv)[/font]
    [font="Courier New"]{[/font]
    [font="Courier New"] ifstream datei;[/font]
    [font="Courier New"] int temperatur;[/font]
    [font="Courier New"] string text;[/font]
    [font="Courier New"] int abort = 0;[/font]

    [font="Courier New"] while ((abort != 1))[/font]
    [font="Courier New"] {[/font]
    [font="Courier New"] datei.open("/sys/class/thermal/thermal_zone0/temp", ios::in);[/font]
    [font="Courier New"] if ((datei.fail()))[/font]
    [font="Courier New"] {[/font]
    [font="Courier New"] cout << "Konnte datei nicht öffnen!";[/font]

    [font="Courier New"] return 0;[/font]
    [font="Courier New"] }[/font]

    [font="Courier New"] /* Zeiger Position immer auf 0, wir haben nur eine Zeile zum lesen ... */[/font][font="Courier New"]
    datei.seekg (0, datei.beg);[/font]

    [font="Courier New"] getline(datei, text);[/font]

    [font="Courier New"] temperatur = atoi(text.c_str());[/font]

    [font="Courier New"] temperatur = temperatur / 1000;[/font]

    [font="Courier New"] cout << temperatur << "\n";[/font]

    [font="Courier New"] datei.close();[/font]

    [font="Courier New"] sleep(1);[/font]
    [font="Courier New"] }[/font]


    [font="Courier New"] //::getchar();[/font]
    [font="Courier New"] return 0;[/font]
    [font="Courier New"]}
    [/font]

    den Rest schaffst du alleine und
    Normalerweise macht man auch in keiner schleife eine Datei auf…

    grüße und viel Glück
    Andreas

    Einmal editiert, zuletzt von Teamdevel (9. August 2013 um 13:32)

  • Da kriege ich beim Kompilieren eine Fehlermeldung:

    Code
    root@raspberrypi ~ > g++ -o temp temp.cpp
    temp.cpp: In function 'int main(int, char**)':
    temp.cpp:33:39: error: 'atoi' was not declared in this scope
    root@raspberrypi ~ >

    Es fehlt also noch:

    #include <stdlib.h>

    Würde dann komplett so aussehen:

    /EDIT:
    Dazu hätte ich aber auch die Frage wie man sich dort Nachkommastellen anzeigen lässt?
    Mein bisheriger Versuch war "temperatur" durch 1000.0 zu teilen aber das funktioniert nicht :(

  • Versuch mal Datei zu inkludieren ...
    Hab leider kein board oder was hier zum testen!

    [font="Courier New"]#include <stdlib.h> /* atoi */

    Man kann auch noch das testen ...

    Globaler Namensraum …

    ::atoi

    Und der std namespace beinhaltet normalerweise alle ANSI C Funktionen
    aber da kann es Abweichungen geben.

    std::atoi

    da hat jede runtime (eglibc, glibc, uclibc) so seine eigenheiten...

    grüße
    Andreas
    [/font]

    Einmal editiert, zuletzt von Teamdevel (9. August 2013 um 13:01)

  • Sooo fit bin ich in C++ auch noch nicht - verstehe gerade nur Bahnhof :D

    Aber wie auch immer, mit dem #include <stdlib.h> funktioniert es dann ja auch ;)


    Dazu hätte ich aber auch die Frage wie man sich dort Nachkommastellen anzeigen lässt?
    Mein bisheriger Versuch war "temperatur" durch 1000.0 zu teilen aber das funktioniert nicht :(

    Code
    temperatur = (float)temperatur / 1000.0;


    Ausgabe ist leider weiterin ohne Kommastellen

  • Du versuchst den Typ der variable zu ändern...
    stichwort Typisierung

    Das ganze nochmal ...

    [font="Courier New"]#include <iostream>[/font]
    [font="Courier New"]#include <fstream>[/font]
    [font="Courier New"]#include <string>[/font]
    [font="Courier New"]#include <stdlib.h>[/font]
    [font="Courier New"]using namespace std;[/font]


    [font="Courier New"]/* Entry Point */[/font]
    [font="Courier New"]int main (int argc, char **argv)[/font]
    [font="Courier New"]{[/font]
    [font="Courier New"] ifstream datei;[/font]
    [font="Courier New"] int temperatur;[/font]
    [font="Courier New"] float variable1;[/font]
    [font="Courier New"] string text;[/font]
    [font="Courier New"] int abort = 0;[/font]

    [font="Courier New"] while ((abort != 1))[/font]
    [font="Courier New"] {[/font]
    [font="Courier New"] datei.open("/sys/class/thermal/thermal_zone0/temp", ios::in);[/font]
    [font="Courier New"] if ((datei.fail()))[/font]
    [font="Courier New"] {[/font]
    [font="Courier New"] cout << "Konnte datei nicht öffnen!";[/font]
    [font="Courier New"]
                /* Man könnte hier auch break nehmen um die schleife abzubrechen. */[/font]
    [font="Courier New"] /* break; */[/font][font="Courier New"]
                return 0;[/font]
    [font="Courier New"] }[/font]

    [font="Courier New"] /* Zeiger Position immer auf 0, wir haben nur eine Zeile zum lesen ... */[/font]
    [font="Courier New"] datei.seekg (0, datei.beg);[/font]

    [font="Courier New"] getline(datei, text);[/font]

    [font="Courier New"] temperatur = atoi(text.c_str());[/font]

    [font="Courier New"] variable1 = ((float)temperatur) / 1000.0f;[/font][font="Courier New"]

    /* Wenn er hier keine nach Komma stellen anzeigt, versucht */
    /* printf("%f\n", variable1); */[/font][font="Courier New"]

    cout << variable1 << "\n";[/font]

    [font="Courier New"] datei.close();[/font]

    [font="Courier New"] sleep(1);[/font]
    [font="Courier New"] }[/font][font="Courier New"]

    /* Mit break geht es hier weiter mit der ausführung. */[/font]
    [font="Courier New"]
        //::getchar();[/font]

    [font="Courier New"] return 0;[/font]
    [font="Courier New"]}


    [/font]
    @meigrafd
    Gerne...


    Noch was, also wen ihr noch beim Lernen seid, kompiliert
    Mit der Option –Wall, dann gibt euch der gcc alle Warnungen aus.
    Da sind auch ein paar dabei die könnt ihr getrost ignorieren.
    z.B. dass die variable definiert wurde aber nicht benutzt.
    Das könnt ihr auch mit –Wno-unused-variable abstellen.
    Aber ihr seht wo was nicht stimmt.

    Ein paar möglichkeiten…

    -Wno-unused-function
    -Wno-unused-label
    -Wno-unused-parameter
    -Wno-unused-value
    -Wno-unused-variable

    Also z.B.

    g++ -Wall -Wno-unused-variable -o temp temp.cpp


    grüße

    Einmal editiert, zuletzt von Teamdevel (9. August 2013 um 14:27)

  • Teamdevel

    Danke für deine Hilfe, das Programm funktioniert und die LED leuchten wann sie sollen. Habe die Öffnung der Datei in der while Schleife nur aus dem Grund gemacht da die Öffnung alle paar Sekunden erfolgen soll, sodass sich sie Temperatur immer wieder aktualisiert. Wenn man hinten ein Delay einbaut geht es ja und man reduziert den Zugriff auf alle 2 Sekunden.

    Danke nochmal

    Max

  • Ich habe einen Temperatursensor DS18B20 und möchte dort auch mittels C++ die Sensordaten auslesen.
    Die Zieldatei ist zweizeilig und vom folgenden Syntax:

    Code
    86 01 4b 46 7f ff 0a 10 5e : crc=5e YES 
    86 01 4b 46 7f ff 0a 10 5e t=24375

    Wie kann ich nun den Temperaturwert t=24375 einlesen?

    Gruß


  • Wie kann ich nun den Temperaturwert t=24375 einlesen?

    Ganz einfach!
    In dem Du z.B. die Temp. Datei zeilenweise einliest und Dir dann die Werte, aus der Zeile in der das t-24375 stehen verarbeitest.
    Wie man so etwas prinzipiell angeht, siehst Du zum größten Teil in den vorangegangenen Postings.

  • Ganz einfach!
    In dem Du z.B. die Temp. Datei zeilenweise einliest und Dir dann die Werte, aus der Zeile in der das t-24375 stehen verarbeitest.
    Wie man so etwas prinzipiell angeht, siehst Du zum größten Teil in den vorangegangenen Postings.

    Hi,

    ich bin noch ziemlich neu hier und habe meinen Pi noch nicht so lange.
    Soweit habe ich den Code auch verstanden nur meine Frage wäre jetzt, wie man den Wert nach dem t= auslesen kann? Wahrscheinlich bin ich ein wenig zu doof zum suchen, denn bis jetzt habe ich noch nix dazu gefunden.
    Ich weiß nämlich nicht, wie ich jetzt zeilenweise auslesen kann. :s

    Wäre super wenn da jemand helfen könnte. :)

    Danke

    Einmal editiert, zuletzt von Schlupp_Ing (18. September 2016 um 16:58)

  • > Ich weiß nämlich nicht, wie ich jetzt zeilenweise auslesen kann. :s

    Dann waere es besser, es mit einer einfacheren Sprache zu versuchen!

    C++ braucht viel Zeit um sich einzuarbeiten und ist schwer zu beherrschen :fies:


  • > Ich weiß nämlich nicht, wie ich jetzt zeilenweise auslesen kann. :s

    Dann waere es besser, es mit einer einfacheren Sprache zu versuchen!

    C++ braucht viel Zeit um sich einzuarbeiten und ist schwer zu beherrschen :fies:


    Danke, ich werde mir das heute mal angucken.
    Ich weiß, dass C++ nicht die einfachste Sprache ist, aber ich möchte es gleich von Anfang an lernen. Ich habe mir auch schon Bücher geholt und ein Video Tutorial mit dem ich mir das Stück für Stück beibringe.

    Dennoch danke für deine Hilfe. :)

Jetzt mitmachen!

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