Sensorwerte in MySQL Datenbank speichern



  • Liebe C++ Community!

    Ich habe mit Codeblocks ein Programm geschrieben, welches die CO2 Werte meines mhz19b Sensors ausliest und im Terminal anzeigt. Nun möchte ich gerne diese Werte auf meiner MySQL Datenbank speichern. Ich habe schon eine Verbindung mit der Datenbank hergestellt und hab auch schon viel recherchiert, aber ich habe es nicht geschafft, dass die Sensorwerte in der Datenbank landen.

    C++ Code:

    #include <iostream>
    #include <wiringPi.h>
    #include <mysql.h>
    
    
    const int PWM=5;
    
    int getPWM()
    {
        //wait for PWM start
        while (digitalRead(PWM)== LOW);
        //wait for PWM end
        long startTime = micros();
        while (digitalRead(PWM) == HIGH);
        long duration = micros() - startTime;
        //from datasheet
        //CO2 ppm = 5000 * (Th - 2ms) / (Th + Tl - 4ms)
        //  given Tl + Th = 1004
        //        Tl = 1004 - Th
        //        = 5000 * (Th - 2ms) / (Th + 1004 - Th -4ms)
        //        = 5000 * (Th - 2ms) / 1000 = 2 * (Th - 2ms)
    
        long co2ppm = 5 * ((duration/1000) - 2);
    
        // Versuch mit Insert: ("INSERT INTO sensorvalues (co2) VALUES (NULL, %i)", (co2ppm));
    
        return co2ppm;
    }
    
    
    int main(void)
    {
        wiringPiSetup();
        pinMode(PWM, INPUT);
    
        MYSQL_RES *mTabelle;
        MYSQL_ROW mRecord;
        MYSQL *mConnection, mDB;
        int mError;
    
        mysql_init(&mDB);
        mConnection = mysql_real_connect(&mDB,"localhost","root","meinpw","meineTabelle",3306,0,0);
    
        if (mConnection == NULL)  
        {
            printf("Es konnte keine Verbindung zur Datenbank hergestellt werden: %s",mysql_error(&mDB));
            return 1;
        } 
         else
        {
            printf("Es wurde erfolgreich eine Verbindung hergestellt!");
    }
    
    
    while (1)
    {
        cout << "\nco2 ppm = \t"<< getPWM();
        delay (60000);   //wait 60 seconds
    }
        mysql_close(mConnection);
    
        return 0;
    }


  • Lies dir deinen Post noch mal durch und überleg dir, ob du den so stehenlassen möchtest. Und ob du glaubst, dass sich das antun möchten, ihn so zu lesen.



  • Datei öffnen -> Datei schließen es landen aber keine Daten in der Datei. Finde den Fehler! Datenbanken sind doch net so schwer und tutorials wie man daten in eine Tabelle schreibt gibt es zu hauf.



  • This post is deleted!


  • @Jxni
    Du musst das INSERT Statement mit z.B. mysql_query oder mysql_real_query ausführen:
    https://dev.mysql.com/doc/c-api/8.0/en/mysql-query.html
    Mit

    Insert: ("INSERT INTO sensorvalues (co2) VALUES (NULL, %i)", (co2ppm));
    

    klappt es schonmal sicher nicht.

    Und dein INSERT Statement INSERT INTO sensorvalues (co2) VALUES (NULL, %i) ist auch falsch.
    INSERT INTO sensorvalues (co2) heisst er soll in die Tabelle sensorvalues einfügen und du willst den Wert für die Spalte co2 angeben, und alle anderen Spalten sollen die Default-Werte bekommen, bzw. NULL wenn die Spalten keinen expliziten Default-Wert haben.
    Dann gibst du aber mit VALUES (NULL, %i) zwei Werte an. Erst sagst du also du willst nur einen Wert angeben, und zwar den für die Spalte co2, und dann übergibst du mit VALUES zwei Werte. Das passt doch nicht zusammen.



  • @hustbaer Danke für deine Antwort!

    Es ergibt schon Sinn so wie du es beschrieben hast. Ich werde jetzt mal versuchen mit mysql_query oder mysql_real_query es umzusetzen.



  • Gerade wenn du mehrere wiederholte inserts machen willst, kannst du auch prepared statements nutzen.

    Siehe ein Beispiel auf https://dev.mysql.com/doc/c-api/8.0/en/mysql-stmt-execute.html

    Im Wesentlich bereitest du mit INSERT INTO sensorvalues (co2) VALUES (?) vor und führst dann execute für alle zu insertenden Werte aus.

    Und weil du ja C++ nutzt bzw. im C++-Bereich fragst, muss ich darauf hinweisen, dass du nicht unbedingt die C-API von MySQL nutzen musst - siehe hier (Beispiel ganz unten) wie es in C++ mit der "X DevAPI" geht: https://dev.mysql.com/doc/x-devapi-userguide/en/devapi-users-working-with-relational-tables.html



  • @wob

    Ok Danke ich sehe mir das gleich mal etwas genauer an. Das einzige was ich nicht verstehe ist was ich genau bei INSERT INTO sensorvalues (co2) VALUES (?) statt dem ? schreiben soll. Da sollte ja eigentlich meine Integer Variable ppm hin, aber ich weiß nicht wie mit %d oder nur mit dem Namen ppm.



  • @DocShoe

    Danke für den Tipp. Habe den Post jetzt geändert.



  • @CTecS

    Ich finde nur Tutorials wie man einen Text mit INSERT in die DB schreibt, doch wie man jetzt einen Wert einer Variable speichert habe ich bisher noch nicht gefunden!



  • @Jxni sagte in Sensorwerte in MySQL Datenbank speichern:

    Da sollte ja eigentlich meine Integer Variable ppm hin, aber ich weiß nicht wie mit %d oder nur mit dem Namen ppm.

    Formatspecifier (wie %d) sind eine Eigenheit der Funktionen printf, scanf (und strftime) - und nicht von C.
    C kennt auch keine dynamischen Strings.

    Du musst den Text vor der Benutzung zusammensetzen.
    Dafür eignet sich die Standardfunktion sprintf ganz gut.

    Das Insert sollte auch innerhalb der while-Schleife stehen - und nicht in der getPWM



  • Man kann in C++ auch stringstream nutzen und sich die Befehlsfolge damit zusammenbauen.



  • @Jxni sagte in Sensorwerte in MySQL Datenbank speichern:

    INSERT INTO sensorvalues (co2) VALUES (?) statt dem ? schreiben soll

    Nichts, da kommt das Fragezeichen hin! Das ist ein Platzhalter. Im verlinkten Beispiel wird dann mit bind ein Wert an diesen Platzhalter gebunden, mit execute wird das ganze ausgeführt.

    Bei Zahlen kommt das aus dasselbe raus wie wenn du die Zahl direkt reinschreiben würdest. Aber wenn du zum Beispiel einen String einfügen willst, musst du dir bei Benutzung der Platzhalter keine Gedanken mehr um Quoting/SQL-Injection etc machen.



  • @wob sagte in Sensorwerte in MySQL Datenbank speichern:

    Aber wenn du zum Beispiel einen String einfügen willst, musst du dir bei Benutzung der Platzhalter keine Gedanken mehr um Quoting/SQL-Injection etc machen.

    Das ist eine der Gründe weshalb ich persönlich PostgreSQL bevorzuge. Da wird einfach der Query String übermittelt und getrennt die Parameter, und man muss nicht mehr herumbasteln wie früher.


Log in to reply