Anfänger 1-wire DS1820

  • So ich war im Urlaub und bin jetzt erst wieder dazu gekommen. Ich muß zugeben das ich null Ahnung von c bzw c++ habe. Nur ein wenig php selbst beigebracht. Ich hab den Link mal betrachtet. Das sah vielversprechend aus und ich hab mir das mal umgeschieben. Momenten funktioniert das auch. Fehlt noch das schreiben in eine mysql-Datenbank.


    Ich will mal gucken das ich das umschreibe und integriere:


    Was muß ich unbedingt dabei beachten? Tips werden gerne angenommen.

    Einmal editiert, zuletzt von mr-brain (28. Juni 2015 um 18:23)

  • Hallo und guten abend,

    bin mal wieder zurück.

    Folgenden Code habe ich hier und sonstwo im Netz gefunden. Wenn ich zwei 1wire angesteckt habe wird die ID beider ausgegeben aber leider nur 1 Temperatur. Was ist denn falsch.

    Kann mir jemand helfen.
    #include <iostream>
    #include <fstream>
    #include <string>
    #include <stdlib.h>
    #include <cstdio>
    #include <dirent.h>

    using namespace std;


    /* Entry Point */
    int main (int argc, char **argv)
    {
    ifstream datei;
    int temperatur;
    int gefunden;
    float variable1;
    string teilstring;
    string text;

    int abort = 0;

    while ((abort != 1))
    {
    datei.open("/sys/bus/w1/devices/28-000003aa64a7/w1_slave", ios::in);
    if ((datei.fail()))
    {
    cout << "Konnte datei nicht öffnen!";

    /* Man könnte hier auch break nehmen um die schleife abzubrechen. */
    /* break; */
    return 0;
    }

    /* Zeiger Position immer auf 0, wir haben nur eine Zeile zum lesen ... */
    datei.seekg (0, datei.beg);
    while(!datei.eof())
    {
    getline(datei, text);
    gefunden = text.find("YES",0);
    if (gefunden >0)
    {
    getline(datei,text);
    gefunden = text.find("t=",0);
    teilstring = text.substr(gefunden+2);
    temperatur = atoi(teilstring.c_str());
    variable1 = ((float)temperatur) / 1000.0f;
    cout << variable1 << "\n";
    }
    }
    datei.close();
    sleep(1);
    char pfad[] = "/sys/bus/w1/devices/";
    DIR *verzeichnis;
    struct dirent *dateien;
    verzeichnis = opendir(pfad);
    while(dateien = readdir(verzeichnis))
    {
    cout << dateien->d_name << endl;
    }

    }
    //::getchar();

    return 0;
    }

    Grüße und bereits Danke
    Martin

  • Guten Abend,

    nun habe ich es, ich glaube.

    #include <iostream>
    #include <fstream>
    #include <string>
    #include <stdlib.h>
    #include <cstdio>
    #include <dirent.h>

    using namespace std;

    int main (int argc, char **argv)
    {
    ifstream datei;
    int temperatur;
    int gefunden;
    int abort = 0;
    int counter = 0;
    float variable1;

    string teilstring;
    string text;
    string TempAusgabe;
    string sensor = "/sys/bus/w1/devices/";
    char pfad[] = "/sys/bus/w1/devices/";

    DIR *verzeichnis;
    struct dirent *dateien;
    string pathArray[10];
    verzeichnis = opendir(pfad);

    while(dateien = readdir(verzeichnis))
    {
    pathArray[counter] = sensor + dateien->d_name + "/w1_slave";
    counter++;
    }
    counter--;

    while ((abort != 1))
    {
    for (int i = 3; i <= counter; i++)
    {
    datei.open(const_cast<char*> (pathArray[i].c_str()), ios::in);
    if ((datei.fail()))
    {
    cout << "Konnte datei nicht öffnen!";
    break;
    return 0;
    }

    /* Zeiger Position immer auf 0, wir haben nur eine Zeile zum lesen ... */
    datei.seekg (0, datei.beg);
    while(!datei.eof())
    {
    getline(datei, text);
    gefunden = text.find("YES",0);
    if (gefunden >0)
    {
    getline(datei,text);
    gefunden = text.find("t=",0);
    teilstring = text.substr(gefunden+2);
    temperatur = atoi(teilstring.c_str());
    variable1 = ((float)temperatur) / 1000.0f;
    cout << "Temp_";
    cout << i-2;
    cout << " = ";
    cout << variable1 << "\n";
    }
    }
    datei.close();
    }
    sleep(1);
    }
    //getchar();
    return 0;
    }

  • Hi Leute. Das Thema ist noch das selbe. Im moment bin ich soweit das die ersten Sensoren in die Datenbank geschrieben werden. Aber nach dem zweiten sensor hab ich einen Speicherehler.


    Kompilieren ohne Probleme

    Code
    g++ -std=c++0x auslesen2.cpp -o auslesen -lwiringPi `mysql_config --cflags` `mysql_config --libs` -L/usr/lib/mysql -lmysqlclient


    nach ausführen kommt folgene Fehler

    Code
    Verbindung hergestellt /n/nDevice: 28-0314656157ff  - Temp: 85.00 C  185.000 F
    
    
    INSERT INTO `28-0314656157ff` ( `timestamp` , `temp` ) VALUES ( CURRENT_TIMESTAMP(), '85.00')
    Device: 28-031465856aff  - Temp: 15.94 C  60.687 F
    
    
    INSERT INTO `28-031465856aff` ( `timestamp` , `temp` ) VALUES ( CURRENT_TIMESTAMP(), '15.94')
    [1]    12892 segmentation fault (core dumped)  ./auslesen

    weis da einer Rat. Wie gesagt. Ich Fange bei null an und hab nur ein wenig PHP und Linux Erfahrung ( auch selbst beigebracht)

  • Hallo mr-brain,

    die 85 °C bringt der Sensor, wenn ihm irgendwas nicht passt. Meistens missfällt ihm die Spannungsversorgung, der Widerstand zwischen VCC und DQ oder ...

    Hier hilft es nur, mit dem Widerstand zu experimentieren (ich nutze dazu einen Poti), die Leitungen zu prüfen (saubere Kontakte) oder die Kabel durch welche mit größerem Querschnitt zu ersetzen.

    Beste Grüße

    Andreas

    Ich bin wirklich nicht darauf aus, Microsoft zu zerstören. Das wird nur ein völlig unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds - "Vater" von Linux

    Linux is like a wigwam, no windows, no gates, but with an apache inside dancing samba, very hungry eating a yacc, a gnu and a bison.

  • Ja der sensor hat eine macke, ich wollte den schon immer mal umlöten. Am wiederstand ligt es nicht da hab ich schon einen Poti drin und rum experimentiert. Ich meine eher das

    Code
    [1]    12892 segmentation fault (core dumped)


    Problem. Da scheine ich irgentwas im Program Falsch zu haben.

  • Hallo. Ich wolte mich zurückmelden. Ich hab selber den Fehler gefunden. Die sql verbindung hatte ich an der falschen Stelle geschlossen. Jetzt brauch ich nur noch die tabellen wenn noch nicht erstelt, neu erstellen lassen. Sowie eine tabelle um den sensoren Räume und solltemperaturen zuweisen zu können.

  • Hallo,

    im letzen Jahr hatte ich mit mit dem Code den ich im Netz gefunden hatte, einen DS1820 ausgelesen. Nun versuchs iczh mit dem selbigen Code wirde. Geht nicht. Als Port verwende ich GPIO4 zum einlesen des DS18B20.


    Was habe ich geändert:
    Damit ich über Python Werte des AD Wandlers MCP3008 habe ich die hierfür erforderlichen module geladen und den Rasppery so konfguriert, dass ich mit der import spidev die Werte einlesen kann.
    In der Raspi-config habe unter Advance Options noch SPI enabled.

    Kommt sich die spidev und der GPIO4 in die Quere.

    Grüße
    Martin
    Automatisch zusammengefügt:
    Den GPIO7 verwende ich
    Automatisch zusammengefügt:
    Habe nun GPIO05 genommen und es klappt wieder.

    Einmal editiert, zuletzt von martin66119 (9. November 2016 um 07:11)

Jetzt mitmachen!

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