Show Posts
Pages: [1] 2 3 ... 39
1  International / Deutsch / Re: Arduino <-> Raspberry <-> MySQL Serial Communication on: April 23, 2014, 11:38:54 pm
Hi,
Qt ist nicht mit JQuery oder Dreamweaver zu vergleichen, da man keine Web Oberflächen baut, sondern komplette Anwendungen für Windows / Linux / Mac. Diese Anwendungen lassen sich selten für Web zwecke nutzen.

PHP schreibt in die Datenbank, da Python ja nicht weiß, ob gerade ein User auf dem Webserver irgendetwas gedruckt hat (Button).

Ich hab den Arduino nur per USB Verbunden. Wo willst du den 10µF den anschließen ?
2  International / Deutsch / Re: Arduino <-> Raspberry <-> MySQL Serial Communication on: April 23, 2014, 03:59:57 pm
NOOBs funktioniert dafür wunderbar ;-)
Ich hatte nie Lust mich mit allen Systemen herumzuschlagen, lieber ein fertiges nutzen. Die GUI brauchst du so an sich nicht. Das Script sollte nur mit  python script.py  ausführbar sein.  Am leichtesten kann man das testen mit  einer Datei die nur   print "hello world"  enthält,  das sollte nach dem aufruf dann in der Konsole stehen. Die IDE gibt einem noch genauerere Fehlerinformationen als die Konsole, aber ansich sollte das laufen.

So ich bin morgen abend wieder erreichbar.  smiley-cool
3  International / Deutsch / Re: Arduino <-> Raspberry <-> MySQL Serial Communication on: April 23, 2014, 03:39:14 pm
Webmin und ApplePi-Baker hab ich bisher noch nie verwendet, bzw davon gehört.

Ich hab das Image auf dem Raspberry mit NOOBs installiert. Als Betriebssystem läuft bei mir Raspian. Neben Python habe ich noch OpenCV als Bildverarbeitungsbibliothek installiert (das kompilieren dauert 11 Stunden). Zudem noch Qt, da ich auch mit Grafischen Oberflächen ab und zu arbeite.

Die Installationsanleitung für phpmyadmin und co hab ich auch verwendet, wobei im Moment läuft aus Testzwecken bei mir kein Apache sondern der lighttpd Webserver. Große unterschiede hab ich noch nicht festgestellt.
4  International / Deutsch / Re: Arduino <-> Raspberry <-> MySQL Serial Communication on: April 23, 2014, 02:51:56 pm
Diesen Beitrag bitte nicht löschen, falls oben der Platz nicht mehr reicht ;-)
5  International / Deutsch / Re: Arduino <-> Raspberry <-> MySQL Serial Communication on: April 23, 2014, 02:51:43 pm
So, hat ein wenig gedauert, aber bei mir läufts nun.

Logischer Aufbau:


Programmablauf:
1. String wird auf der Internetseite eingegeben
2. PHP Script trägt String in Datenbank ein
3. Python Script ließt String aus Datenbank aus und überträgt über USB den String an den Arduino
4. Der Arduino ließt den String komplett ein while Serial.read ...
5. Der eingelesene String wird mit Serial.write wieder gesendet
6. Das Python Script emfängt die Daten und schreibt diese in einem neuen Eintrag in die Datenbank
7. Auf der Internetseite werden die Empfangenen Daten des Arduino angezeigt.

Vorbereitung Rasbperry Pi:
1. z.B. mit dem Tool Noobs ein Betriebssystem mit Oberfläche installieren
2. Webserver Installieren, PHP5, Mysql, phpmyadmin, ftp-server,
3. VNC Server installieren  (sudo apt-get install tightvncserver) für Virtuellen Desktop
4. Python 2.7 installieren
5. Datenbanktreiber für Python installieren (sudo apt-get install python-mysqldb)
6. Schnittstellentreiber für die Serielle Schnittstelle installieren (sudo apt-get install python-serial)
7. Arduino mit dem Raspberry Pi per USB Verbinden
8. in phpmyadmin eine Datenbank mit dem Namen "test_db" erstellen

in der neuen Datenbank folgen SQL code einfügen:
Code:
CREATE TABLE IF NOT EXISTS `test_table` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `to_arduino` varchar(200) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `from_arduino` varchar(200) CHARACTER SET utf8 NOT NULL DEFAULT '',
  `status` tinyint(1) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `status` (`status`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

Auf den Arduino entweder vom PC / Laptop aus oder über die Arduino IDE auf dem Raspberry folgenden Code aufspielen:
Code:
void setup()
{
  Serial.begin(9600);
}

char str[250];
uint8_t str_cnt = 0;

void loop()
{  
  if(Serial.available()) {
    str[str_cnt] = Serial.read();
    str_cnt++;    
  }
  
  if(str_cnt > 0) {
    Serial.write(str);
    str_cnt = 0;
  }    
}

Auf dem Webserver sollte eine PHP Datei mit folgendem Inhalt erstellt werden:
Code:
<?php
header
("Content-Type: text/html; charset=utf-8");

$display_errors true;

if(
$display_errors == true) {
ini_set('display_errors''1');
error_reporting(E_ALL);
} else {
ini_set('display_errors''0');
error_reporting(0);
}

$db_host 'localhost';
$db_user 'root';
$db_pass 'password';   // <-------- anpassen
$db_name 'test_db';

$DBH = new PDO('mysql:host='.$db_host.';dbname='.$db_name$db_user$db_pass);

//Daten in Datenbank eintragen
$send '';
if (isset(
$_POST['send_to_arduino'])) {
$value trim($_POST['send_to_arduino']);
if(!empty($value)) {
$sth $DBH->prepare("INSERT INTO test_table (to_arduino, status) VALUES (:to_arduino, 1)");
$sth->bindParam(':to_arduino'$_POST['send_to_arduino']);
$sth->execute();
$send "String: '".$_POST['send_to_arduino']."' gesendet<br />";
}
}

// Warten das Daten Empfangen Werden
sleep(1);

$empfangen '';
// Daten Empfangen
$sth $DBH->prepare("SELECT id, from_arduino, status FROM test_table WHERE from_arduino != ''");
$sth->execute();
$result $sth->fetchAll(PDO::FETCH_ASSOC);
if(
count($result) > 0) {
// Daten Vorhanden
$new '';
$old '';
foreach($result AS $key => $row) {
if($row['status'] == 1) {
$new .= "- empfangen: '".$row['from_arduino']."'<br />";
} else {
$old .= "- empfangen: '".$row['from_arduino']."'<br />";
}
// Daten als alt makieren
$sth $DBH->prepare("UPDATE test_table SET status=0 WHERE id=:id");
$sth->bindParam(':id'$row['id']);
$sth->execute();
}
$empfangen "<b>Neue Dinge:</b><br/>".$new."<br /><br /><b>Alte Dinge:</b><br />".$old;
}
?>


<html>
<head><title>Test Script</title></head>
<body>
<form action="test_db.php" method="post">
String zum Senden eingeben: <input type="text" name="send_to_arduino" /><br />
<br />
<input type="submit" value="Senden" />
<?php echo $send?>
</form>

<?php echo $empfangen?>
</body>
</html>
In der Datei muss unter $db_pass  das Passwort der Datenbank eingetragen werden.

Auf dem Raspberry Pi muss eine Python Datei erstellt werden (z.B.  test_python_db.py), in der folgender Quellcode eingefügt wird:
Code:
import time
import serial
import MySQLdb as mdb

# configure the serial connections (the parameters differs on the device you are connecting to)
ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_ODD,
    stopbits=serial.STOPBITS_TWO,
    bytesize=serial.SEVENBITS
)

db_host = 'localhost'
db_user = 'root'
db_pass = 'password'   # <--------------------- diese Zeile anpassen
db_name = 'test_db'

ser.open()
ser.isOpen()

while True:
    # Zum Arduino senden
    # Ueberpruefen ob neue Daten in Datenbank, dann diese Senden
    try:
        con = mdb.connect(db_host, db_user, db_pass, db_name);
        cur = con.cursor()
        # Abfrage
        cur.execute("SELECT id, to_arduino FROM test_table WHERE to_arduino != '' and status = '1'")
        # Ergebnis
        rows = cur.fetchall()
        # Zerlegen und Senden, eventuell mit Zeitverzgerung von 100 ms damit
        # damit der Arduino Zeit zum verarbeiten hat
        if len(rows) > 0:
            for row in rows:
                string = str(row[1]) + '\r\n'
                ser.write(string)
                # Datensatz deaktivieren oder loeschen
                cur = con.cursor()
                cur.execute("UPDATE test_table SET status=0 WHERE id=%s", row[0])
                con.commit()
            print "Daten gesendet"
    except mdb.Error, e:
        print "Error %d: %s" % (e.args[0],e.args[1])
        sys.exit(1)


    # Vom Arduino empfangen
    out = ''
    while ser.inWaiting() > 0:        
        out += ser.read()

    if out != '':
        #Daten in Datenbank schreiben
        try:
            con = mdb.connect(db_host, db_user, db_pass, db_name);
            cur = con.cursor()
            cur.execute("INSERT INTO test_table (to_arduino, from_arduino, status) VALUES ('', %s, 1)", out)
            con.commit()
            print "Daten empfangen"
        except mdb.Error, e:
            if con:
                con.rollback()
            print "Error %d: %s" % (e.args[0],e.args[1])
            sys.exit(1)

    time.sleep(0.5)


Die Python Datei kann dann über die Python IDE ausgeführt werden, oder direkt über die Konsole (python pfad/datei.py)
Falls euer Programm im Autostart mit geladen werden sollte, sollten alle print Ausgaben im Quellcode deaktiviert werden.

Mit dem Script ist es auch durch leichte Änderungen mögilch in der Datenbank eine Uhrzeit zu speichern, sprich Ihr könnt über die Website einstellungen vornehmen die zu einer gewissen Uhrzeit erst zum Arduino gesendet werden.  

Falls ihr noch Fragen zu einigen Schritten habt, ich kann auch alles detailierter erklären, aber jedem sollte bewusst sein, dass dieses Vorhaben nichts für blutige Anfänger ist ;-)


6  International / Deutsch / Re: String kette erzeugen on: April 22, 2014, 03:39:01 pm
Kannst du uns die genaue Fehlermeldung nennen ?

Zeichenketten werden entweder statisch mit 
Code:
char str[40]; 
definiert. (40 Zeichen, von 0 - 39) oder mit 
Code:
char *str;

Aber ohne deine genaue Fehlermeldung, können wir nur raten.
7  International / Deutsch / Re: Arduino <-> Raspberry <-> MySQL Serial Communication on: April 22, 2014, 03:36:52 pm
Das kann man handhaben wie man will, je nach Anwendung ist es sinnvoll daten auch zu löschen oder Eben nicht.
Mysql hat keine Probleme damit 4 Mio Werte in einer Tabelle zu haben, erst danach wirds komplizierter ;-)

Python ist wesentlich leichter als C oder C++. Wohl vergleichbar mit PHP da es auch keinen Kompliler benötigt. Zudem gibt es keine Klammern. Die Ebene in der der Code Strukturiert wird, wird über das Einrücken des Codes bestimmt, also mit Tabs und das Simikolon benötigt man auch nicht mehr.

Welches Betriebssystem verwendest du auf dem Raspberry ?
8  International / Deutsch / Re: "Array of Functions" gesucht on: April 22, 2014, 03:30:53 pm
Ich verwende bei mir in den Libs  "simpleThreads" und "LcdMenuLib" auch Arrays von Funktionen. Dazu erstell ich mir einen neuen Typen mit Typedef:
Code:
#ifndef TYPEDEF_FUNCPTR
#define TYPEDEF_FUNCPTR
typedef void (* FuncPtr) ();
#endif

#define  cnt_func  2

void func_1()
{
  Serial.println("func_1");
}

void func_2()
{
  Serial.println("func_2");
}

FuncPtr ary_function[cnt_func];
ary_function[0] = func_1;
ary_function[1] = func_2;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
  for (uint8_t i=0; i<cnt_func; i++) {
    ary_function[i]();
  }
  delay(1000);
}
9  International / Deutsch / Re: Arduino DUE CAN on: April 22, 2014, 03:18:20 pm
Hi,
ich hab mit dem Due schon die Can Schnittstelle genutzt, nur habe ich den Due nicht über die Arduino IDE programmiert sondern mit einem Atmel Sam Programmer über die Jtag Schnittstelle im AtmelStudio 6.
Im Atmel Studio gibt es auch Beispiele zur Can Schnittstelle. Leider kostet der Jtag Adapter ca 100 € und ist für Bastler kaum attraktiv.

Der Due bietet nur die reine Can Schnittstelle, du benötigst noch einen Tranciver/Receiver Baustein, der die Pegel auf den Can Pegel anpasst.

Je nach Projekt lohnt sich vielleicht der Umstieg zu einem Jtag Programmer. Damit ist das Echtzeit debugging auf dem Kontroller möglich. Zudem bietet das Atmelstudio in kombination mit der neusten ASF (Atmel Software Framework) Version quasi die gleichen einfachen Funktionen wie die Arduion IDE.  Ob ich nun  pinMode(xxx) schreibe, oder  pio_configure_pin(xxx) kommt ja aufs gleiche raus.
10  International / Deutsch / Re: Arduino <-> Raspberry <-> MySQL Serial Communication on: April 22, 2014, 03:02:34 pm
Ich schreib gerade so eine Software.
Auf dem Raspberry Pi ist, falls man Rasbian verwendet, python installiert.  

Bei mir lauscht ein Python Programm durchgehend ob vom Arduino etwas kommt. Sobald etwas da ist, wird dieses in eine Mysql Datenbank geschrieben, direkt über Python.

Auf die Datenbank greift dann PHP zu und verarbeitet alle Daten die als neu gekenzeichnet sind, sobald der Webbrowser aufgerufen wird. Wenn kein User zugreift schreibt das Python Script dauerhaft Daten.

Bei Interesse können wir bei dem Projekt zusammen arbeiten. Ich habe bei mir auf dem Raspberry noch die Klassenbiliothek Qt installiert mit der sich sehr einfach grafische Obferlächen erstellen lassen.
11  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: April 22, 2014, 12:29:47 pm
Das klingt gut, so schnell kann ich mich auch nicht in große Code abschnitt hereindenken ohne etwas testen zu können und zudem hab ich im Moment wenig Zeit ;-)

@blubbel  
Prinzipell sieht das richtig aus. Kommen die Seriellen ausgaben den mehrmals oder nur einmalig ?
12  International / Deutsch / Re: non-blocking function mit millis() on: April 18, 2014, 11:18:47 am
Und was ist mit:
Ich höre durch die Wand wenn mein Chef mit dem telefonieren fertig ist und gehe dann rüber ?

Schlecte Bauweise ?
 smiley-cool
13  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: April 15, 2014, 02:10:24 pm
Wieso sollte man diesen zurücksetzen ?

Beschreib mal näher was du vor hast.
14  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: March 05, 2014, 01:05:44 pm
Solange die Lib nicht gelb oder orange angezeigt wird, ist sie irgendwie falsch eingebunden. Ich bin im Moment mit meiner Zeit sehr begrenzt und kann erst am We näher danach schauen.

Hast du schon einmal probiert andere Libs einzubinden und diese zu testen ? Bisher hatte niemand ein Problem mit der Fehlermeldung, außer die Lib wurde wie erwähnt nicht richtig eingebunden.

15  International / Deutsch / Re: Projekt: LCDMenuLib - LCD Menü mit mehreren Ebenen (4Bit/I2C/ShiftReg/...) on: March 05, 2014, 09:15:46 am
Wird bei dir im Beispiel beim #include   das  <LCDMenuLib.h>  in gelb angezeigt ?

Es scheint mir etwas mit dem Pfad der Lib nicht zu stimmen, da die "lang_..." -Konstanten immer definiert sind.  Kopier mal bitte nicht die untersten Fehlermeldungen, sondern die obersten die als erstes auftreten hier herein, falls die folgende Anleitung nicht hilft.

Schau mal hier:
http://forum.arduino.cc/index.php?topic=73816.msg1580280#msg1580280

Vielleicht hilft dir die Lösung die hier beschrieben wird weiter. Und bitte auch die folge Beiträge lesen.
Pages: [1] 2 3 ... 39