INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Arduino Zugriff auf MySQL Server - !ohne PHP!
01.08.2014, 16:29 (Dieser Beitrag wurde zuletzt bearbeitet: 01.08.2014 16:43 von rkuehle.)
Beitrag #1
Arduino Zugriff auf MySQL Server - !ohne PHP!
Hallo Forum,

der Titel sagt eigentlich schon alles. Daher hier nur die notwendigen Angaben/Scripte:
Hardware:
Arduino Mega 2560
Standard - Ethernetshield mit Wiznet 5100 Chip
Software Arduino: IDE 1.5.5 / Ubuntu 64 Bit
Software Server: MySQL 5.x Community Version
Als spezielle Library wird der MySQL Connector benutzt. Nähere Infos siehe hier: https://launchpad.net/mysql-arduino
Da die Struktur im Lib Archiv ein bischen durcheinander geraten ist, die notwendigen Dateien im .zip - Anhang.
Den Inhalt der .zip in einem Unterverzeichnis "mysql" im "libraries" Verzeichnis ablegen.
Was macht das Script:
- Arduino wird mit DHCP-Adresse versorgt
- wartet auf Start des SerialMonitor
- nimmt Verbindung mit MySQL Server auf
- führt eine Select-Query aus
- gibt die Ergebnisse auf dem SerialMonitor aus
Sollen keine Select-Queries ausgeführt werden, sondern zB. nur INSERTs, kann man die Zeile
Code:
#define WITH_SELECT
in der Datei mysql.h auskommentieren. Das spart Speicher!
Hier nun der Code:
mysql.ino:
Code:
// Beispielsketch zum Direktzugriff auf MySQL Server. Ricardo Kühle 08 / 2014
#include <SPI.h> // SPI für EthernetShield
#include <Ethernet.h> // Ethernet
#include <mysql.h> // MySql Connector
#include <sha1.h> // sha Crypto
#include "settings.h" // konstante Werte

EthernetClient client; // EthernetClient - Instanz erstellen
Connector my_conn; // Connector - Instanz erstellen

void setup() {
  Ethernet.begin(my_mac); // Ethernet starten
  xdelay();
  Ethernet.maintain(); // DHCP Adresse holen
  xdelay();
  Serial.begin(9600); // Serialmonitor starten
  while (!Serial); // warten bis SerialMonitor aktiv
  Serial.println(F("Verbindung wird aufgebaut..."));
  if (my_conn.mysql_connect(server_addr, 3306, user, password))
  {
  xdelay();
  do_query(TEST_SELECT_QUERY);
  }
  else Serial.println(F("Verbindung fehlgeschlagen."));
}

void loop() { }

// Funktion legt Pause ein
void xdelay()
{
  unsigned lastnow = millis();
  while (millis() - lastnow < t_delay) ;
}

// Funktion führt die Query aus
void do_query(const char *q) {
  column_names *c; // pointer zu Feldnamen
  row_values *r;   // pointer zu Datensatzwerten
  // Query ausführen.
  // Wenn ein Pointer erstellt wird existiert ein Resultset.
  // Wenn nicht, dann aussteigen
  if (!my_conn.cmd_query(q)) {
    return;
  }
  // Feldnamen auslesen. Ist immer erforderlich, da vom Connector benutzt
  c = my_conn.get_columns();
  for (int i = 0; i < c->num_fields; i++) {
    Serial.print(c->fields[i]->name);
    if (i < c->num_fields - 1) {
      Serial.print(F(","));
    }
  }
  Serial.println();
  // Datensätze auslesen
  int num_cols = c->num_fields;
  int rows = 0;
  do {
    r = my_conn.get_next_row();
    if (r) {
      rows++;
      for (int i = 0; i < num_cols; i++) {
        Serial.print(r->values[i]);
        if (i < num_cols - 1) {
          Serial.print(F(", "));
        }
      }
      Serial.println();
      my_conn.free_row_buffer(); // Datensatzpuffer leeren bevor nächster Datensatz
    }
  } while (r);
  Serial.print(rows);
  Serial.println(F(" Datensaetze"));
  my_conn.free_columns_buffer();   // Feldnamenpuffer leeren
}
settings.h:
Code:
// SQL Server muss Zugriff % für user erlauben.
// Firewall des Servers muss Port TCP 3306 nach außen freigeben
static char user[] = "Username"; // SQL-Nutzer
static char password[] = "secret"; // SQL Kennwort
static char TEST_SELECT_QUERY[] = "SELECT * FROM database.table LIMIT 100"; // MySQL Query
static IPAddress server_addr(10, 0, 1, 2); // IP-Adresse MySQL Server
static byte my_mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9B, 0xC1 }; // MAC-Adresse des Arduino
const unsigned int t_delay=1000; // Pausenzeit
Na dann, viel Spaß damit Smile
Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.08.2014, 15:49
Beitrag #2
RE: Arduino Zugriff auf MySQL Server - !ohne PHP!
Hallo,

ich hab so manche Foren durchsucht, aber kein einziges Demo gefunden,
wo mal jemand einen DS18B20 mit MAC ausgelesen und direkt in eine DB
geschrieben hat ...

Hat zufällig jemand einen DemoCode, wo man die Beziehung aus float
und dem DB-Eintrag ersehen kann ??

DANKE - Gruß Sepro


------------------------------------------ Anbei ein Teil-Sketch ---------------


#include <SPI.h>
#include <Ethernet.h>
#include <mysql.h>
#include <sha1.h>
#include <OneWire.h>
#include <DallasTemperature.h>

// Data wire is plugged into pin 3 on the Arduino
#define ONE_WIRE_BUS 6

// Setup a oneWire instance to communicate with any OneWire devices
OneWire oneWire(ONE_WIRE_BUS);

// Pass our oneWire reference to Dallas Temperature.
DallasTemperature sensors(&oneWire);


DeviceAddress wohnen = { 0x28, 0x82, 0xD8, 0xE0, 0x4, 0x0, 0x0, 0x2D };
DeviceAddress schlafen = { 0x28, 0x3E, 0xB6, 0xE1, 0x4, 0x0, 0x0, 0x6B };
DeviceAddress aussen = { 0x28, 0xFF, 0x48, 0xE1, 0x4, 0x0, 0x0, 0xC7 };

// IP Adressen - Netzwerk


byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // MAC-Adresse des Arduino
byte ip[] = { 192, 168, 2, 20 }; // IP-Adresse des Arduino
byte server_addr[] = { 192, 168, 2, 101 }; // IP-Adresse des Web-Servers zu dem Daten gesendet werden


// Datenbank Referenz und Zugangsdaten

Connector my_conn; // The Connector/Arduino reference
char user[] = "user2"; // Name des Users, welcher in der Datenbank registriert ist
char password[] = "1234"; //Passwort des USER, welcher in der Datenbank registriert ist
// char INSERT_SQL[] = "INSERT INTO test_arduino.hello VALUES ('Hello from Arduino!', NULL)";


// Zeit - Intervall für Temperatur-Print

unsigned long timedelay = millis();
const int interval = 5000;

// Test - Eintrag eines Wortes in die Datenbank zum Test der Verbindung


// DEMO Zeile für erweitere Angaben zur DB-Ansteuerung

// $SQL = "INSERT INTO test.temperature (sensor ,celsius) VALUES ('".$_GET["serial".$counter]."', '".$_GET["temperature".$counter]."')";


char INSERT_SQL[] = "INSERT INTO db_test.temp VALUES ('xxxxxxxxx', 'xxxxxxxxx', 'xxxxxxxxxx')";



void setup()
{

Serial.begin(9600); // start serial port

sensors.begin(); // Start

sensors.setResolution(wohnen, 10); // Auflösung = 10 Bit
sensors.setResolution(schlafen, 10); // Auflösung = 10 Bit
sensors.setResolution(aussen, 10); // Auflösung = 10 Bit

Ethernet.begin(mac, ip); //Start Ethernet MIT eigener IP
if (Ethernet.begin(mac) == 0) for(;Wink;


delay(1000); // 1 Sekunde Zeit zum initialisieren des Ethernet


Serial.println("Connecting...");
if (my_conn.mysql_connect(server_addr, 3306, user, password))
{
delay(500);

Serial.println("Query Success!");
}
else
Serial.println("Connection failed.");

}





void loop()

{


// Termperatur auf Serial Monitor ausgeben

if ((millis()-timedelay) > interval) {

Serial.print("Getting temperatures...\n\r");
sensors.requestTemperatures();

Serial.print("Wohnzimmer: ");
printTemperature(wohnen);
Serial.print("\n\r");
Serial.print("Schlafzimmer: ");
printTemperature(schlafen);
Serial.print("\n\r");
Serial.print("Aussentemperatur: ");
printTemperature(aussen);
Serial.print("\n\r\n\r");

my_conn.cmd_query(INSERT_SQL);
Serial.println("Query Success!");


timedelay = millis();

}


}




// ------------------------- Temperatur-Sensoren -------------------------


void printTemperature(DeviceAddress deviceAddress) // Alle DS18B20-Sensoren gleichzeitig auslesen
{
float tempC = sensors.getTempC(deviceAddress);
if (tempC == -127.00) { // WENN Keine Daten empfangen werden, dann ERROR ausgeben
Serial.print("Error getting temperature"); // ERROR Meldung
} else {
// Serial.print("C: ");
Serial.print(tempC);
// Serial.print(" F: ");
// Serial.print(DallasTemperature::toFahrenheit(tempC));
}
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
13.09.2014, 12:57
Beitrag #3
RE: Arduino Zugriff auf MySQL Server - !ohne PHP!
Hallo sepro,

hier gibts ein Beispiel für ein INSERT über den Connector: http://drcharlesbell.blogspot.de/2013/04...ino_6.html
Für die Temperaturwerte solltest du in der SQL-Tabelle die Spalten als float(5,2) setzen.

Grüße RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.05.2015, 11:05
Beitrag #4
RE: Arduino Zugriff auf MySQL Server - !ohne PHP!
Hay ho,

ich hab da leider ein Kleines Problem mit dem was du da hast zum auslesen aus der DB funktioniert bei mir nicht so wirklich zumindest bekomme ich keine ausgabe mit der ich weiter arbeiten bzw die in einer Variablen speichern kann .... Sad ich brauch das aber damit arduino das licht an oder aus und auch die "Heizung" ein oder aus schaltet ... bzw bis zu einer bestimmten temperatur hochzieht und die dann hällt .... kannst du mir da helfen ? Weil wie gesagt mit deinem Sketch bekomme ich da keine daten zum weiterarbeiten oder kannst du mir sagen was ich da ändern muss ?


Anbei der Code
____________________________________________________________________

#include "SPI.h"
#include "Ethernet.h"
#include "sha1.h"
#include "mysql.h"


int ledgelb = 2;
int Taste = 7;
boolean x,y;
int lauf,z;


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

static char sqlbuf[128];

static char Auslesen_Licht[] = "SELECT status FROM smarthome.zustand where id = '2'";
static char Auslesen_Licht2[] = "SELECT * FROM smarthome.zustand WHERE id='2'";
const char INSERT_ZUSTAND_EIN[] = "UPDATE smarthome.zustand set status = '1' where id='2'";
//const char INSERT_ZEIT_EIN[] = "UPDATE smarthome.zeitlicht set zustand = '1' where id='1'";
const char QUERY_POP[] = "SELECT population FROM world.city WHERE name = 'New York'";
const char INSERT_ZUSTAND_AUS[] = "UPDATE smarthome.zustand set status = '0' where id='2'";
//const char INSERT_ZEIT_AUS[] = "UPDATE smarthome.zeitlicht set zustand = '0' where id='1'";
Connector my_conn;

void setup()
{
//SQL Verbindung
Ethernet.begin(mac, ip, subnet);
unsigned int mysqlPort=3306;
char user[]="inolicht";
char password[]="Arduinolicht";

//Licht
pinMode(ledgelb, OUTPUT);
pinMode(Taste, INPUT);

Serial.begin(9600);

Serial.println("Verbinde bitte warten...");

if (my_conn.mysql_connect(server_addr, mysqlPort, user, password))
{
Serial.println("Verbunden!");
}
else

Serial.println("verbindung nicht möglich!");


}
// Funktion führt die Query aus


void loop()
{/*
my_conn.cmd_query(Auslesen_Licht);
my_conn.show_results();
*/

}

// Funktion legt Pause ein

// Funktion führt die Query aus
void do_query(const char *Auslesen_Licht) {
column_names *c; // pointer zu Feldnamen
row_values *r; // pointer zu Datensatzwerten
// Query ausführen.
// Wenn ein Pointer erstellt wird existiert ein Resultset.
// Wenn nicht, dann aussteigen
if (!my_conn.cmd_query(Auslesen_Licht)) {
Serial.print(1);
return;
}
// Feldnamen auslesen. Ist immer erforderlich, da vom Connector benutzt
c = my_conn.get_columns();
for (int i = 0; i < c->num_fields; i++) {
Serial.print(c->fields[i]->name);
if (i < c->num_fields - 1) {
Serial.print(F(","));
}
}
Serial.println();
// Datensätze auslesen
int num_cols = c->num_fields;
int rows = 0;
do {
r = my_conn.get_next_row();
if ® {
rows++;
for (int i = 0; i < num_cols; i++) {
Serial.print(r->values[i]);
if (i < num_cols - 1) {
Serial.print(F(", "));
}
}
Serial.println();
my_conn.free_row_buffer(); // Datensatzpuffer leeren bevor nächster Datensatz
}
} while ®;
Serial.print(rows);
Serial.println(F(" Datensaetze"));
my_conn.free_columns_buffer(); // Feldnamenpuffer leeren
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
03.05.2015, 11:23
Beitrag #5
RE: Arduino Zugriff auf MySQL Server - !ohne PHP!
(02.05.2015 16:02)t.a.f.k.a.Z. schrieb:  @Yuuki90: Du hast den wichtigen Satz vergessen Angry
Zitat:Kann mir jemand helfen bitte.... Ich will das in eine Variable speichern damit ich damit weiter arbeiten kann .... ist für unser Schulprojekt welches ende des Monats abgegeben werden muss ... Sad Bitte ich brauche dringend hilfe Sad.

LG Yuuki90

...öhm warum vergessen, den Spruch kennen wir doch eh schon auswendig....Angry Angel Blush
lg
bk

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
06.05.2015, 12:56
Beitrag #6
RE: Arduino Zugriff auf MySQL Server - !ohne PHP!
das hat nix mit hausaufgaben zutun sondern eher das wir in unserem projekt nicht weiterkommen darum frage ich hier nach sorry ...-.-
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.09.2016, 10:36 (Dieser Beitrag wurde zuletzt bearbeitet: 02.09.2016 10:38 von mainframe.)
Beitrag #7
RE: Arduino Zugriff auf MySQL Server - !ohne PHP!
Hallo Ricardo,

leider bin ich noch kein aktivierter User und kann deswegen womöglich Deine zip datei nicht laden.

Ich hab das Problem, dass der Username nicht richtig an die Datenbank übermittelt wird. Es wird, wenn ich die IP festlege der User so übermittelt:

Connecting...
Error: 75 = Access denied for user 'root'@'192.168.8.15' (using password: YES).
Connection failed.


Auf dem mySQL Server kommt er auch genau so an und bekommt natürlich keinen Zugriff:


Log MySQL:

Zitat:Timestamp, Thread, Type, Details
2016-09-01T14:43:42, 11, Note, Access denied for user 'root'@'192.168.8.15' (using password: YES)

Wenn ich mir eine IP via DHCP zuteilen lasse sieht der Username so aus:
Zitat:Timestamp, Thread, Type, Details
2016-09-01T14:29:25, 7, Note, Access denied for user 'root'@'wiznet6444a9.intern' (using password: YES)

Hast jemand eine Idee woran das liegen kann? Ich habe schon verschiedene Versionen der Ethernet lib ausprobiert, leider ohne Erfolg.

Verwendet hab ich den Beispiel Code vom MySQL Connector

MfG Denis

Code:
/*
  MySQL Connector/Arduino Example : query results

  This example demonstrates how to issue a SELECT query and how to read columns
  and rows from the result set. Study this example until you are familiar with how to
  do this before writing your own sketch to read and consume query results.

  NOTICE: You must download and install the World sample database to run
          this sketch unaltered. See http://dev.mysql.com/doc/index-other.html.

  INSTRUCTIONS FOR USE

  1) Change the address of the server to the IP address of the MySQL server
  2) Change the user and password to a valid MySQL user and password
  3) Connect a USB cable to your Arduino
  4) Select the correct board and port
  5) Compile and upload the sketch to your Arduino
  6) Once uploaded, open Serial Monitor (use 115200 speed) and observe

  Note: The MAC address can be anything so long as it is unique on your network.

  Created by: Dr. Charles A. Bell
*/
#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

byte mac_addr[] = { 0x00, 0x50, 0xB6, 0x64, 0x44, 0xA9 }; // Mac des Arduinos
IPAddress ip(192, 168, 8, 15);   // IP des Arduinos

IPAddress server_addr(192,168,8,51);  // IP of the MySQL *server* here
char user[] = "root";              // MySQL user login username
char password[] = "start";        // MySQL user login password

// Sample query
char query[] = "SELECT * FROM world.city LIMIT 12";

EthernetClient client;
MySQL_Connection conn((Client *)&client);

void setup() {
  Serial.begin(115200);
  while (!Serial); // wait for serial port to connect
  Ethernet.begin(mac_addr, ip);
  Serial.println("Connecting...");
  if (conn.connect(server_addr, 3306, user, password)) {
    delay(1000);
  }
  else
    Serial.println("Connection failed.");
}


void loop() {
  delay(2000);

  Serial.println("\nRunning SELECT and printing results\n");

  // Initiate the query class instance
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  // Execute the query
  cur_mem->execute(query);
  // Fetch the columns and print them
  column_names *cols = cur_mem->get_columns();
  for (int f = 0; f < cols->num_fields; f++) {
    Serial.print(cols->fields[f]->name);
    if (f < cols->num_fields-1) {
      Serial.print(", ");
    }
  }
  Serial.println();
  // Read the rows and print them
  row_values *row = NULL;
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      for (int f = 0; f < cols->num_fields; f++) {
        Serial.print(row->values[f]);
        if (f < cols->num_fields-1) {
          Serial.print(", ");
        }
      }
      Serial.println();
    }
  } while (row != NULL);
  // Deleting the cursor also frees up memory used
  delete cur_mem;
}
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.09.2016, 16:39
Beitrag #8
RE: Arduino Zugriff auf MySQL Server - !ohne PHP!
Hallo mainframe,

hast du daran gedacht dem MySQL - User über phpmyadmin unter Benutzer den Host "%" zuzuweisen. "%" steht für alle Hosts. Oder aber du gibtst dem Arduino eine feste Adresse und trägst diese ein.

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Die Bytemühle - einfacher Zugriff auf einzelne Bytes einer Mehrbyte-Variablen ardu_arne 4 2.218 16.11.2015 19:30
Letzter Beitrag: Retian
  web server mit DHCP für acht kanal voltmeter alfredoli 13 7.674 07.06.2014 00:53
Letzter Beitrag: rkuehle

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste