Grill Arduino Programmcode

Aus HSHL Mechatronik
Version vom 15. Januar 2014, 12:43 Uhr von Dominik Rebein (Diskussion | Beiträge) (Die Seite wurde neu angelegt: „<pre> #if ARDUINO > 18 #include <SPI.h> // Für Arduino Version größer als 0018 #endif #include <Ethernet.h> #include <TextFinder.h> #include <SD.h> …“)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
Zur Navigation springen Zur Suche springen

#if ARDUINO > 18
#include <SPI.h> // Für Arduino Version größer als 0018
#endif
#include <Ethernet.h>
#include <TextFinder.h>
#include <SD.h>

boolean grillAn = false;
boolean statusrequest = true;  //Unterscheidung, ob Daten abgerufen werden oder die HTML Seite


char actionString[16];
const int fileStringLength = 24;       // length of the file requested
const int typeLength = 6;
char requestTypeString[typeLength];
char fileString[fileStringLength];

byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0D, 0x57, 0x90 }; // MAC-Adresse des Ethernet-Shield
byte ip[]  = {
  192, 168, 0, 88 };                   // IP zum aufrufen des Webservers
byte sdPin = 4;                                      // Pin der SD-Karte

EthernetServer server(80);                           // Server port

File webFile;

void setup()
{
  Ethernet.begin(mac, ip); // Client starten
  server.begin();          // Server starten
  Serial.begin(9600);
  Serial.println("ARDUINO - STEUERUNG");

  Serial.println("Initialisiere SD-Karte...");
  if (!SD.begin(sdPin))
  {
    Serial.println(" - Initialisierung der SD-Karte fehlgeschlagen!");
    return;
  }
  Serial.println(" - SD-Karte erfolgreich initialisiert.");

  if (!SD.exists("index.htm"))
  {
    Serial.println(" - Datei (index.htm) wurde nicht gefunden!");
    return;
  }
  Serial.println(" - Datei (index.htm) wurde gefunden.");

  Serial.println();
  Serial.println("Verbraucher schalten");
}

void loop()
{
  EthernetClient client = server.available(); // Auf Anfrage warten
  int requestType = 0;   // what type of request (GET or POST);
  int requestedFileLength = 0;

  if(client)
  {

    /*****************************************
     * Ausgänge über das Webformular steuern  *
     *****************************************/
    TextFinder finder(client);

    if(finder.getString("","/", requestTypeString,typeLength)){
      // Do something different for GET or POST:
      if(String(requestTypeString) == "GET " ) {
        requestType = 1;
      }
      else if(String(requestTypeString) == "POST ") {
        requestType = 2;
      }

      // gather what comes after the / into an array,
      // it's the filename the client wants:
      requestedFileLength = finder.getString("", " ",
      fileString, fileStringLength);

      switch (requestType) {
      case 1:    // GET, Daten/Seite abrufen
        if (requestedFileLength < 2)
        {
          statusrequest = false;
          Serial.println("HTML Steuerungsseite ausgeben");
        }else{
          statusrequest = true;
          Serial.println("Status ausgeben");
        }
        break;
      case 2:    //POST, Schaltvorgang durchführen
        //Hier wird nur nach der länge des anfragestrings unterschieden, da ein suchen in der anfrage nicht gut funktioniert
        Serial.println(requestedFileLength);
        switch (requestedFileLength){
          case 22:  // /?action=switchgrillon = 22 Zeichen

            //TODO: Hier Code zum anschalten
            //aufruf als POST

            grillAn = true;
            Serial.println("Grill anschalten");
            break;
          case 23:  // /?action=switchgrilloff = 21 Zeichen

            //TODO: Der Code zum abschalten
            //aufruf als POST

            grillAn = false;
            Serial.println("Grill ausschalten");
            break;
        }

        break;
      }
    }





    /************************
     * Webformular anzeigen  *
     ************************/
    boolean current_line_is_blank = true;       // eine HTTP-Anfrage endet mit einer Leerzeile und einer neuen Zeile

      while (client.connected())
    {
      if (client.available())                   // Wenn Daten vom Server empfangen werden
      {
        char c = client.read();                 // empfangene Zeichen einlesen
        if (c == '\n' && current_line_is_blank) // wenn neue Zeile und Leerzeile empfangen
        { // Standard HTTP Header senden

          switch (requestType) {
          case 1: //GET, entweder Status oder Datei ausgeben
            if(statusrequest){
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: application/json");
              client.println("Access-Control-Allow-Origin: *");
              client.println("Connection: close");
              client.println();
              client.print("{\"temperature\" : \"");

              //TODO: Hier die Temperatur ausgeben

              client.print(random(10,4000));
              client.print("\", \"grillstatus\": \"");

              //TODO: Hier den Grillstatus ausgeben


              client.print(grillAn ? "an" : "aus");
              client.println("\"}");
            }else{
              // Website von SD-Karte laden
              client.println("HTTP/1.1 200 OK");
              client.println("Content-Type: text/html");
              client.println("Access-Control-Allow-Origin: *");
              client.println("Connection: close");
              client.println();

              webFile = SD.open("index.htm");  // Website laden
              if (webFile)
              {
                while(webFile.available())
                {
                  client.write(webFile.read()); // Website an Client schicken
                }
                webFile.close();
              }
            }
            break;
          case 2: //POST, wir kennen keine Fehlerfälle beim umschalten, geben immer OK zurück ;)
            client.println("HTTP/1.1 200 OK");
            client.println("Content-Type: application/json");
            client.println("Access-Control-Allow-Origin: *");
            client.println("Connection: close");
            client.println();
            client.print("{\"result\" : \"OK\"}");
            break;
          }
          break;
        }
        if (c == '\n')
        {
          current_line_is_blank = true;
        }
        else if (c != '\r')
        {
          current_line_is_blank = false;
        }
      }
    }
    delay(1);
    client.stop();
  }
}