Arduino mit Raspberry Datenbank per Python verbinden

Hallo liebe Community,

Und zwar zeichne ich über den Arduino Temperatur, Bodenfeuchtigkeit und Luftfeuchtigkeit auf. Der Arduino ist per Usb-Kabel an den Raspberry angeschlossen, wo auch die Datenbank (Xamp) läuft. Zur Kommunikation benutze ich ein Python Script.

Mein Problem:
Wenn ich jetzt das Python Script ausführe, dann wird nur ein einziges mal ein Datensatz eingefügt. Danach bekomme ich folgenden Fehler(siehe Anhang “Fehler_Python”).

Mein Python-Code:

import serial
import time
import MySQLdb as mdb

arduino = serial.Serial("/dev/ttyACM1")
arduino.baudrate= 9600

data = arduino.readline()
time.sleep(1)
data = arduino.readline()
pieces = data.decode().split("\t")

temperature = pieces[0]
humidity = pieces[1]
Boden = pieces[2]


con = mdb.connect('localhost', 'root', '6903', 'sensor');

with con:

        cursor = con.cursor()
        cursor.execute("INSERT INTO sensorwerte VALUES('', %s, %s, %s,'','')", (Boden,temperature,humidity))
        con.commit()
        cursor.close()

Mein Arduino-Code: (Ganz unten ist die Methode “Response” die für das verschicken der Daten zuständig ist.)

#include <dht11.h>        //Bibliotehk für Temperatur & Luftfeuchtigkeitssensor 
#include <LiquidCrystal.h>

const int relaisPin = 13;

LiquidCrystal lcd(12, 11, 5, 4, 3, 2); //Pins des Elegoos, die zum Ansteuern des Displays benötigt werden

dht11 DHT;                            //Objekt aus der Sensoren Bibliotwehk

#define DHT11_PIN 7 //Output(s) aus Pin 7 werden auf DHT11_Pin gespeichert
int grenzwert = 30;
int sensor_pin = A0;
int output_value ;

unsigned long intervalSensor = 1000;
unsigned long previousMillisSensor = 0;

unsigned long intervalLCD = 900;
unsigned long previousMillisLCD = 0;

unsigned long intervalResponse = 10000;
unsigned long previousMillisResponse = 0;


void setup(){  
  
  lcd.begin(16, 2);
  pinMode(relaisPin, OUTPUT);
  Serial.begin(9600);
  
}
  
void loop()// "Main"-Methode
{


    if(Serial.available() > 0){
        grenzwert = Serial.read();                                                  
  }
  
  
  fan(relaisPin, grenzwert);
 ScrollingText();
SensorOnDis(DHT11_PIN); //Methodenaufruf um Temperatur und Humidität auf dem LCD aus zugeben

Response();
  
}


void SensorOnDis(int Pin){
  char a = char(225);           //Buchstabe "ä"
  char g = char(223);           //Zeichen "°"
  if(millis()- previousMillisSensor > intervalSensor) {
    previousMillisSensor = millis();  
  DHT.read(Pin);                //Objekt speichert Daten vom Pin

  lcd.setCursor(0,0);           //Ausgabe der Temperatur. Ausgabe bei Spalte 0, Pixel 0
  lcd.print(" | Temp.: ");
  lcd.print(DHT.temperature);
  lcd.print(g);
  lcd.print("C");
  
   //lcd.setCursor(0,1);           //Ausgabe der Humidität. Ausgabe bei Spalte 1, Pixel 0
  lcd.print(" | Humidit");
  lcd.print(a);
  lcd.print("t: ");
  lcd.print(DHT.humidity);
  lcd.print("%");

  output_value= analogRead(sensor_pin);

   output_value = map(output_value,1010,20,0,100);
   lcd.setCursor(0,1);
   lcd.print("Mositure : ");
  lcd.print(output_value);
   lcd.print("%");

  
  }
}
void fan(int Pin, int grenze){
  if(DHT.temperature > grenze){
  digitalWrite(Pin, HIGH);  
  }else{
   digitalWrite(Pin, LOW);
  }
  
}
void ScrollingText(){
   if (millis() - previousMillisLCD > intervalLCD) {
    previousMillisLCD = millis();
  lcd.setCursor(0,0);
    lcd.scrollDisplayLeft();//builtin command to scroll left the text
   }
}

void Response(){
if (millis() - previousMillisResponse > intervalResponse) {
   previousMillisResponse = millis();
   int temp = DHT.temperature;
   int hum  = DHT.humidity; 
   
    Serial.print(temp);
    Serial.print("\t");  //Mit \t werden die Werte getrennt. Sonst werden die Werte als Zahlenkette 
                                 verschickt und sind somit nicht mehr auseinander zuhalten
    Serial.print(hum);
    Serial.print("\t");
    output_value= analogRead(sensor_pin);
    output_value = map(output_value,1010,20,0,100);
    Serial.print(output_value);
    Serial.println("\t");
}
}

Die Tabelle “sensorwerte”, in der Datenbank “sensor”, besteht aus den Spalten “ID” (wird automatisch gesetzt), “Temperatur”, “Luftfeuchtigkeit”,“Uhrzeit” und “Daten” (siehe Anhang “Tabelle”)

Ich such mir momentan einen Wolf und krieg es nicht einfach hin, diesen Fehler zu fixen. Hat jemand eine Idee?
Verzeiht mir Anfängerfehler ^^

Steht doch in der Fehlermeldung: '' (Leerer String oder Leerzeichen) ist kein gültiger Integer.
Schreibe doch mal feste Werte in Dein Python-Script und schaue, wo er mault.

Wie ist den der genaue Tabellenaufbau - nicht die Liste der Sätze.

Gruß Tommy

Tommy56:
Steht doch in der Fehlermeldung: '' (Leerer String oder Leerzeichen) ist kein gültiger Integer.
Schreibe doch mal feste Werte in Dein Python-Script und schaue, wo er mault.

Wie ist den der genaue Tabellenaufbau - nicht die Liste der Sätze.

Gruß Tommy

Hallo Tommy

Habe jetzt nur Werte für Datum und Uhrzeit eingetragen. Für "ID" sollen keine Werte rein, weil es ein Primärschlüssel ist, den die Datenbank setzt. Hast du da eine Idee ich ist das in Python umsetzte?
Der Fehlercode für Datum/Uhrzeit ist weg. Bei "ID ist er gleichbleibend.

Grüße
Pixelherz

Edit: Also mit "umsetzen" meine ich, wie ich Python verklicker, das in "ID" keine Werte reinmüssen? ^^

Uhhh...es kann so einfach sein. Du hast recht. Einfach eine 0 für ID angeben. Die Tabelle setzt dann einen neuen Wert und nimmt nicht die 0, so wie ich es erst dachte. -_-
Danke für die Hilfe.

Hi

Danke für Deine Lösung :slight_smile:

MfG

Pixelherz:
Uhhh...es kann so einfach sein. Du hast recht. Einfach eine 0 für ID angeben. Die Tabelle setzt dann einen neuen Wert und nimmt nicht die 0, so wie ich es erst dachte. -_-

Schön, dass Du die Lösung nach Anregung selbst gefunden hast. Sowas prägt sich viel besser ein, als wenn ich Dir die Lösung gegeben hätte.
Eine andere Variante wäre es gewesen, mit einer Feldliste zu arbeiten und die ID einfach nicht zu belegen. Dann hätte auch die Automatik der Datenbank den Wert gesetzt.

Gruß Tommy