INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library)
24.05.2016, 20:40 (Dieser Beitrag wurde zuletzt bearbeitet: 24.05.2016 20:41 von avoid.)
Beitrag #1
Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library)
Hallo alle zusammen,
ich hab da mal etwas aus diversen Codes zusammengewürfelt und nun das Problem das es nicht mehr in meinen Arduino passt.

Zitat:Der Sketch verwendet 34.632 Bytes (107%) des Programmspeicherplatzes. Das Maximum sind 32.256 Bytes.
Globale Variablen verwenden 1.964 Bytes (95%) des dynamischen Speichers, 84 Bytes für lokale Variablen verbleiben. Das Maximum sind 2.048 Bytes.

Als Hardware habe ich dafür einen "Arduino Ethernet" und ein "Arduino GSM SHIELD 2".
Leider ist der Speicher des Ethernet so klein wie der des UNO (is ja im grunde ein UNO mit Ethernet on Board).
Da ich kein extra Ethernet Shield habe um den Code mit meinem Mega zu nutzen, muss er kleiner werden.

Die Serial.print befehle hab ich schon auskommentiert aber sonst hab ich leider keine Ahnung was ich noch gefahrlos rauswerfen oder irgendwie verkürzen könnte.
Macht es evtl sinn die Char-Arrays gegen Strings zu ersetzen, würde das den Code vereinfachen?
Habt ihr Tipps wo ich Code sparen kann?
p. s. hab auch mal die index.htm für das Webinterface angehangen, falls sich wer dafür interessiert. Die wird von SD-Card geladen.

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>
#include <GSM.h>
#define REQ_BUF_SZ   80
#define NUM_BUF_SZ   11
#define TEX_BUF_SZ   60
#define PINNUMBER ""

byte mac[] = { 0x90, 0xA2, 0xDA, 0x10, 0x25, 0xB3 };     // 90,A2,DA,10,25,B3
IPAddress ip(192, 168, 178, 177);                        // 192.168.178.177
EthernetServer server(80);                               // Web Server Port - Default 80
GSM gsmAccess;
GSM_SMS sms;
File webFile;                    // the web page file on the SD card
char HTTP_req[REQ_BUF_SZ] = {0}; // buffered HTTP request stored as null terminated string
char req_index = 0;              // index into HTTP_req buffer
char web_buf_num[NUM_BUF_SZ] = {0};// buffer to save web line 1 text to
char web_buf_tex[TEX_BUF_SZ] = {0};// buffer to save web line 2 text to

void setup()
{
  // disable Ethernet chip
  pinMode(10, OUTPUT);
  digitalWrite(10, HIGH);
  Serial.begin(9600);       // for debugging
  // initialize SD card
  //Serial.println("Initializing SD card...");
  if (!SD.begin(4)) {
      //Serial.println("ERROR - SD card initialization failed!");
      return;    // init failed
  }
  //Serial.println("SUCCESS - SD card initialized.");
  // check for index.htm file
  if (!SD.exists("index.htm")) {
      //Serial.println("ERROR - Can't find index.htm file!");
      return;  // can't find index file
  }
  //Serial.println("SUCCESS - Found index.htm file.");
  // init Ethernet device
  Ethernet.begin(mac, ip);
  server.begin();
  //Serial.print("Arduino IP ist: ");
  //Serial.println(Ethernet.localIP());
  // init the GSM connection
  //Serial.println("Starte GSM Shild");
  boolean notConnected = true;
  // Start GSM shield
  // If your SIM has PIN, pass it as a parameter of begin() in quotes
  while (notConnected)
  {
    if (gsmAccess.begin(PINNUMBER) == GSM_READY)
      notConnected = false;
    else
    {
      //Serial.println("Not connected");
      delay(1000);
    }
  }
  //Serial.println("GSM initialized");
}

void loop()
{
    EthernetClient client = server.available();  // try to get client
    if (client) {  // got client?
        boolean currentLineIsBlank = true;
        while (client.connected()) {
            if (client.available()) {   // client data available to read
                char c = client.read(); // read 1 byte (character) from client
                // limit the size of the stored received HTTP request
                // buffer first part of HTTP request in HTTP_req array (string)
                // leave last element in array as 0 to null terminate string (REQ_BUF_SZ - 1)
                if (req_index < (REQ_BUF_SZ - 1)) {
                    HTTP_req[req_index] = c;          // save HTTP request character
                    req_index++;
                }
                // last line of client request is blank and ends with \n
                // respond to client only after last line received
                if (c == '\n' && currentLineIsBlank) {
                    // send a standard http response header
                    client.println("HTTP/1.1 200 OK");
                    // remainder of header follows below, depending on if
                    // web page or XML page is requested
                    // Ajax request - send XML file
                    if (StrContains(HTTP_req, "ajax_inputs")) {
                        // send rest of HTTP header
                        client.println("Content-Type: text/xml");
                        client.println("Connection: keep-alive");
                        client.println();

                        if (GetwebText(web_buf_num, web_buf_tex, TEX_BUF_SZ)) {
                          //Serial.print("Handynummer: ");
                          //Serial.println(web_buf_num);
                          //Serial.print("Nachricht: ");
                          //Serial.println(web_buf_tex);
                          if (web_buf_num != "" && web_buf_tex != "") {
                            //Serial.println("Sende SMS!");
                            sendSMS(web_buf_num, web_buf_tex);
                          }
                        }
                    }
                    else {  // web page request
                        // send rest of HTTP header
                        client.println("Content-Type: text/html");
                        client.println("Connection: keep-alive");
                        client.println();
                        // send web page
                        webFile = SD.open("index.htm");        // open web page file
                        if (webFile) {
                            while(webFile.available()) {
                                client.write(webFile.read()); // send web page to client
                            }
                            webFile.close();
                        }
                    }
                    // reset buffer index and all buffer elements to 0
                    req_index = 0;
                    StrClear(HTTP_req, REQ_BUF_SZ);
                    break;
                }
                // every line of text received from the client ends with \r\n
                if (c == '\n') {
                    // last character on line of received text
                    // starting new line with next character read
                    currentLineIsBlank = true;
                }
                else if (c != '\r') {
                    // a text character was received from client
                    currentLineIsBlank = false;
                }
            } // end if (client.available())
        } // end while (client.connected())
        delay(1);      // give the web browser time to receive the data
        client.stop(); // close the connection
    } // end if (client)
}

boolean sendSMS(char *buf_num, char *buf_tex)
{
  // send the message
  sms.beginSMS(buf_num);
  sms.print(buf_tex);
  sms.endSMS();
  //Serial.println("Gesendet!");
  buf_num = "";
  buf_tex = "";
}

// get the two strings from the incoming HTTP GET request
boolean GetwebText(char *line1, char *line2, int len)
{
  boolean got_text = false;    // text received flag
  char *str_begin;             // pointer to start of text
  char *str_end;               // pointer to end of text
  int str_len = 0;
  int txt_index = 0;
  char *current_line;

  current_line = line1;

  // get pointer to the beginning of the text
  str_begin = strstr(HTTP_req, "&handynummer=");

  for (int j = 0; j < 2; j++) { // do for 2 lines of text
    if (str_begin != NULL) {
      str_begin = strstr(str_begin, "=");  // skip to the =
      str_begin += 1;                      // skip over the =
      str_end = strstr(str_begin, "&");

      if (str_end != NULL) {
        str_end[0] = 0;  // terminate the string
        str_len = strlen(str_begin);

        // copy the string to the buffer and replace %20 with space ' '
        for (int i = 0; i < str_len; i++) {
          if (str_begin[i] != '%') {
            if (str_begin[i] == 0) {
              // end of string
              break;
            }
            else {
              current_line[txt_index++] = str_begin[i];
              if (txt_index >= (len - 1)) {
                // keep the output string within bounds
                break;
              }
            }
          }
          else {
            // replace %20 with a space
            if ((str_begin[i + 1] == '2') && (str_begin[i + 2] == '0')) {
              current_line[txt_index++] = ' ';
              i += 2;
              if (txt_index >= (len - 1)) {
                // keep the output string within bounds
                break;
              }
            }
          }
        } // end for i loop
        // terminate the string
        current_line[txt_index] = 0;
        if (j == 0) {
          // got first line of text, now get second line
          str_begin = strstr(&str_end[1], "nachricht=");
          current_line = line2;
          txt_index = 0;
        }
        got_text = true;
      }
    }
  } // end for j loop

  return got_text;
}

// sets every element of str to 0 (clears array)
void StrClear(char *str, char length)
{
    for (int i = 0; i < length; i++) {
        str[i] = 0;
    }
}

// searches for the string sfind in the string str
// returns 1 if string found
// returns 0 if string not found
char StrContains(char *str, char *sfind)
{
    char found = 0;
    char index = 0;
    char len;

    len = strlen(str);
    
    if (strlen(sfind) > len) {
        return 0;
    }
    while (index < len) {
        if (str[index] == sfind[found]) {
            found++;
            if (strlen(sfind) == found) {
                return 1;
            }
        }
        else {
            found = 0;
        }
        index++;
    }

    return 0;
}


Angehängte Datei(en)
.htm  index.htm (Größe: 1,78 KB / Downloads: 10)

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
25.05.2016, 16:48 (Dieser Beitrag wurde zuletzt bearbeitet: 25.05.2016 17:02 von rkuehle.)
Beitrag #2
RE: Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library)
Hallo avoid,
der Code sieht schon sehr sehr sauber aus. Aber vielleicht gibt es ja noch ein paar Möglichkeiten um ein paar Bytes frei zu machen.
1. Ich würde oben eine debug-Konstante setzen und schon den Aufruf von Serial.begin() und Serial.print() von der Existenz der Konstante abhängig machen.
1a. print() - Aufrufe mit festen Werten besser so schreiben:
Code:
Serial.println(F("bla bla"));
Sollte auch für die print() - Aufrufe der anderen Klassen gehen, da alle von der stream - Klasse abstammen.
2. Kann man, solange aller Code in einer .ino - Datei steht, die eigenen Funktionen auch mit z. B.
Code:
static boolean sendSMS(char *buf_num, char *buf_tex)
aufrufen.
3. Kann man konstante Werte per PROGMEM in den Flash schieben und von dort holen. Siehe hier: http://shelvin.de/string-im-programmspei...-ausgeben/
4. If-Abfragen nicht verschachteln, lieber aufeinander folgende IF-Abfragen mit den gegensätzlichen Bedingungen oder Case.
5. Wenn möglich int Werte durch Byte Werte ersetzen
6. Wenn int notwendig, dann gucken ob unsigned reicht
7. Counter für Schleifen absteigend setzen
8.Schau mal in folgende Datei
Arduino\hardware\arduino\avr\platform.txt
Dort folgende Zeilen angepassen:
vorher:
Zitat:compiler.c.flags=-c -g -Os {compiler.warning_flags} -ffunction-sections -fdata-sections -MMD
nachher:
Zitat:compiler.c.flags=-c -g -O3 {compiler.warning_flags} -ffunction-sections -fdata-sections -MMD
sowie
vorher:
Zitat:compiler.cpp.flags=-c -g -Os {compiler.warning_flags} -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD
nachher:
Zitat:compiler.cpp.flags=-c -g -O3 {compiler.warning_flags} -fno-exceptions -ffunction-sections -fdata-sections -fno-threadsafe-statics -MMD
Manchmal ist es so, dass eine Optimierung auf -O3 den Code zwar in der Geschwindigkeit optimiert, aber eben auch in der Größe!

Hope it helps!

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.06.2016, 10:10
Beitrag #3
RE: Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library)
Danke für die Tipps Ricardo,
doch auch damit hab ich den Code nicht in den UNO-Ethernet bekommen.
Hab mir also gestern ein Ethernet-Shield-2 besorgt und es mit dem Mega versucht.

Kompilieren und hochladen klappt zwar aber nun hängt der Code beim initialisieren des GSM-Shield-2,
doch selbst wenn ich das GSM raus kommentiere bekomme ich keine Antwort von der IP, wenn ich sie pinge.

Kann es sein das sich die beiden Shields nicht vertragen?
Oder Braucht das Ethernet-Shield-2 eine andere Library?
Oder liegt es gar daran das ich von SD-Lese?

Wieso nur ist es so frustrierend mit dem Arduino zu arbeiten wenn es schon Shields und Librarys gibt.
Langsam glaube ich, ich sollte wieder auf Steckbrettern alles selbst bauen, da kann man Fehler zumindest schnell finden.
Mit den Librarys ist das alles nur noch theoretischer Mist und man darf Unmengen an Code prüfen weil die Librarys keine Fehler zurückgeben.

*grummel*,
avoid

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.06.2016, 11:15
Beitrag #4
RE: Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library)
Hallo avoid,
ein paar Bemerkungen von mir:
1.)
Zitat:Oder Braucht das Ethernet-Shield-2 eine andere Library?
Soweit ich weiß wird der 5500 Chip des Ethernet 2 Shield nicht von der Standard-Lib unterstützt. Alternative siehe Post vorher.
2.)
Achtung: Wenn du das Shield direkt auf den Mega steckst, kann es sein, dass der ICSP Header nicht komplett verbunden wird, weil die Pins auf dem Shield sehr lang sind.Also kontrollieren und evtl. die Pins des Shield kürzen.
3.)
Pin 10 auf dem Shield ist CS für Ethernet, Pin 4 ist CS für die SD - Karte.
Die CS - Pins müssen vor Benutzung der jeweiligen Komponente entsprechend gesetzt werden.
Bitklopfer hat das hier: http://forum.arduino.cc/index.php?topic=167211.0 im Post #3 ziemlich eindeutig beschrieben.
4.) Wenn du das GSM 2 Shield benutzt musst du eine externe Stromversorgung mit 700 - 1000 mA an den Arduino hängen. Das Modem kann bis zu 2A bei der Datenübertragung ziehen, die dann über den fetten Kondensator auf dem Shield geliefert werden.

Ansonsten wie immer: Code einstellen hilft weiter Smile

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
05.06.2016, 14:16 (Dieser Beitrag wurde zuletzt bearbeitet: 05.06.2016 14:22 von avoid.)
Beitrag #5
RE: Wo kann ich hier noch Code spahren? (SPI-,Ethernet-,SD-,GSM-Library)
Danke schon mal.

- Welcher Chip auf dem Ethernet ist kann man nicht genau sehen, erkenne nur W55 aber wird wohl der 5500 sein.
- der ICSP Header des Ethernet ist gut verbunden, musste nix kürzen. Da wurde wohl vom Hersteller nachgebessert.
- das mit PIN 4 und 10 hab ich im Setup beachtet und ohne GSM auf dem UNO-Ethernet schon in betrieb gehabt.
- Netzteil mit 2A hab ich dran (extra mit dem GSM-Shield-2_R3 gekauft).
- Code ist noch immer der selbe. Wink

------
So fix mal die Library ersetzt und ohne GSM-Shield-2 ausprobiert ....
Zugriff auf SD funktioniert wohl, laut Serial-Monitor findet er meine HTML Datei.
Netzwerkverbindung ist auch da, die LEDs für Link, ACT und co. leuchten, warum die LEDs der Buchse nichts anzeigen wundert mich allerdings.
Wenn ich den DHCP-Skatch aus der Ethernet2 Library verwende bekomme ich den Arduino auch in meiner Fritzbox als WIZnet zu sehen.
Mit dem Webserver-Skatch (den analogread kram durch Text ersetzt) klappt der Browser zugriff. Mit und Ohne PoE Modul ausprobiert.
PoE-Modul runter gemacht damit GSM-Shield-2 drauf passt und nochmal probiert, Klappt auch.

und nun GSM-Beispiele ausprobiert und nix geht.
Ich werde das Morgen nochmal in der Firma Testen, da ich im Funkloch wohne und nur schlechtes Handynetz habe.
Kann sein das die Magenta PrePaydKarte im Arduino nicht auf das E/O-Netz ausweichen darf wie mein Magenta Vertragshandy.

Gute Fragen sind wie ein wissenschaftliches Experiment. Sie setzen eine Menge Wissen bereits voraus.
bitcoin:1J5dgQQp8eUy8wkUxyztBUVCkCpo5MQEQs?label=Danke
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Library unter Linux Mint installieren atmel900 1 93 22.11.2016 14:12
Letzter Beitrag: rkuehle
  Arduino UNO und Ethernet Shield 2 POE und Fritzbox 3272 tr3 2 161 19.11.2016 10:46
Letzter Beitrag: tr3
  Dallas Temp Library und LiquidCrystal_i2c relay 20 467 27.10.2016 12:20
Letzter Beitrag: hotsystems
  Einfacher Tacho für niedrige Geschwindigkeiten – Code optimieren Bastelo 2 261 12.10.2016 20:31
Letzter Beitrag: Bastelo
  Code mit Verifikation über Keypad & LCD machnetz 5 215 10.10.2016 15:01
Letzter Beitrag: torsten_156
  Problem mit SD Card Library BennIY 4 193 06.10.2016 18:38
Letzter Beitrag: Bitklopfer
  Ethernet Modul Enc28j60 Pin13 LED Schalten BennIY 16 518 27.09.2016 20:30
Letzter Beitrag: BennIY
  kann "localhost" nicht connecten sowerum 4 251 20.06.2016 20:57
Letzter Beitrag: sowerum
  [Suche] Library Programmierer/in für privates Projekt avoid 8 578 19.05.2016 15:01
Letzter Beitrag: avoid
  Serial Monitor Eingabe über Code Maxi290997 4 523 12.05.2016 18:57
Letzter Beitrag: SkobyMobil

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste