Arduino Forum

International => Deutsch => Topic started by: ManuBeze on May 03, 2013, 07:00 pm

Title: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: ManuBeze on May 03, 2013, 07:00 pm
hi Leute ich habe einen code geschrieben der perfekt auf meinem Arduino Mega läuft, aber irgendwie will der nich auf meinem Arduino UNO funktionieren.
kann mir da vielleicht wer von euch weiter helfen
Lg
Manu
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: marcusw on May 03, 2013, 07:36 pm
Ich seh hier keinen sketch. Man reiche mir die Glaskugel!
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: ManuBeze on May 03, 2013, 07:38 pm
das wäre mein code der beim mega funktioniert

Code: [Select]
#include <Dhcp.h>
#include <Dns.h>
#include <Ethernet.h>
#include <EthernetClient.h>
#include <EthernetServer.h>
#include <EthernetUdp.h>
#include <util.h>

/*

Original Version by Poldi
modified by Katsu

the functions readString.append() and readString.contains() where replaced

*/

#include <SPI.h>  // insert by Katsu
// #include <WString.h> removed by Katsu
#include <Ethernet.h>


byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 };  // entspricht einer MAC von 84.85.88.16.0.36
byte ip[]  = { 10, 0, 1, 28 };                  // IP-Adresse
byte gateway[] = { 10, 0, 1, 1 };                // Gateway
byte subnet[]  = { 255, 255, 255, 0 };

EthernetServer server(80);
char c;
int Pin3 = 3;
int Pin4 = 4;
int Pin5 = 5;
int Pin6 = 6;

String readString = String(100);      // string for fetching data from address
boolean Pin3ON = false;                  // Status flag
boolean Pin4ON = false;
boolean Pin5ON = false;
void setup(){
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();
pinMode(Pin3, OUTPUT);
pinMode(Pin4, OUTPUT);
pinMode(Pin5, OUTPUT);
Serial.begin(9600); }

void loop(){

// Create a client connection
EthernetClient client = server.available();
if (client) {
while (client.connected()) {
if (client.available()) {
c = client.read();
}
//read char by char HTTP request
if (readString.length() < 100) {

//store characters to string
// readString.append(c);  removed by Katsu
readString = readString + c; // insert by Katsu
// very simple but it works...
}

Serial.print(c);  //output chars to serial port

if (c == '\n') {  //if HTTP request has ended

// readString.contains() replaced with readString.indexOf(val) > -1  by Katsu
// indexOf locates a character or String within another String.
// Returns the index of val within the String, or -1 if not found.
if(readString.indexOf("3=einschalten") > -1) {
digitalWrite(Pin3, HIGH);
Serial.println("Pin 3 eingeschaltet!");
Pin3ON = true;
}
if(readString.indexOf("3=ausschalten") > -1){
digitalWrite(Pin3, LOW);
Serial.println("Pin 3 ausgeschaltet!");
Pin3ON = false;
}
if(readString.indexOf("4=einschalten") > -1) {
digitalWrite(Pin4, HIGH);
Serial.println("Pin 4 eingeschaltet!");
Pin4ON = true;
}
if(readString.indexOf("4=ausschalten") > -1){
digitalWrite(Pin4, LOW);
Serial.println("Pin 4 ausgeschaltet!");
Pin4ON = false;
}
if(readString.indexOf("5=einschalten") > -1) {
digitalWrite(Pin5, HIGH);
Serial.println("Pin 5 eingeschaltet!");
Pin5ON = true;
}
if(readString.indexOf("5=ausschalten") > -1){
digitalWrite(Pin5, LOW);
Serial.println("Pin 5 ausgeschaltet!");
Pin5ON = false;
}
if(readString.indexOf("all=Alles+aus") > -1){
digitalWrite(Pin3, LOW);
digitalWrite(Pin4, LOW);
digitalWrite(Pin5, LOW);
Serial.println("Alles ausgeschaltet");
Pin3ON = false;
Pin4ON = false;
Pin5ON = false;
}
//--------------------------HTML------------------------
client.println("HTTP/1.1 200 OK");

client.println("Content-Type: text/html");

client.println();

client.print("<html><head>");

client.print("<title>Zimmerschaltung</title>");

client.println("</head>");

client.print("<body bgcolor='#444444'>");

//---Überschrift---
client.println("<br><hr />");

client.println("<h1><div align='center'><font color='#2076CD'>zimmerschaltung manu</font color></div></h1>");

client.println("<hr /><br>");
//---Überschrift---

//---Ausgänge schalten---
client.println("<div align='left'><font face='Verdana' color='#FFFFFF'>Ausg&auml;nge schalten:</font></div>");

client.println("<br>");

client.println("<table border='1' width='500' cellpadding='5'>");

client.println("<tr bgColor='#222222'>");

client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang 3<br></font></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=3 value='einschalten'></form></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=3 value='ausschalten'></form></td>");

if (Pin3ON)
   client.println("<td align='center'><font color='green' size='5'>ON");
else
   client.println("<td align='center'><font color='#CFCFCF' size='5'>OFF");
   
client.println("</tr>");

client.println("<tr bgColor='#222222'>");

client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang 4<br></font></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=4 value='einschalten'></form></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=4 value='ausschalten'></form></td>");

if (Pin4ON)
   client.println("<td align='center'><font color='green' size='5'>ON");
else
   client.println("<td align='center'><font color='#CFCFCF' size='5'>OFF");
   
client.println("</tr>");

client.println("<tr bgColor='#222222'>");

client.println("<td bgcolor='#222222'><font face='Verdana' color='#CFCFCF' size='2'>Ausgang 5<br></font></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=5 value='einschalten'></form></td>");

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=5 value='ausschalten'></form></td>");

if (Pin5ON)
   client.println("<td align='center'><font color='green' size='5'>ON");
else
   client.println("<td align='center'><font color='#CFCFCF' size='5'>OFF");
   
client.println("</tr>");

   
client.println("</tr>");

client.println("</table>");


client.println("<br>");

client.println("<form method=get><input type=submit name=all value='Alles aus'></form>");

client.println("</body></html>");

//---Ausgänge schalten---

//clearing string for next read
readString="";

//stopping client
client.stop();
}}}}
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: lgrube96 on May 03, 2013, 07:50 pm
Dafür brauchste doch jetzt nicht extra ein neues Thema erstellen !
Hätte ja wohl gereicht, wenn du das noch in den alten Post mit anfügst ;)
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: ManuBeze on May 03, 2013, 07:53 pm
hahaha ja stimmt aber iwie funktionierts nich das nervt voll :D
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: jurs on May 03, 2013, 07:55 pm
So eine Zeile wie:
Code: [Select]

client.println("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=5 value='einschalten'></form></td>");

verbraucht alleine schon 113 Bytes RAM-Speicher. Das ist in Anbetracht der Tatsache, dass ein UNO überhaupt nur 2048 Bytes RAM-Seicher hat, eine Menge Holz.

Darüber hinaus verwendest Du im Programm die speicherverschwendenden String-Objekte.

Ich schätze mal: Für Deine RAM-verschwenderische Art der Programmierung hat ein UNO viel zu wenig RAM.

Versuche mal, konstante Texte wie die oben genannte Zeile mit dem F-Makro zu senden, so daß der Text nur Flash-Speicher aber keinen RAM-Speicher benötigt. Beispiel:
Code: [Select]

client.println(F("<td align='center' bgcolor='#222222'><form method=get><input type=submit name=5 value='einschalten'></form></td>"));

Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: uwefed on May 03, 2013, 08:09 pm
auch eine etwas spezifischere Fehlerbeschreibung wäre hilfreich:
Code: [Select]
Wieso funktioniert mein Code nur auf dem Arduino Mega

Wird er für den UNO nicht kompiliert, Wird er nicht hinaufgeladen, werden einige Funktionen nicht ausgeführt, Stürzt Arduino nach kurzer Zeit ab .... ?

Grüße Uwe

Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: ManuBeze on May 03, 2013, 08:13 pm
ne also er lödt alles erfolgreich drauf aber ich kann eben die website die ja in dem sketch erstelllt wurde nicht anzeigen
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: guntherb on May 03, 2013, 08:33 pm


Wenn ich den Sketch auf den Mega lade, dann sehe ich 5355byte Ram, die noch frei sind, von 8192byte.
Der Sketch verbraucht also 2837byte (minimum), der Uno hat nur 2048byte.
==> Speicher sparen!
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: lgrube96 on May 03, 2013, 08:48 pm
Haaaa ! War ich wohl doch richtig mit meiner Vermutung ;)

Guckste hier: http://www.arduino.cc/en/Reference/PROGMEM (http://www.arduino.cc/en/Reference/PROGMEM)
Title: Re: Wieso funktioniert mein Code nur auf dem Arduino Mega
Post by: guntherb on May 04, 2013, 10:23 am
Was ich von Uwe gelernt habe:

bei Serial.println("Pin 4 eingeschaltet!"); wird der String im RAM abgelegt!

dies kann man vermeiden mit
Serial.println(F("Pin 4 eingeschaltet!"));
damit bleibt der String im Flash.

den freien Speicher kannst du dir anzeigen lassen, in dem du eine Funktion freeRam() definierst:
Code: [Select]
int freeRam () {
  extern int __heap_start, *__brkval;
  int v;
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);


dann kannst du im code jederzeit mit Serial.println(freeRam()); den freien Speicher anzeigen lassen.

Details hier: Wie kann ich die RAM Nutzung überwachen? (http://arduino.cc/forum/index.php/topic,151957.0.html)