Grill Arduino Programmcode: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
(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> …“)
 
Keine Bearbeitungszusammenfassung
 
Zeile 1: Zeile 1:
<pre>
<pre>
/*********************************************************************************************
**********************************************************************************************
Dieses Programm dient der Initialisierung des Ethernet-Shields, des Starten des Webservers und
**************der Kommunikation zwischen dem Arduino und der Website.*************************
**Das Programm wurde von Kathrin Liedmann, Benedikt Schulte und Dominik Rebein im Rahmen des**
***********Elektrotechnik Fachpraktikums an Hochschule Hamm-Lippstadt entwickelt.*************
***************Die Grundstruktur stammt von der Seite http://www.fluuux.de.*******************
**********************************************************************************************
*********************************************************************************************/


#if ARDUINO > 18
 
#include <SPI.h> // Für Arduino Version größer als 0018
#if ARDUINO > 18                      // Ãœberprüfung ob Arduino Version größer als 18
#include <SPI.h>                     // Einbinden der spi.h (Bibliothek)
#endif
#endif
#include <Ethernet.h>
#include <Ethernet.h>                 // Einbinden der benötigten Bibliotheken
#include <TextFinder.h>
#include <TextFinder.h>
#include <SD.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
* Variablen Deklaration  *
const int typeLength = 6;
***********************/
 
 
boolean grillAn = false;                // Erstellen der Variable grillAn und setzen des Ausgangswertes auf false
boolean statusrequest = true;            // Unterscheidung, ob Daten abgerufen werden sollen oder die HTML Seite abgerufen werden soll
 
char actionString[16];                   // Anlegen der Variable actionString vom Typ char
const int fileStringLength = 24;         // Anlegen der Variable fileStringLength vom Typ const Integer für die Länge der Datenabfrage
const int typeLength = 6;               // Anlegen der Variable typeLength vom Typ const int
char requestTypeString[typeLength];
char requestTypeString[typeLength];
char fileString[fileStringLength];
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


/**********************************
* Ethernetshield Grundeinstellungen  *
**********************************/
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x57, 0x90 };  // MAC-Adresse des Ethernet-Shields (Steht auf dem Ethernetshield)
byte ip[]  = { 192, 168, 0, 88 };                      // IP zum aufrufen des Webservers festlegen
byte sdPin = 4;                                        // Pin der SD-Karte am Arduino
EthernetServer server(80);                            // Server port festlegen
File webFile;
File webFile;
/********************************
* Ethernetshield Initialisieren  *
********************************/


void setup()
void setup()
{
{
   Ethernet.begin(mac, ip); // Client starten
   Ethernet.begin(mac, ip);                 // Client starten
   server.begin();         // Server starten
   server.begin();                         // Server starten
   Serial.begin(9600);
   Serial.begin(9600);                     // Baudrate, also Anzahl der übertragenen Symbole pro Zeiteinheit
   Serial.println("ARDUINO - STEUERUNG");
   Serial.println("ARDUINO - STEUERUNG");   // Statusausgabe für den Serialmonitor


   Serial.println("Initialisiere SD-Karte...");
   Serial.println("Initialisiere SD-Karte...");                           // Statusausgabe für den Serialmonitor
   if (!SD.begin(sdPin))
   if (!SD.begin(sdPin))
   {
   {
     Serial.println(" - Initialisierung der SD-Karte fehlgeschlagen!");
     Serial.println(" - Initialisierung der SD-Karte fehlgeschlagen!");   // Statusausgabe für den Serialmonitor
     return;
     return;
   }
   }
   Serial.println(" - SD-Karte erfolgreich initialisiert.");
   Serial.println(" - SD-Karte erfolgreich initialisiert.");             // Statusausgabe für den Serialmonitor


   if (!SD.exists("index.htm"))
   if (!SD.exists("index.htm"))
   {
   {
     Serial.println(" - Datei (index.htm) wurde nicht gefunden!");
     Serial.println(" - Datei (index.htm) wurde nicht gefunden!");       // Statusausgabe für den Serialmonitor
     return;
     return;
   }
   }
   Serial.println(" - Datei (index.htm) wurde gefunden.");
   Serial.println(" - Datei (index.htm) wurde gefunden.");               // Statusausgabe für den Serialmonitor


   Serial.println();
   Serial.println();                                                     // Leerzeile ausgeben
   Serial.println("Verbraucher schalten");
   Serial.println("Verbraucher schalten");                               // Statusausgabe für den Serialmonitor
}
}
/***************
* Hauptprogramm  *
***************/


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


Zeile 66: Zeile 93:
     * Ausgänge über das Webformular steuern  *
     * Ausgänge über das Webformular steuern  *
     *****************************************/
     *****************************************/
     TextFinder finder(client);
     TextFinder finder(client);                                 // Den Befehl "finder" aus der Finderbibliothek laden


     if(finder.getString("","/", requestTypeString,typeLength)){
     if(finder.getString("","/", requestTypeString,typeLength)) // Unterscheidung des Strings, GET or POST
      // Do something different for GET or POST:
    {
       if(String(requestTypeString) == "GET " ) {
 
       if(String(requestTypeString) == "GET " )                 // Wenn der String == GET dann requestType Variable auf 1
      {
         requestType = 1;
         requestType = 1;
       }
       }
       else if(String(requestTypeString) == "POST ") {
       else if(String(requestTypeString) == "POST ")             // Wenn der Strink == Post dann requestType Variable auf 2
      {
         requestType = 2;
         requestType = 2;
       }
       }


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


       switch (requestType) {
      // Ansammeln was nach dem / in das Array geschrieben wird
       case 1:   // GET, Daten/Seite abrufen
      // Der Dateiname den der Client benötigt:
 
      requestedFileLength = finder.getString("", " ", fileString, fileStringLength);
 
       switch (requestType)
      {
 
       case 1:                                                 // GET Aufruf, Daten von der Seite werden abrufen
 
         if (requestedFileLength < 2)
         if (requestedFileLength < 2)
         {
         {
           statusrequest = false;
           statusrequest = false;
           Serial.println("HTML Steuerungsseite ausgeben");
           Serial.println("HTML Steuerungsseite ausgeben");
         }else{
         }
        else
        {
           statusrequest = true;
           statusrequest = true;
           Serial.println("Status ausgeben");
           Serial.println("Status ausgeben");
         }
         }
         break;
         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
 
       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 hat (zu lange Wartezeiten)
         Serial.println(requestedFileLength);
         Serial.println(requestedFileLength);
         switch (requestedFileLength){
         switch (requestedFileLength)
           case 22: // /?action=switchgrillon = 22 Zeichen
        {
 
           case 22:                                           // /?action=switchgrillon = 22 Zeichen


             //TODO: Hier Code zum anschalten
             //Hier muss die Variable aus dem Grillprogramm eingebunden werden: Code zum Anschalten bei Implementierung das Grillprogramm
             //aufruf als POST
             //Aufruf als POST


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


             //TODO: Der Code zum abschalten
          case 23:                                            // /?action=switchgrilloff = 21 Zeichen
             //aufruf als POST
 
             //Hier muss die Variable aus dem Grillprogramm eingebunden werden:Code zum Abschalten bei Implementierung in Grillprogramm
             //Aufruf als POST


             grillAn = false;
             grillAn = false;
Zeile 137: Zeile 178:


           switch (requestType) {
           switch (requestType) {
           case 1: //GET, entweder Status oder Datei ausgeben
           case 1:                               //GET, entweder Status oder Datei ausgeben
             if(statusrequest){
             if(statusrequest){
               client.println("HTTP/1.1 200 OK");
               client.println("HTTP/1.1 200 OK");
Zeile 146: Zeile 187:
               client.print("{\"temperature\" : \"");
               client.print("{\"temperature\" : \"");


               //TODO: Hier die Temperatur ausgeben
               //Hier muss die Variable aus dem Grillprogramm eingebunden werden: Hier die Temperatur ausgeben


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


               //TODO: Hier den Grillstatus ausgeben
               //Hier muss die Variable aus dem Grillprogramm eingebunden werden: Hier den Grillstatus ausgeben




               client.print(grillAn ? "an" : "aus");
               client.print(grillAn ? "an" : "aus");
               client.println("\"}");
               client.println("\"}");
             }else{
             }
              // Website von SD-Karte laden
 
            else
 
            {
                                                    // Website von SD-Karte laden
               client.println("HTTP/1.1 200 OK");
               client.println("HTTP/1.1 200 OK");
               client.println("Content-Type: text/html");
               client.println("Content-Type: text/html");
Zeile 164: Zeile 209:
               client.println();
               client.println();


               webFile = SD.open("index.htm"); // Website laden
               webFile = SD.open("index.htm");       // Website laden
               if (webFile)
               if (webFile)
               {
               {
                 while(webFile.available())
                 while(webFile.available())
                 {
                 {
                   client.write(webFile.read()); // Website an Client schicken
                   client.write(webFile.read());     // Website an Client schicken
                 }
                 }
                 webFile.close();
                 webFile.close();
Zeile 175: Zeile 220:
             }
             }
             break;
             break;
           case 2: //POST, wir kennen keine Fehlerfälle beim umschalten, geben immer OK zurück ;)
 
 
           case 2:                                     //POST, wir kennen keine Fehlerfälle beim umschalten, geben immer OK zurück!
 
             client.println("HTTP/1.1 200 OK");
             client.println("HTTP/1.1 200 OK");
             client.println("Content-Type: application/json");
             client.println("Content-Type: application/json");
Zeile 200: Zeile 248:
   }
   }
}
}
</pre>
</pre>

Aktuelle Version vom 5. Februar 2014, 19:16 Uhr

/*********************************************************************************************
**********************************************************************************************
Dieses Programm dient der Initialisierung des Ethernet-Shields, des Starten des Webservers und
**************der Kommunikation zwischen dem Arduino und der Website.*************************
**Das Programm wurde von Kathrin Liedmann, Benedikt Schulte und Dominik Rebein im Rahmen des**
***********Elektrotechnik Fachpraktikums an Hochschule Hamm-Lippstadt entwickelt.*************
***************Die Grundstruktur stammt von der Seite http://www.fluuux.de.*******************
**********************************************************************************************
*********************************************************************************************/


#if ARDUINO > 18                      // Überprüfung ob Arduino Version größer als 18
#include <SPI.h>                      // Einbinden der spi.h (Bibliothek)
#endif
#include <Ethernet.h>                 // Einbinden der benötigten Bibliotheken
#include <TextFinder.h>
#include <SD.h>



/************************
* Variablen Deklaration  *
 ***********************/


boolean grillAn = false;                 // Erstellen der Variable grillAn und setzen des Ausgangswertes auf false
boolean statusrequest = true;            // Unterscheidung, ob Daten abgerufen werden sollen oder die HTML Seite abgerufen werden soll

char actionString[16];                   // Anlegen der Variable actionString vom Typ char
const int fileStringLength = 24;         // Anlegen der Variable fileStringLength vom Typ const Integer für die Länge der Datenabfrage
const int typeLength = 6;                // Anlegen der Variable typeLength vom Typ const int
char requestTypeString[typeLength];
char fileString[fileStringLength];



/**********************************
* Ethernetshield Grundeinstellungen  *
 **********************************/

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x57, 0x90 };   // MAC-Adresse des Ethernet-Shields (Steht auf dem Ethernetshield)
byte ip[]  = { 192, 168, 0, 88 };                      // IP zum aufrufen des Webservers festlegen
byte sdPin = 4;                                        // Pin der SD-Karte am Arduino
EthernetServer server(80);                             // Server port festlegen
File webFile;


/********************************
* Ethernetshield Initialisieren  *
 ********************************/

void setup()
{
  Ethernet.begin(mac, ip);                 // Client starten
  server.begin();                          // Server starten
  Serial.begin(9600);                      // Baudrate, also Anzahl der übertragenen Symbole pro Zeiteinheit
  Serial.println("ARDUINO - STEUERUNG");   // Statusausgabe für den Serialmonitor

  Serial.println("Initialisiere SD-Karte...");                           // Statusausgabe für den Serialmonitor
  if (!SD.begin(sdPin))
  {
    Serial.println(" - Initialisierung der SD-Karte fehlgeschlagen!");   // Statusausgabe für den Serialmonitor
    return;
  }
  Serial.println(" - SD-Karte erfolgreich initialisiert.");              // Statusausgabe für den Serialmonitor

  if (!SD.exists("index.htm"))
  {
    Serial.println(" - Datei (index.htm) wurde nicht gefunden!");        // Statusausgabe für den Serialmonitor
    return;
  }
  Serial.println(" - Datei (index.htm) wurde gefunden.");                // Statusausgabe für den Serialmonitor

  Serial.println();                                                      // Leerzeile ausgeben
  Serial.println("Verbraucher schalten");                                // Statusausgabe für den Serialmonitor
}

/***************
* Hauptprogramm  *
 ***************/

void loop()
{
  EthernetClient client = server.available();             // Auf Anfrage warten
  int requestType = 0;                                    // Welche Art der Nachfrage (GET or POST);
  int requestedFileLength = 0;

  if(client)
  {

    /*****************************************
     * Ausgänge über das Webformular steuern  *
     *****************************************/
    TextFinder finder(client);                                  // Den Befehl "finder" aus der Finderbibliothek laden

    if(finder.getString("","/", requestTypeString,typeLength))  // Unterscheidung des Strings, GET or POST
    {

      if(String(requestTypeString) == "GET " )                  // Wenn der String == GET dann requestType Variable auf 1
       {
        requestType = 1;
      }
      else if(String(requestTypeString) == "POST ")             // Wenn der Strink == Post dann requestType Variable auf 2
      {
        requestType = 2;
      }


      // Ansammeln was nach dem / in das Array geschrieben wird
      // Der Dateiname den der Client benötigt:

      requestedFileLength = finder.getString("", " ", fileString, fileStringLength);

      switch (requestType)
      {

      case 1:                                                  // GET Aufruf, Daten von der Seite werden 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 hat (zu lange Wartezeiten)
        Serial.println(requestedFileLength);
        switch (requestedFileLength)
        {

          case 22:                                            // /?action=switchgrillon = 22 Zeichen

            //Hier muss die Variable aus dem Grillprogramm eingebunden werden: Code zum Anschalten bei Implementierung das Grillprogramm
            //Aufruf als POST

            grillAn = true;
            Serial.println("Grill anschalten");
            break;

          case 23:                                            // /?action=switchgrilloff = 21 Zeichen

            //Hier muss die Variable aus dem Grillprogramm eingebunden werden:Code zum Abschalten bei Implementierung in Grillprogramm
            //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\" : \"");

              //Hier muss die Variable aus dem Grillprogramm eingebunden werden: Hier die Temperatur ausgeben

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

              //Hier muss die Variable aus dem Grillprogramm eingebunden werden: 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();
  }
}