MCP3008 anbindung an MYSQL

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
johnny221
User
Beiträge: 7
Registriert: Montag 20. Januar 2014, 08:45

Hallo,
ich versuche mit einem Raspberry Pi und dem AD Wandler MCP3008 die erfassten Werte in eine Mysql Datenbank mit Python zu schreiben.
Hier ein paar Fakten:

Ich habe den Quellcode von Erik Bartmann verwendet und bereits eine Anbindung zum Mysql Server hergesetllt.
Ich würde gerne den Wert aus dieser Zeile

Code: Alles auswählen

print readAnalogData(adcChannel, SCLK, MOSI, MISO, CS)
in die Datenbank "widerstand" , Tabelle "werte" , Spalte "werte" eintragen.
Über eure Tipps bin ich sehr dankbar!

Code: Alles auswählen

import time
import RPi.GPIO as GPIO
import MySQLdb

mysql_opts = {
    'host': "localhost",
    'user': "***",
    'pass': "***",
    'db':   "widerstand"
    }
mysql = MySQLdb.connect(mysql_opts['host'], mysql_opts['user'], mysql_opts['pass'], mysql_opts['db']) 

GPIO.setmode(GPIO.BCM)

HIGH = True  # HIGH-Pegel
LOW  = False # LOW-Pegel

# Funktionsdefinition
def readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin):
    # Pegel vorbereiten
    GPIO.output(CSPin,   HIGH)    
    GPIO.output(CSPin,   LOW)
    GPIO.output(SCLKPin, LOW)
        
    sendcmd = adcChannel
    sendcmd |= 0b00011000 # Entspricht 0x18 (1:Startbit, 1:Single/ended)

    # Senden der Bitkombination (Es finden nur 5 Bits Beruecksichtigung)
    for i in range(5):
        if (sendcmd & 0x10): # (Bit an Position 4 pruefen. Zaehlung beginnt bei 0)
            GPIO.output(MOSIPin, HIGH)
        else:
        	GPIO.output(MOSIPin, LOW)
        # Negative Flanke des Clocksignals generieren
        GPIO.output(SCLKPin, HIGH)
        GPIO.output(SCLKPin, LOW)
        sendcmd <<= 1 # Bitfolge eine Position nach links schieben
        
    # Empfangen der Daten des ADC
    adcvalue = 0 # Ruecksetzen des gelesenen Wertes
    for i in range(11):
        GPIO.output(SCLKPin, HIGH)
        GPIO.output(SCLKPin, LOW)
        # print GPIO.input(MISOPin)
        adcvalue <<= 1 # 1 Postition nach links schieben
        if(GPIO.input(MISOPin)):
            adcvalue |= 0x01
    time.sleep(0.5)
    return adcvalue

# Variablendefinition
adcChannel = 0  # Analog/Digital-Channel
SCLK        = 18 # Serial-Clock
MOSI        = 24 # Master-Out-Slave-In
MISO        = 23 # Master-In-Slave-Out
CS          = 25 # Chip-Select

# Pin-Programmierung
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS,   GPIO.OUT)

while True:
    print readAnalogData(adcChannel, SCLK, MOSI, MISO, CS)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Hallo und willkommen im Forum!

Wie sieht denn dein Problem aus? Was funktioniert nicht? Bekommst du eine Fehlermeldung? Wenn ja, welche? Oder verhält sich dein Programm nicht wie gewünscht? Was soll es tun und was passiert tatsächlich?
Das Leben ist wie ein Tennisball.
johnny221
User
Beiträge: 7
Registriert: Montag 20. Januar 2014, 08:45

Zunächst mal vielen Dank für die schnelle Antwort!
Also der Stand momentan ist, dass ich das Programm im Terminal starte und ich die Werte dann direkt im Terminal angezeigt bekomme. Ich möchte diese Werte aber gerne in einer Datenbank speichern und ich weis nicht genau mit welchem Code ich das mache und hatte gehofft, dass mir an dieser Stelle jemand helfen könnte.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Womit hast du denn konkret Probleme? Hast du die execute-Methode noch nicht gefunden oder suchst du eine Dokumentation zu SQL?
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hallo,

als Anfänger habe ich natürlich eine umfangreiche Linksammlung :-)
Schau mal hier:

http://www.tutorialspoint.com/python/py ... access.htm
http://zetcode.com/db/sqlitepythontutorial/
http://docs.python.org/3/library/sqlite3.html

Kommt jetzt halt drauf an, was für eine Pythonversion du verwendest und welche Datenbank. Von Version zu Version bzw Datenbank zu Datenbank ist sich aber vieles ähnlich und kann in der Regel von dem Gegebenen abgeleitet werden.

Viel Erfolg!
johnny221
User
Beiträge: 7
Registriert: Montag 20. Januar 2014, 08:45

Eine Dokumentation zu SQl suche ich nicht. ich habe jetzt folgenden Code verwendet:

Code: Alles auswählen

mysql_opts = {
    'host': "localhost",
    'user': "***",
    'pass': "***",
    'db':   "widerstand"
    }
db= MySQLdb.connect(mysql_opts['host'], mysql_opts['user'], mysql_opts['pass'], mysql_opts['db']) 

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO werte(wert) \
       VALUES (readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin))"
try:
   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()
# disconnect from server
db.close()
aber ich bekomme keine Werte in meine Datenbank. Woran könnte das liegen?
Ich möchte den Wert aus "readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin)" in die Datenbank "widerstand", Tabelle "werte", Spalte "wert" bekommen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Lass mal das try/except-Konstrukt weg, dann wirst du es schon merken ;-)
johnny221 hat geschrieben:Eine Dokumentation zu SQl suche ich nicht.
Mal schauen ;-)
Das Leben ist wie ein Tennisball.
johnny221
User
Beiträge: 7
Registriert: Montag 20. Januar 2014, 08:45

okay ich habe es weggelassen aber trotzdem finde ich in meiner datenbank keine werte...
BlackJack

@johnny221: Was für eine Fehlermeldung hast Du denn bekommen? Schau Dir die doch mal an.
johnny221
User
Beiträge: 7
Registriert: Montag 20. Januar 2014, 08:45

Wenn ich das Programm ausführe, bekomme ich keine Fehlermeldung im Terminal angezeigt.
BlackJack

@johnny221: Dann zeig vielleicht mal den Code den Du jetzt ausführst.
johnny221
User
Beiträge: 7
Registriert: Montag 20. Januar 2014, 08:45

Code: Alles auswählen

import time
import RPi.GPIO as GPIO
import MySQLdb

mysql_opts = {
    'host': "localhost",
    'user': "***",
    'pass': "***",
    'db':   "widerstand"
    }
db= MySQLdb.connect(mysql_opts['host'], mysql_opts['user'], mysql_opts['pass'], mysql_opts['db']) 

# prepare a cursor object using cursor() method
cursor = db.cursor()

# Prepare SQL query to INSERT a record into the database.
sql = "INSERT INTO werte(wert) \
       VALUES (readAnalogData(adcChannel, SCLK, MOSI, MISO, CS))"

# disconnect from server
db.close()

GPIO.setmode(GPIO.BCM)

HIGH = True  # HIGH-Pegel
LOW  = False # LOW-Pegel

# Funktionsdefinition
def readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin):
    # Pegel vorbereiten
    GPIO.output(CSPin,   HIGH)    
    GPIO.output(CSPin,   LOW)
    GPIO.output(SCLKPin, LOW)
        
    sendcmd = adcChannel
    sendcmd |= 0b00011000 # Entspricht 0x18 (1:Startbit, 1:Single/ended)

    # Senden der Bitkombination (Es finden nur 5 Bits Beruecksichtigung)
    for i in range(5):
        if (sendcmd & 0x10): # (Bit an Position 4 pruefen. Zaehlung beginnt bei 0)
            GPIO.output(MOSIPin, HIGH)
        else:
        	GPIO.output(MOSIPin, LOW)
        # Negative Flanke des Clocksignals generieren
        GPIO.output(SCLKPin, HIGH)
        GPIO.output(SCLKPin, LOW)
        sendcmd <<= 1 # Bitfolge eine Position nach links schieben
        
    # Empfangen der Daten des ADC
    adcvalue = 0 # Ruecksetzen des gelesenen Wertes
    for i in range(11):
        GPIO.output(SCLKPin, HIGH)
        GPIO.output(SCLKPin, LOW)
        # print GPIO.input(MISOPin)
        adcvalue <<= 1 # 1 Postition nach links schieben
        if(GPIO.input(MISOPin)):
            adcvalue |= 0x01
    time.sleep(0.5)
    return adcvalue

# Variablendefinition
adcChannel = 0  # Analog/Digital-Channel
SCLK        = 18 # Serial-Clock
MOSI        = 24 # Master-Out-Slave-In
MISO        = 23 # Master-In-Slave-Out
CS          = 25 # Chip-Select

# Pin-Programmierung
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS,   GPIO.OUT)

while True:
    print readAnalogData(adcChannel, SCLK, MOSI, MISO, CS)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Mit Entfernen des try/except-Konstrukt war gemeint, dass du die try- und die except-Zeile entfernen sollst. Wenn du weder einen execute-Aufruf, noch ein commit machst, dann wird auch gar nicht erst versucht etwas zu schreiben.
Das Leben ist wie ein Tennisball.
johnny221
User
Beiträge: 7
Registriert: Montag 20. Januar 2014, 08:45

Ah okay, danke! Jetzt bekomme ich im Terminal folgenden Fehler angezeigt:
File "print_read_mcp3008.py", line 20
cursor.execute(sql)
^
IndentationError: unexpected indent
BlackJack

@johnny221: Falls Du jetzt wirklich nur die beiden Zeilen mit ``try:`` und ``except:`` gelöscht hast und gedacht hast das läuft so, dann solltest Du jetzt erst mal die Hardware und die Datenbank vergessen und Python lernen. Programmieren ist nicht Quelltextschnippsel zusammen kopieren und raten. Dir fehlen absolute Grundlagen.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Oh, das wird eine schwere Geburt. Der IndentationError sagt dir, dass die Einrückung (Indentation) nicht korrekt ist. Ich nehme mal an, dass du jetzt folgendes stehen hast:

Code: Alles auswählen

sql = "INSERT INTO werte(wert) \
      VALUES (readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin))"

   # Execute the SQL command
   cursor.execute(sql)
   # Commit your changes in the database
   db.commit()

# disconnect from server
db.close()
Es muss aber so heißen:

Code: Alles auswählen

sql = "INSERT INTO werte(wert) \
      VALUES (readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin))"

# Execute the SQL command
cursor.execute(sql)
# Commit your changes in the database
db.commit()

# disconnect from server
db.close()
Einrückung ist bei Python ein wesentlicher Bestandteil und muss entsprechend eigehalten werden. Es ist übrigens Standard vier Zeichen zur Einrückung zu verwenden.
Das Leben ist wie ein Tennisball.
Antworten