UNO WIFI REV2 mit Wifi verbinden

Hallo Leute, ich habe einen UNO Wifi Rev2 an welchem ein Joy RFID Reader angeschlossen ist.
Den Reader habe ich soweit zum laufen bekommen das läuft alles und ich kann mir die Ausgabe des Readers über den serial monitor anzeigen lassen.

Jetzt ist das Ziel den Arduino nur noch an die Stromversorgung anzuschließen und dann über einen Computer welcher sich im lokalen Netzwerk befindet die Ausgabe des RFID Readers auszulesen.

Ich hab das hier schon einmal probiert klick und kriege mich auch mit dem Wlan verbunden allerdings ist mir unklar wie ich jetzt da den Code für den RFID Reader einbringe und wie ich dessen Ausgabe dann über das Netzwerk auslesen kann.

Hat jemand von euch eine Idee wie man das ganze realisieren könnte?

Viele Grüße
Alexander

Hi Alex,

google ist immer eine fünf Minuten suche Wert

arduino send data to server

viele Grüße Stefan

Hi Stefan ist natürlich immer einfach, einen Ahnungslosen auf die Google Suche zu verweisen bringt mir aber genau genommen nicht wirklich was (Mal im ernst wenn ich die Sache sofort per Google Suche gefunden hätte, würde ich hier nicht posten ist für mich doch auch mehr Aufwand)...

Wenn du wüssest, dass ich bereits seit 4 Stunden an der Sache sitze :confused:

Ich habe es bisher geschafft das RFID Reader Programm mit dem Wifi Ping Test Programm zu verbinden:
Also der Arduino verbindet sich mittels Wifinina mit den Netzwerk und wenn ich eine Karte auf den RFID Reader auflege wird die UID (welche ich brauche) ausgegeben.

Ich hab es sogar geschafft die UID als String zu speichern, diese möchte ich jetzt über das Netzwerk auf einem anderen Rechner abrufen.

Also könntet ihr mir vielleicht ein paar konkretere Tipps geben wie ich diesen String (Ist nicht mehr nötig die ganze Konsole zu lesen) über ein Netzwerk auslesen kann?

Ich hatte mir das für den Anfang etwa so vorgestellt:
Ich gebe die IP Adresse des Arduino ein und einen befehl also bei mir momentan http://192.168.178.52/String und kriege dann den String der UID.

Viele Grüße

Anbei mein Programmcode:

#include <SPI.h>
#include <WiFiNINA.h>
#include "arduino_secrets.h"
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);

///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
int status = WL_IDLE_STATUS;     // the WiFi radio's status

// Specify IP address or hostname
String hostName = "www.google.com";
int pingResult;

void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial); 
    SPI.begin();
    mfrc522.PCD_Init();
    mfrc522.PCD_DumpVersionToSerial(); //Details des Lesegerätes ausgeben
    Serial.println(F("Scan PICC to see UID, type, and data blocks..."));
     // wait for serial port to connect. Needed for native USB port only
  

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);

    // wait 5 seconds for connection:
    delay(5000);
  }

  // you're connected now, so print out the data:
  Serial.println("You're connected to the network");
  printCurrentNet();
  printWiFiData();
}

void loop() {

  //Suche nach neuen Karten
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
  }
  //Informationsabruf des RFID-Gerätes
  
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  char str[56] = "";
  array_to_string(mfrc522.uid.uidByte, 7, str); //Insert (byte array, length, char array for output)
  Serial.println(str); //Print the output uid string
}

void printWiFiData() {
  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP address : ");
  Serial.println(ip);

  Serial.print("Subnet mask: ");
  Serial.println((IPAddress)WiFi.subnetMask());

  Serial.print("Gateway IP : ");
  Serial.println((IPAddress)WiFi.gatewayIP());

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printMacAddress(mac);
}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print the MAC address of the router you're attached to:
  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  printMacAddress(bssid);
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI): ");
  Serial.println(rssi);

  // print the encryption type:
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type: ");
  Serial.println(encryption, HEX);
  Serial.println();
}

void printMacAddress(byte mac[]) {
  for (int i = 5; i >= 0; i--) {
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
    if (i > 0) {
      Serial.print(":");
    }
  }
  Serial.println();
}

void array_to_string(byte array[], unsigned int len, char buffer[]){
   for (unsigned int i = 0; i < len; i++){
      byte nib1 = (array[i] >> 4) & 0x0F;
      byte nib2 = (array[i] >> 0) & 0x0F;
      buffer[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
      buffer[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
   }
   buffer[len*2] = '\0';
}

alex3480:
Ich hatte mir das für den Anfang etwa so vorgestellt:
Ich gebe die IP Adresse des Arduino ein und einen befehl also bei mir momentan http://192.168.178.52/String und kriege dann den String der UID.

Dein Stichwort ist webserver.
An Deine Bedürfnisse anpassen:

Hab mir das Beispiel tatsächlich kurz bevor du es geschickt hast selber angeguckt aber trotzdem schonmal vielen Dank.

Bin schon einmal weiter gekommen und habe den Server soweit initialisiert, allerdings habe ich jetzt das Problem dass wenn ich die IP aufrufe er die ganze Zeit die Seite lädt (soweit richtig) allerdings keine Ausgabe erscheint welcher ich per client.println ausgeben möchte. Habt ihr da ne Idee woran es haken könnte?
Der Befehl müsste eigentlich ausgeführt werden, da ich das "test" in der Konsole sehe.

#include <SPI.h>
#include <WiFiNINA.h>
#include "arduino_secrets.h"
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);


///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
char str[56] = "";
boolean update = false;
int status = WL_IDLE_STATUS;     // the WiFi radio's status
WiFiServer server(80);


void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial); 
    SPI.begin();
    mfrc522.PCD_Init();
    mfrc522.PCD_DumpVersionToSerial(); //Details des Lesegerätes ausgeben
    Serial.println(F("Scan PICC to see UID, type, and data blocks..."));
     // wait for serial port to connect. Needed for native USB port only
  

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

  // you're connected now, so print out the data:
  Serial.println("You're connected to the network");
  printCurrentNet();
  printWiFiData();
  server.begin();
  
}

void loop() {

  
  WiFiClient client = server.available();
    if(client && update == false){   
      client.println(str);
      Serial.println("test");
      update = true;
  }
  

  
  //Suche nach neuen Karten
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
  }
  //Informationsabruf des RFID-Gerätes
  
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  
  array_to_string(mfrc522.uid.uidByte, 7, str); //Insert (byte array, length, char array for output)
  Serial.println(str);
  update = false;//Print the output uid string

 
  
  
}

void printWiFiData() {
  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP address : ");
  Serial.println(ip);

  Serial.print("Subnet mask: ");
  Serial.println((IPAddress)WiFi.subnetMask());

  Serial.print("Gateway IP : ");
  Serial.println((IPAddress)WiFi.gatewayIP());

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printMacAddress(mac);
}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print the MAC address of the router you're attached to:
  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  printMacAddress(bssid);
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI): ");
  Serial.println(rssi);

  // print the encryption type:
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type: ");
  Serial.println(encryption, HEX);
  Serial.println();
}

void printMacAddress(byte mac[]) {
  for (int i = 5; i >= 0; i--) {
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
    if (i > 0) {
      Serial.print(":");
    }
  }
  Serial.println();
}

void array_to_string(byte array[], unsigned int len, char buffer[]){
   for (unsigned int i = 0; i < len; i++){
      byte nib1 = (array[i] >> 4) & 0x0F;
      byte nib2 = (array[i] >> 0) & 0x0F;
      buffer[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
      buffer[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
   }
   buffer[len*2] = '\0';
}

alex3480:
Bin schon einmal weiter gekommen und habe den Server soweit initialisiert, allerdings habe ich jetzt das Problem dass wenn ich die IP aufrufe er die ganze Zeit die Seite lädt (soweit richtig) allerdings keine Ausgabe erscheint welcher ich per client.println ausgeben möchte. Habt ihr da ne Idee woran es haken könnte?

Ja.
Schau Dir das Beispiel nochmal an!

  WiFiClient client = server.available();
    if(client && update == false){   
      client.println(str);
      Serial.println("test");
      update = true;
  }

Der Browser bekommt nichts zurück, was er auswerten und damit anzeigen kann.

So ganz verstehe ich den Beispiel Code nicht da bin ich ehrlich, für mich ist println einfach eine Ausgabe von text, dass ich damit dem Server noch irgendwelche Infos gebe verwirrt mich. Auch habe ich ja bei mir den Unterschied, dass permanent die Schleife für den RFID Reader laufen muss und ich deshalb keine Schleife innerhalb des Servers anlegen kann sonst würden ja keine neuen Karten gelesen werden können.

Ich habe den Code angepasst und kriege die Ausgabe im Browser jetzt hin das funktioniert, wobei ich nicht glaube dass der Code so gut ist.

Des Weiteren habe ich noch keine Möglichkeit gefunden (habe mir hier alle Funktionen angeschaut klick) um die bisherige Ausgabe zu löschen.
Ich kriege es nur hin eine neue Zeile hinzuzufügen.

Gibt es eine Möglichkeit die bisherigen Ausgaben zu löschen?

#include <SPI.h>
#include <WiFiNINA.h>
#include "arduino_secrets.h"
#include <MFRC522.h>
#define RST_PIN 9
#define SS_PIN 10
MFRC522 mfrc522(SS_PIN, RST_PIN);


///////please enter your sensitive data in the Secret tab/arduino_secrets.h
char ssid[] = SECRET_SSID;        // your network SSID (name)
char pass[] = SECRET_PASS;    // your network password (use for WPA, or use as key for WEP)
char str[56] = "";
boolean update = false;
boolean start = false;

int status = WL_IDLE_STATUS;     // the WiFi radio's status
WiFiServer server(80);


void setup() {
  // Initialize serial and wait for port to open:
  Serial.begin(9600);
  while (!Serial); 
    SPI.begin();
    mfrc522.PCD_Init();
    mfrc522.PCD_DumpVersionToSerial(); //Details des Lesegerätes ausgeben
    Serial.println(F("Scan PICC to see UID, type, and data blocks..."));
     // wait for serial port to connect. Needed for native USB port only
  

  // check for the WiFi module:
  if (WiFi.status() == WL_NO_MODULE) {
    Serial.println("Communication with WiFi module failed!");
    // don't continue
    while (true);
  }

  String fv = WiFi.firmwareVersion();
  if (fv < WIFI_FIRMWARE_LATEST_VERSION) {
    Serial.println("Please upgrade the firmware");
  }

  // attempt to connect to WiFi network:
  while ( status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

  // you're connected now, so print out the data:
  Serial.println("You're connected to the network");
  printCurrentNet();
  printWiFiData();
  server.begin();
  
}

void loop() {

  
  WiFiClient client = server.available();
  
  if(client && start == false){
    client.println("HTTP/1.1 200 OK");
    client.println("Content-type:text/html");
    client.println();  
    start = true;
  }
    if(client.available() && update == false){ 
  
      client.println(str);
      client.println("
");
      Serial.println(str);
      update = true;
  }
  

  
  //Suche nach neuen Karten
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
  return;
  }
  if ( ! mfrc522.PICC_ReadCardSerial()) {
  return;
  }
  //Informationsabruf des RFID-Gerätes
  
  mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
  
  array_to_string(mfrc522.uid.uidByte, 7, str); //Insert (byte array, length, char array for output)
  Serial.println(str);
  update = false;//Print the output uid string

 
  
  
}

void printWiFiData() {
  // print your board's IP address:
  IPAddress ip = WiFi.localIP();
  Serial.print("IP address : ");
  Serial.println(ip);

  Serial.print("Subnet mask: ");
  Serial.println((IPAddress)WiFi.subnetMask());

  Serial.print("Gateway IP : ");
  Serial.println((IPAddress)WiFi.gatewayIP());

  // print your MAC address:
  byte mac[6];
  WiFi.macAddress(mac);
  Serial.print("MAC address: ");
  printMacAddress(mac);
}

void printCurrentNet() {
  // print the SSID of the network you're attached to:
  Serial.print("SSID: ");
  Serial.println(WiFi.SSID());

  // print the MAC address of the router you're attached to:
  byte bssid[6];
  WiFi.BSSID(bssid);
  Serial.print("BSSID: ");
  printMacAddress(bssid);
  // print the received signal strength:
  long rssi = WiFi.RSSI();
  Serial.print("signal strength (RSSI): ");
  Serial.println(rssi);

  // print the encryption type:
  byte encryption = WiFi.encryptionType();
  Serial.print("Encryption Type: ");
  Serial.println(encryption, HEX);
  Serial.println();
}

void printMacAddress(byte mac[]) {
  for (int i = 5; i >= 0; i--) {
    if (mac[i] < 16) {
      Serial.print("0");
    }
    Serial.print(mac[i], HEX);
    if (i > 0) {
      Serial.print(":");
    }
  }
  Serial.println();
}

void array_to_string(byte array[], unsigned int len, char buffer[]){
   for (unsigned int i = 0; i < len; i++){
      byte nib1 = (array[i] >> 4) & 0x0F;
      byte nib2 = (array[i] >> 0) & 0x0F;
      buffer[i*2+0] = nib1  < 0xA ? '0' + nib1  : 'A' + nib1  - 0xA;
      buffer[i*2+1] = nib2  < 0xA ? '0' + nib2  : 'A' + nib2  - 0xA;
   }
   buffer[len*2] = '\0';
}

Dazu solltest Du Deinem Browser nicht blanken Text, sondern HTML anbieten oder eine neue Page beginnen (Verbindung zum Client beenden).

Gruß Tommy

alex3480:
So ganz verstehe ich den Beispiel Code nicht da bin ich ehrlich, für mich ist println einfach eine Ausgabe von text, dass ich damit dem Server noch irgendwelche Infos gebe verwirrt mich. Auch habe ich ja bei mir den Unterschied, dass permanent die Schleife für den RFID Reader laufen muss und ich deshalb keine Schleife innerhalb des Servers anlegen kann sonst würden ja keine neuen Karten gelesen werden können.

Ich geb zu, es wird schwer Dir das zu verdeutlichen.
Doch, das was Du willst geht schon. Das Verständnis für das, was da passiert fehlt Dir nur.
Als erstes: Du brauchst definitiv eine vollständige html-Ausgabe, die der Browser auch versteht. Das, was Du jetzt versuchst, versteht der nicht - da kommt also nur Mist raus.

Der Browser fordert die Seite an.
Der Webserver sagt, ich hab hier was und sendet die Seite.
Wenn der Browser wieder eine/die Seite haben will, sagt er dem Webserver erneut, gib mir die Seite und der Webserver antwortet.
Das heisst, bei jedem loop()-Durchlauf, wird geprüft, ob der Webserver nach einer Seite gefragt wird.
Keine Schleife im Serverteil, die nur darauf waret eine Anforderung zu bekommen.

Dazu ist es aber notwendig dem Browser mitzuteilen, das nach der Übertragung nichts mehr kommt. Ist alles ausgeliefert, wird die Verbindung geschlossen.
Das ist das, was Tommy schon anmerkte.

Das, was Du willst ist das die Seite sich automatisch aktuallisiert.
Das ist eine andere Baustelle. Der Server kann im Http-Header (nicht im html-Header) dem Clienten sagen, das der automatisch alle xxx Zeit die Seite aktuallisiert. Damit entfällt das manuelle drücken auf F5 :wink:

Gibt es eine Möglichkeit die bisherigen Ausgaben zu löschen?

Du liest die Seite neu ein. - siehe oben: Refresh

Codeschnipsel ausgeschnitten aus einem meiner inos und zusammengekürzt; basierend auf dem Ethernet webserver. Nicht schön, aber vielleicht verständlich, was da passiert
Müsste bei dir rein nach "WiFiClient client = server.available();" Anstelle der beiden if...

boolean currentLineIsBlank = true;
while (client.connected())
{
  if (client.available())
  {
    char c = client.read();
    if (c == '\n' && currentLineIsBlank)
    {
      // http Header - der kommt einmal
      client.println ("HTTP/1.1 200 OK");
      client.println ("Connection: close");
      client.println ("Content-Type: text/html; charset=UTF-8");
      client.println ("Content-Language: de");
      client.println ("Refresh: 10"); // Seite wird automatisch neu gelesen
      client.println();
      // Ende http Header
      client.println ("<!DOCTYPE HTML>");
      client.println ("<html>");
      // Ausgabe: Hier kann alles mögliche rein
      // Beispiel: Aneinanderreihung von Zahlen
      client.print ("Zahlen: ");
      for (uint8_t i = 0; i < 5; i++)
      {
        client.print (i);
        client.print (" ");
      }
      client.println ("
");
      // Ende Ausgabe
      client.println ("</html>");
      break;
    }
    if (c == '\n')
    {
      currentLineIsBlank = true;
    }
    else
      if (c != '\r')
      {
        currentLineIsBlank = false;
      }
  }
}
// give the web browser time to receive the data
delay (5);
// close the connection:
client.stop();

inhaltlich geht das auch auf dem wifi, da es sich hierbei nur um die Bereitsstellung für den Browser handelt.