Ethernet Shield

Hallo alle zusammen,
ich bin relativ unerfahren, was Arduino angeht. Ich versuche momentan ein Projekt umzusetzen, in dem auf einer Website eine Tabelle ist, in welcher ein counter ist, der immer um +1 hochgeht wenn der Arduino eine bestimmte Keycard mit dem RFID Lesegerät liest. Ich habe es bereits hinbekommen, dass die Keycards ausgelesen und unterschieden werden können(d.h. wenn eine bestimmte Keycard erkannt wird, dann leuchtet eine der Keycard zugewiesenes Licht). Jetzt habe ich ein Ethernet Shield und möchte dass dieses in einer Datenbank einträgt, dass die Keycard A benutzt wurde oder halt Keycard B. Kann mir jemand eventuell erklären wie man das hinbekommen kann? Ich habe mir sämtliche Videos angeguckt oder etwas dazu durchgelesen, doch nirgends wird der Programmcode sauber und verständlich erklärt. Auch weiß ich nicht wie ich die IP Adresse des Ethernet Shields auslesen auslesen kann. Ich habe es so ausprobiert, wie es überall erklärt wurde aber dann wurde mir nur die IP 0.0.0.0. ausgegeben.
Ich kann ja mal die Codes, die ich bisher verwendet habe zeigen.
Danke im Voraus
Paul

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 10, 11, 198, 198 };

EthernetServer server(80);

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

  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("IP Address: ");
  Serial.println(Ethernet.localIP());

}

void loop () {}

Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [code] davor und [/code] dahinter ohne *).
Dann ist er auch auf mobilen Geräten besser lesbar.
Das kannst Du auch noch nachträglich ändern.

Außerdem entferne bitte die unnötigen Leerzeilen.

Gruß Tommy

Edit: In welche Datenbank willst Du eintragen? Soll die Website auf dem Arduino liegen oder einem anderen Webserver?

Danke für die Rückmeldung,
habe den Code jetzt als Code makiert. Ich habe eine externe Datenbank und eine externen Webserver. gehostet von bplaced. http://stempel-wdg.bplaced.net/indexx.php (benutzer Test, passwort: Test)kannst du dir ja mal angucken, wenn man sich eingeloggt hat, dann kommt da eine Tabelle, in der der counter halt nach oben gehen soll. Und ich habe keine Ahning, wie das ethernet Shield datn an die Datenbank bermitteln kann oder auslesen kann. Aus dem was ich bisher geunden habe, habe ich mir erschlossen dass ein Code ungefähr so anfagen msste:

#include <SPI.h>
#include <MFRC522.h>
#include <Ethernet.h>

#define RST_PIN   8     
#define SS_PIN    9 

MFRC522 mfrc522(SS_PIN, RST_PIN);

byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
byte ip[] = {10, 10, 10, 10};                                    // static arduino IP
byte server[] = {148, 251, 158, 38};                                // static server IP 
EthernetClient client;            

void setup() {
  Serial.begin(9600);  
  SPI.begin();         
  mfrc522.PCD_Init();
    
        // enable ethernet
  pinMode(10, OUTPUT);
  digitalWrite(10, LOW); 
         // disable rfid
  pinMode(9, OUTPUT);
  digitalWrite(9, HIGH);
     
        // disable sd card
  pinMode(4, OUTPUT);
  digitalWrite(4, HIGH);
}

Nur damit wir uns richtig verstehen:

Du willst Daten (= die UID der gelesene Karte) an einen Webserver senden?

Der Suchbegriff dazu ist "Arduino Webclient" und es gibt in der IDE zwei Beispiele dazu.
Das ist einer davon: https://www.arduino.cc/en/Tutorial/WebClientRepeating

Hast du diese schon gefunden und ausprobiert?
Wenn nein, probiere es aus und gib bescheid ob es funktioniert.

paullim:
(benutzer Test, passwort: test)kannst du dir ja mal angucken, wenn man sich eingeloggt hat

Login failed. Aber das ist auch egal.
Was für eine DB ist es? Ich vermute MySQL.

Kannst Du bei Deinem Provider direkt von außen auf die DB zugreifen?
Wenn ja: diese Lib

Wenn nein: Du musst ein PHP-Programm schreiben, dass die Daten in die DB einträgt. Dieses rufst Du dann, wie bereis geschrieben, mit dem HTTP-Client auf.

Gruß Tommy

ps, deine angegebenen login-Daten sind falsch.

Wenn man sie erratet, kommt man auf ein schlecht formatiertes HTML

<table border="1"><tr><td class='t11'>Test</td><td class='t11'>C9 8B 13 89</td><td class='t11'>0</td></tr></table><!DOCTYPE html>
<html>
    <head>
        <title>Stempelterminal</title>
        <link rel="stylesheet" href="style3.css">
        <meta charset="utf-8">
        <link rel="stylesheet" href="style2.css">
        
    </head>
    <body>

    
    <div class="logout-button">
    <a href="logout.php">Ausloggen</a>
    </div>
        
</body> 
</html>

beides richtigstellen bitte.

falls du es nochmal Probieren möchtest, Passwort Ist Test also groß geschrieben habe ich eben aus versehen falsch geschrieben.

Danke Tommy, Probiere die Libary gleich mal aus, und danke noiasca, probiere das auch gleich mal aus. Melde mich dann nochmal wie es geklappt hat! Falls ihr das ganze mit dem login nochmal ausprbieren möchtet, dann könnt ihr euch auch einen Account erstellen und euch dann einloggen: http://stempel-wdg.bplaced.net/Register.php

PS: Es ist eine MySQL Datenbank. Also ich kann auf die datenbank mit user,password und host zugreifen also ist ja das gleiche wie, wenn die erstellen Accounts von der Website gespeichert werden.

Liebe Grüße
Paul

paullim:
PS: Es ist eine MySQL Datenbank. Also ich kann auf die datenbank mit user,password und host zugreifen also ist ja das gleiche wie, wenn die erstellen Accounts von der Website gespeichert werden.

Nicht zwingend. Manche Provider blocken alles, was nicht aus ihrem eigenen Bereich kommt.
Wenn Du von außen (PC) mit einem DB-Tool (HeidiSQL, DBeaver) zugreifen kannst, dann sollte es auch mit dem Direktzugriff funktionieren.

Gruß Tommy

Hallo, wie finde ich die MyDNS heraus?

IPAddress myDns(192, 168, 0, 1);

Danke im Vor aus!

Was meinst Du damit?

Gruß Tommy

Ich Frage mich wofür das steht, also welche IP bei myDns eingegangen werden muss. Und woher ich diese IP bekomme.
Danke im voraus

Das ist Dein DNS-Server, also zu Hause in den meisten Fällen die IP des Routers.

Gruß Tommy

Vielen Dank!

Eine Frage habe ich noch, ich möchte die UID welche das RFID Lesegerät ausgelesen hat als Variable speichern um diese UID an die Datenbank zu senden. Ich habe hier den Code, mit dem man die UID auslesen und im Seriellen Monitor ausgeben kann. Eventuell kann mir jemand helfen meine Idee umzusetzen, Danke im Voraus!

#include <SPI.h>
#include <MFRC522.h>
#include <Ethernet.h>
 
#define RST_PIN   8     
#define SS_PIN    9    
 
MFRC522 mfrc522(SS_PIN, RST_PIN);   
 
void setup() {
  Serial.begin(9600);  
  SPI.begin();         
  mfrc522.PCD_Init();  
}
 
void loop() {
  
 
  
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial() ) {
    Serial.print("Gelesene UID:");
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " ");
      Serial.print(mfrc522.uid.uidByte[i], HEX);
    } 
    Serial.println();

Schau Dir mal PString an. Das ist ein Char-Array, in dass Du mit Print rein "drucken" kannst und dass Du anschließend weiter verwenden kannst. Ansonsten Infos zu Zeichenketten.

Gruß Tommy

Edit: Ansonsten sprintf/snprintf

Danke erstmal, das Problem habe ich nun dank deiner Hilfe geklärt. Jetzt habe ich in meinem Aktuellen Programmcode(unten dargestellt) einen Fehler bei dem ich nicht mehr weiter weiß. Vielleicht kennt sich damit ja jemand aus und kann mir helfen. Danke im Voraus.
Habe übrigens Programmcode sowie Fehlermeldung unten gezeigt.

#include <SPI.h>       
#include <MFRC522.h>
#include <Ethernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>

byte mac_addr[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

IPAddress server_addr(IP); // IP des MySQL *server* 
char user[] = "USER";           // MySQL user login username
char password[] = "PASSWORT";  // MySQL user login password
char GeleseneUID[] = "0";              // Die variable für die später gelesene UID

#define RST_PIN   8                    //definiert den SPI Reset Pin
#define SS_PIN    9                    //definiert den SPI Slave Select Pin

MFRC522 mfrc522(SS_PIN, RST_PIN);      //Instanz des MFRC erzeugen

void setup() {                         // Diese Funktion wird einmalig beim Start ausgeführt
  Serial.begin(115200);                // Serielle Kommunikation mit dem PC initialisieren
  SPI.begin();                         // Initialisiere SPI Kommunikation
  mfrc522.PCD_Init();                  // Initialisiere MFRC522 Lesemodul
  while (!Serial);                     // warten auf seriellen port zum verbinden    MUSS AM ENDE GELÖSCHT WERDEN
  Ethernet.begin(mac_addr);            // Initialisiere Ethernet Kommunikation
  Serial.println("Connecting...");     // gibt "Connecting..." in dem Seriellen Monitor aus
  if (conn.connect(server_addr, 3306, user, password)) { //wenn mit dem MySQL Verbunden ist
    delay(1000);
  }
  else
    Serial.println("Connection failed.");  //gibt "Connection failed." im Seriellen Monitor aus
}

der Fehler Code:

Arduino: 1.8.12 (Windows 10), Board: "Arduino Uno"

 In function 'void setup()':

:33:7: error: 'conn' was not declared in this scope

   if (conn.connect(server_addr, 3306, user, password)) { //wenn mit dem MySQL Verbunden ist

       ^~~~

:33:7: note: suggested alternative: 'tone'

   if (conn.connect(server_addr, 3306, user, password)) { //wenn mit dem MySQL Verbunden ist

       ^~~~

       tone

exit status 1
'conn' was not declared in this scope

"if (conn.connect(server_addr,"

woher kommt denn das "conn." vor dem connect?

Da fehlt die globale Variable conn:

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

Schau Dir nochmal die Beispiele der Lib an.

Gruß Tommy