Datenbankverbindung mit Arduino 1.0.3

Hallo. Um mal schnell auf den Punkt zu kommen: Ich möchte eine Datenbankverbindung mit Arduino herstellen. Falls es relevant ist: Die Version ist 1.0.3.

Ich habe gerade ein Schulprojekt am Laufen, wo ich Blitzer bauen/progammieren muss.. Wäre es möglich, dass man die Werte, was man aus Arduino erhält, in eine MySQL Datenbank einträgt? Kann mir wer da helfen? Meine Gruppe und ich hängen mit der Sache schon seit 2 Wochen lang fest. Wir sind nicht gerade die Spezialisten in diesem Gebiet. ^^

Bei Nachfrage kann ich dann 2 Quelltexte zeigen, woran wir schon gearbeitet haben. Nur klappen will nicht vieles...

Mit freundlichen Grüßen

Hmmm…

Wie ich es tun würde:
Vom Arduino aus einen REST Request an einen Webserver absetzen.
Auf diesem Webserver schreibt ein PHP Script die Daten dann in die DB.

evt. ist RedBean mit dem BeanCan Plugin was für euch…

combie:
Hmmm…

Wie ich es tun würde:
Vom Arduino aus einen REST Request an einen Webserver absetzen.
Auf diesem Webserver schreibt ein PHP Script die Daten dann in die DB.

evt. ist RedBean mit dem BeanCan Plugin was für euch…

#include <SPI.h>
#include <Ethernet.h>
 
// assign a MAC address for the ethernet controller.
// fill in your address here:
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
// fill in an available IP address on your network here,
// for manual configuration:
IPAddress ip(192,168,20,177);      // <- hier die IP des Ethernet Shield eintragen
 
// initialize the library instance:
EthernetClient client;
 
char server[] = "localhost";      //  <- hier Name des Webspaces eintragen
 
unsigned long lastConnectionTime = 0;          // last time you connected to the server, in milliseconds
boolean lastConnected = false;                 // state of the connection last time through the main loop
const unsigned long postingInterval = 60000;  // das ist ein Bug im Beispiel -> http://forum.arduino.cc/index.php/topic,125510.0.html
 
void setup() {
// start serial port:
Serial.begin(115200);
// give the ethernet module time to boot up:
delay(1000);
// start the Ethernet connection using a fixed IP address and DNS server:
Ethernet.begin(mac, ip);
// print the Ethernet board/shield's IP address:
Serial.print("My IP address: ");
Serial.println(Ethernet.localIP());
}
 
void loop() {
// if there's incoming data from the net connection.
// send it out the serial port.  This is for debugging
// purposes only:
if (client.available()) {
char c = client.read();
Serial.print(c);
}
 
// if there's no net connection, but there was one last time
// through the loop, then stop the client:
if (!client.connected() && lastConnected) {
Serial.println();
Serial.println("disconnecting.");
client.stop();
}
 
// if you're not connected, and ten seconds have passed since
// your last connection, then connect again and send data:
if(!client.connected() && (millis() > lastConnectionTime + postingInterval)) {
httpRequest();
}
// store the state of the connection for next time through
// the loop:
lastConnected = client.connected();
}
 
// this method makes a HTTP connection to the server:
void httpRequest() {
// if there's a successful connection:
Serial.println("try connecting...");
if (client.connect(server, 80)) {
Serial.println("connecting...");
// send the HTTP PUT request:
client.print("GET /data2mysql.php?A0=");
client.print(analogRead(A0));
client.print("&A1=");
client.print(analogRead(A1));
client.println(" HTTP/1.1");
client.print("Host: ");
client.println(server);
client.println("Connection: close");
client.println();
 
// note the time that the connection was made:
lastConnectionTime = millis();
}
else {
// if you couldn't make a connection:
Serial.println("connection failed");
Serial.println("disconnecting.");
client.stop();
}
}

Bei dem Quelltext kommt die Fehlermeldung, dass keine Verbindung hergestellt werden kann.

Ist klar, weil da "localhost" als Server steht!

  1. glaub ich nicht, dass der Arduino mit localhost was anfangen kann (lass mich da gerne eines anderen belehren)
  2. werdet ihr einen Web/PHP/SQL Server brauchen der auf einem Rechner mit der IP x.x.x.x läuft und genau diese IP müsst ihr anstatt dem localhost einfügen.

LG

Wir benutzen xampp bei dieser version. Sprich localhost. kann gut sein das er mit localhost nichts anfangen kann werde dann einfach mal versuchen 127.0.0.1 statt localhost zu verwenden. Denn dort wo localhost drin steht soll man ja den webspace eintragen. Denke also eher nicht das dort was anderes rein gehört oder täusche ich mich?

Ich habe dies auch anders versucht und zwar mit dem mysql connector und dem normalen windows mqsql client. Dabei loggt sich das arduino auch ein in mysql bzw versucht ist fliegt aber nach ein paar sekunden wieder raus.

#include "SPI.h"
#include "Ethernet.h"
#include "sha1.h"
#include "avr/pgmspace.h"
#include "stdlib.h"
#include "mysql.h"

  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
  IPAddress ip(192,168,20,177);
  IPAddress server_addr(192,168,20,5);
  IPAddress subnet(255,255,255,0);


Connector my_conn; 
  boolean sqlconnect = false;
  



void setup()
{
   Serial.begin(9600);
  delay(1000);
  Ethernet.begin(mac, ip, subnet);
  unsigned int mysqlPort=3306;
  char user[]="projektadmin";
  char password[]="admin123";
  Serial.println("Verbinde bitte warten...");

  if (my_conn.mysql_connect(server_addr, mysqlPort, user, password))
  {
    delay(500);
    static char sqlbuf[128];
    static char sqlDbase[]="USE projektblitzer";
    char edb4[]="INSERT INTO analog_data(analog0,analog1) VALUES ('12', 15)";
    sqlconnect=true;
    Serial.println("Query Success!");
    delay(150);
    my_conn.cmd_query(sqlDbase);
  }
  else
    Serial.println("verbindung nicht möglich!");
}



void loop() {
  
   
  
}

xiTeLx: Wir benutzen xampp bei dieser version. Sprich localhost. kann gut sein das er mit localhost nichts anfangen kann werde dann einfach mal versuchen 127.0.0.1 statt localhost zu verwenden. Denn dort wo localhost drin steht soll man ja den webspace eintragen. Denke also eher nicht das dort was anderes rein gehört oder täusche ich mich?

Du täuscht dich!

Fast jeder inet fähige Rechner ist localhost. Aus seiner Sicht.

Ein irgendwie geartetes XXXXX.connect("localhost"); Heißt nichts anderes, als: Ich quatsche mit mir selber.

Und 127.0.0.1 ist nur der aufgelöste "localhost". Bringt dir also auch nichts.

Sprich localhost. kann gut sein das er mit localhost nichts anfangen kann werde dann einfach mal versuchen 127.0.0.1 statt localhost zu verwenden

Also zur kurzen Erklärung: localhost ist das Selbe wie 127.0.0.1 das ist die Bezeichung für die local-loopback adresse um den IP-Stack zu prüfen. Bei Windowsmaschinen wird das mit localhost vereinfacht und über das OS auf 127.0.0.1 projeziert. D.h. wenn ihr beim Arduino auf 127.0.0.1 referenziert, dann zeigt das (sofern das beim ETH-Shield implementiert ist) auf sein eigenes Interface... da wird sich kein Sql-Server finden :-P

IPAddress server_addr(192,168,20,5);

Wenn dann, kommt das rein und kein 172.0.0.1... Ob die IP stimmt, müsst ihr wissen...

Dabei loggt sich das arduino auch ein in mysql bzw versucht ist fliegt aber nach ein paar sekunden wieder raus.

Was sagt das LOGfile vom XAMP? Fehlermeldung vom SQL-Server?

  • kommt eine Verbindung zustande?
  • Meldet er sich richtig an?
  • Fliegt er raus weil er die Verbindung nicht ordnungsgemäß nach Abfrage schließt? (TIMEOUT?)
  • schreibt er die Werte in die DB?

char edb4[]="INSERT INTO analog_data(analog0,analog1) VALUES ('12', 15)";

  • sonstiges?

Checkt mal was da genau vor sich geht

LG

Bei der zweiten version benutzen wir nicht xampp sondern den normalen windows server client von mysql. Wenn ich dort unter aktive verbindungen schaue wenn ich das arduino programm starte versucht sich der user einzuloggen. Wird auch als aktive verbindung angezeigt dauert aber nur ein paar sekunden danach ist die verbindung wieder verschwunden. Im arduino programm gibt er aber auch keine fehlermeldung aus das die verbindungen fehlgeschlagen sei. Ich glaube es liegt an der authentifizierung. Aber habe keinen Plan wo der fehler liegt. Der user hat auch die entsprechenden rechte auf die datenbank etc.

xiTeLx: Bei der zweiten version benutzen wir nicht xampp sondern den normalen windows server client von mysql. Wenn ich dort unter aktive verbindungen schaue wenn ich das arduino programm starte versucht sich der user einzuloggen. Wird auch als aktive verbindung angezeigt dauert aber nur ein paar sekunden danach ist die verbindung wieder verschwunden. Im arduino programm gibt er aber auch keine fehlermeldung aus das die verbindungen fehlgeschlagen sei. Ich glaube es liegt an der authentifizierung. Aber habe keinen Plan wo der fehler liegt. Der user hat auch die entsprechenden rechte auf die datenbank etc.

Also von meinen Fragen hast du sehr wenige beantwortet :)

1.) ich nehme an, dass es der selbe Rechner ist -> die selbe IP adresse -> das Adressproblem ist mal gelöst... ;) 2.) weiß ich immer noch nicht ob etwas in die Datenbank geschrieben wird 3.) verwendet mal den XAMP und schaut was die LOGfiles hergeben

Ich glaub aber immer noch, dass ihr rausfliegt, weil die Verbindung zum SQL nach abfrage nicht geschlossen wird... Denn ihr baut eine Verbindung auf, schreibt einen Wert in die Tabelle und lasst dann die Verbindung einfach offen... sprich sollte eine andere Anwendung auf den SQL Service zugreifen wollen, ist der Port belegt -> kommt der nicht hin. Und das ist sicher nicht im Sinne eines solchen Systemes.

Mein Tipp: Baut die Verbindung nachdem ihr die Werte eingetragen habt wieder ab. Außerdem macht es ja keinen Sinn, wenn ihr die Verbindung nachdem ihr getan habt was ihr wolltet einfach offen lasst, oder? Das ist wie zum Supermarkt fahren, einkaufen, und dann einfach dort am Parkplatz stehen bleiben.

Ich weiß nicht wie das im Lib implementiert ist. aber Standard wäre mysql.close(). Das ist sicher einen Versuch wert :-)

LG

  1. ja ip problem gelöst. er versucht ja schließlich sich zu verbinden.
  2. nein es werden keine daten übergeben

Es scheint so als würde er beim anmelde vorgang abbrechen anscheinend. Er versucht sich einzuloggen bricht aber dabei ab. Der user hat rechte für die db und alles andere stimmt eigendlich auch. Irgendwelche ideen woran das liegen könnte?

Die Ablage von Arduino Messdaten in einer MySQL DB habe ich in meinem Blog ausführlich beschrieben.
hier

erni-berni: Die Ablage von Arduino Messdaten in einer MySQL DB habe ich in meinem Blog ausführlich beschrieben. -> hier

Ja habe deine anleitung benutzt um mit php die daten zu übergeben. leider stellt er bei mir keine verbindung her =/ habe eigendlich alles schritt für schritt gemacht wie du es beschrieben hast. Daher etwas ratlos.