Arduino – Netzwerksettings von SD-Karte laden

Am 04.April 2013 habe ich in dem Artikel “Arduino – Wert von SD-Karte lesen und einer Variable zuweisen” veröffentlicht. Dies war ein ganz einfaches Beispiel in dem sich nur eine Zahl in einer Datei befand.

Netzwerksettings von SD-Karte laden

Im  heutigen Beitrag wird es nun etwas spannender. Ich werde in diesem Beitrag zeigen wie man sämtliche Netzwerksettings, die man benötigt um mit dem Ethernet-Shield eine Verbindung zum Internet aufzubauen,  aus einer Textdatei laden kann, die sich auf einer SD-Karte befindet. Der Vorteil dieser Methode liegt klar auf der Hand. Wenn sich einmal Werte ändern, weil man z.B. denProvider gewechselt hat, muss nicht der Arduino neu programmiert sondern lediglich die Textdatei auf der SD-Karte angepasst werden.

 

UnoEthernetShieldSDNetzwerk

 

SD-Karte

NETWORK.TXT

Beschreibung der einzelnen Werte.
Wichtig ist, das jeder Wert in dieser Reihenfolge in einer eigenen Zeile steht. Nach der letzten Zeile sollte ebenfalls ein Zeilenumbruch eingefügt werden (Enter-Taste). Am Ende der Textdatei können Sie gern beliebigen Text wie Hinweise anfügen. Diese werden durch den Arduino ignoriert.

  • Zeile1 = MAC-Adresse des Arduino
  • Zeile2 = Lokale IP über die der Arduino im Netzwerk erreichbar sein soll
  • Zeile3 = SUBNET Maske
  • Zeile4 = Gateway
  • Zeile5 = DNS
  • Zeile6 = IP-Adresse zum Server auf dem die PHP-Datei liegt
  • Zeile7 = Server Host
  • Zeile8 = Server URL
  • Zeile9 = Server KEY
  • Zeile10 = User Agent
5C,A3,DF,0E,64,3D
192.168.2.111
255.255.255.0
192.168.2.1
192.168.2.1
96.173.175.122
fluuux.de
/ARDUINO/UpdateSensorAddresses.php
Passwort123
Arduino

 

Arduino-Sketch

In der Funktion “readNetworkSettingsFromSD” wird versucht, die Datei NETWORK.TXT von der SD-Karte zu öffnen. Wenn diese Datei gefunden wurde und erfolgreich geöffnet werden konnte, werden die Zeichen aus dieser Datei nacheinander eingelesen. Wird ein ‘\n’, also ein Zeilenumbruch erkannt, dann wird eine Zeile nach der anderen geparst und der gefundene Wert der entsprechenden variablen zugeordnet. Besser gesagt, wird der Wert der zugehörigen Variablen durch den Wert aus der Textdatei überschrieben.

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

int chipSelect = 4;                                         // SD card chip select pin

//Netzwerkdaten von der SD Karte (NETWORK.TXT)
byte mac[6]      = { 0x5C, 0xA3, 0xDF, 0x0E, 0x64, 0x3D };  // MAC-Adresse des Arduino auf SD Karte
byte localip[4]  = { 192, 168, 2, 111};                     // IP-Adresse des Arduino auf SD Karte
byte netmask[4]  = { 255, 255, 255, 0 };                    // Netzmaske auf SD Karte
byte gateway[4]  = { 192, 168, 2, 1 };                      // Gateway auf SD Karte
byte DNS[4]      = { 192, 168, 2, 1 };                      // DNS auf SD Karte
byte serverip[4] = { 96, 173, 175, 122 };                   // IP-Adresse des Web-Servers zu dem Daten gesendet werden auf SD Karte
char serverhost[50] = "fluuux.de";                          // Domain
char serverurl[100] = "/ARDUINO/UpdateSensorAddresses.php"; // Serverurl auf SD Karte
char serverkey[20]  = "Passwort123";                        // ServerKey auf SD Karte
char useragent[20]  = "Ethernet-Shield";                    // Useragent auf SD Karte

EthernetClient client;                                      // Fur Verbindung zum Server
boolean connected = false;                                  // Speichert den Verbimndungsstatus

SdFat sd;                                                   // file system auf SD-Karte

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

  Serial.println("Initialisiere SD-Karte...");
  if(!sd.begin(chipSelect, SPI_HALF_SPEED)) 
  {
    Serial.println("- Fehler beim initialisieren der SD-Karte!\n");
    sd.initErrorHalt();
  } else Serial.println("- SD Karte erfolgreich initialisiert.\n");

  //Netzwerksetting von SD-Karte laden (NETWORK.TXT) und mit Netzwerk verbinden
  Serial.println("Lade Netzwerksettings von SD-Karte (NETWORK.TXT)...");
  Serial.print("- Voreingestellter UserAgent: ");
  Serial.println(useragent);
  readNetworkSettingsFromSD();
  Serial.print("- Useragent von SD-Karte: ");
  Serial.println(useragent);

  //Ethernet
  delay(1000);
  Serial.println("\nInitialisiere Ethernet...\n");
  Ethernet.begin(mac, localip, dns, gateway, netmask);
}

/* Netzwerksettings Zeilenweise aus Textdatei von SD-Karte laden */
void readNetworkSettingsFromSD() 
{
  SdFile myFile("NETWORK.TXT", O_RDWR);
  char netBuffer[50];
  if (myFile.isOpen()) 
  {
    int chPos = 0;
    int lineNo = 0;

    Serial.println("- Netzwerksettings erfolgreich geladen.");

    while (myFile.available())
    {
      char ch = myFile.read();

      if(ch == '\n') // '\r' oder '\n'
      {
        chPos = 0;

        switch(lineNo) 
        {
          case 0: //MAC-Adresse
            sscanf(netBuffer,"%2x.%2x.%2x.%2x.%2x.%2x",&mac[0],&mac[1],&mac[2],&mac[3],&mac[4],&mac[5]);
          break;
          case 1: //LocalIP
            sscanf(netBuffer,"%u.%u.%u.%u",&localip[0],&localip[1],&localip[2],&localip[3]);
          break;
          case 2: //Netmask
            sscanf(netBuffer,"%u.%u.%u.%u",&netmask[0],&netmask[1],&netmask[2],&netmask[3]);
          break;
          case 3: //Gateway
            sscanf(netBuffer,"%u.%u.%u.%u",&gateway[0],&gateway[1],&gateway[2],&gateway[3]);
          break;
          case 4: //DNS
            sscanf(netBuffer,"%u.%u.%u.%u",&DNS[0],&DNS[1],&DNS[2],&DNS[3]);
          break;
          case 5: //ServerIP
            sscanf(netBuffer,"%u.%u.%u.%u",&serverip[0],&serverip[1],&serverip[2],&serverip[3]);
          break;
          case 6: //ServerHost
            sscanf(netBuffer,"%s",serverhost);
          break;
          case 7: //ServerURL
            sscanf(netBuffer,"%s",serverurl);
          break;
          case 8: //Serverkey
            sscanf(netBuffer,"%s",serverkey);
          break;
          case 9: //Useragent
            sscanf(netBuffer,"%s",useragent);
          break;
        } // switch
        lineNo++;
      } // if(ch == '\n') // '\r' oder '\n'
      else if(ch == '\r') {
        // do nothing
      }
      else if(chPos < 100) 
      {        
        netBuffer[chPos] = ch;
        chPos++;
        netBuffer[chPos] = 0;
      }
    } // while (myFile.available())

    myFile.close();
    int x;
  } // if (myFile.isOpen())
  else
  {
    Serial.println("- Fehler beim ermitteln der Netzwerksettings!\n");
    sd.initErrorHalt();
  }
}

void loop()
{

}

 

ArduinoNetworksettingsFromSD

Über profwebapps

Programmierer, Webdesigner, Grafiker, Mac-User, Blogger, Screencaster. profwebapps ist auch bei Google+ vertreten

2 Kommentare zu “Arduino – Netzwerksettings von SD-Karte laden

  1. Danke für das Tutorial… ;-)… Weiter so…
    Beim auslesen der Mac-Adressen müssten in der sscanf-Anweisung doch Kommas anstatt der Punkte stehen, oder?

    Was macht die Standard-SD-Library anders in diesem Fall?
    Schöne Grüße
    Ralf

  2. Du hast recht, funktioniert aber auch so.

    Die Standard SD Library bläht meinen Code extrem auf.
    Ich muss auf jedes Byte achten da ich an einem größeren Projekt arbeite und mit der Standard SD Library schaffe ich es nicht alles auf den MicroController zu bekommen.

Kommentar verfassen