Seite 1 von 1

MCP3008 anbindung an MYSQL

Verfasst: Dienstag 21. Januar 2014, 16:01
von johnny221
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)

Re: MCP3008 anbindung an MYSQL

Verfasst: Dienstag 21. Januar 2014, 17:08
von EyDu
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?

Re: MCP3008 anbindung an MYSQL

Verfasst: Dienstag 21. Januar 2014, 20:09
von johnny221
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.

Re: MCP3008 anbindung an MYSQL

Verfasst: Dienstag 21. Januar 2014, 20:53
von /me
Womit hast du denn konkret Probleme? Hast du die execute-Methode noch nicht gefunden oder suchst du eine Dokumentation zu SQL?

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 09:32
von bfm
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!

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 14:13
von johnny221
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.

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 14:18
von EyDu
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 ;-)

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 14:27
von johnny221
okay ich habe es weggelassen aber trotzdem finde ich in meiner datenbank keine werte...

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 14:33
von BlackJack
@johnny221: Was für eine Fehlermeldung hast Du denn bekommen? Schau Dir die doch mal an.

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 14:36
von johnny221
Wenn ich das Programm ausführe, bekomme ich keine Fehlermeldung im Terminal angezeigt.

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 15:06
von BlackJack
@johnny221: Dann zeig vielleicht mal den Code den Du jetzt ausführst.

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 15:13
von johnny221

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)

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 15:16
von EyDu
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.

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 15:24
von johnny221
Ah okay, danke! Jetzt bekomme ich im Terminal folgenden Fehler angezeigt:
File "print_read_mcp3008.py", line 20
cursor.execute(sql)
^
IndentationError: unexpected indent

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 15:27
von 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.

Re: MCP3008 anbindung an MYSQL

Verfasst: Mittwoch 22. Januar 2014, 15:30
von EyDu
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.