Homecontol mit Arduino RF 433 MHz und Infrarotsender

Hallo liebe Community,

möchte hier mal mein momentanes Langzeitprojekt vorstellen und vieleicht einige Sachen mit eurer Hilfe verbessern.
Nach vielem Suchen, Lesen und Schnipsel testen hab ich nun endlich einen für mich relatic gut verständlichen und meinen mometanen Bedürfnissen angepassten Sketch zur Homecontrol zusammen gebastelt. Das passende Shield habe ich heut endlich auch zum laufen bekommen.

Hier ertmal ein paar Bilder dazu.

In de kleinen schwarzen Schachtel steckt nun alles drin was mir seit zwei Wochen den Schlaf raubt.


Na sieht doch recht ordentlich aus,oder? Was ist alles drin?
ein Arduino mega 2556
ein Ethernetshield
ein Sende und Empfangsshield make Eigenbau mit RF 433 Sender, Empfänger und IR LED


Das ganze kann ich über mein Tablet steuern mit Android. Das dazugehörige Programm nennt sich NetIO.
Infos dazu gibts hier:http://netio.davideickhoff.de/


Morgens, im Bett, keine Lust zum aufstehen, Kaffee? Kein problem, mit extragroßen Tasten für meine bessere Hälfte. Nur bedienen muss sie mich noch selbst.


Und hier kann ich dann meine restlichen auf dem Flohmarkt erbeuteten Funksteckdosen bedienen.

Und das brauch ich nur falls ich ja mal vom Rechner wegkomme oder nicht grad arbeiten bin. Is eher was für meine bessere Hälfte.

Den dazu gehörigen Code will ich euch dann aber auch nicht vorenthalten.

#include <SPI.h>
#include <Ethernet.h>
#include <EthernetClient.h> // this is new
#include <EthernetServer.h> // so is this
#include <RCSwitch.h>
#include <IRremote.h>

byte mac[] = { 0x54, 0x55, 0x58, 0x10, 0x00, 0x24 };  // entspricht einer MAC von 84.85.88.16.0.36
byte ip[]  = { 192, 168, 0, 99 };                  // IP-Adresse

EthernetServer server(80);

RCSwitch mySwitch = RCSwitch();
IRsend irsend = IRsend();


void setup() {
   Serial.begin(9600);
  Serial.println("ARDUINO - STEUERUNG");
 
  
  
 
  
  
 
  Serial.println();
  Serial.println("Verbraucher schalten");
  
  Ethernet.begin(mac, ip);
  server.begin();
  Serial.print("server it at");
  Serial.println(EthernetClient());
  mySwitch.enableTransmit(7); 
}

void loop() {
  
  char* command = httpServer();
  
 
  
  if (strcmp(command, "3an=") == 0) {
       mySwitch.switchOn("01111", "10000");
  } else if  (strcmp(command, "3aus=") == 0) {
       mySwitch.switchOff("01111", "10000");
  }
if (strcmp(command, "4an=") == 0) {
       mySwitch.switchOn("01111", "00100");
  } else if  (strcmp(command, "4aus=") == 0) {
       mySwitch.switchOff("01111", "00100");
  }
 if (strcmp(command, "5an=") == 0) {
       mySwitch.switchOn("01111", "01000");
  } else if  (strcmp(command, "5aus=") == 0) {
       mySwitch.switchOff("01111", "01000");
  }
  if (strcmp(command, "6an=") == 0) {
       mySwitch.switchOn("01111", "00010");
  } else if  (strcmp(command, "6aus=") == 0) {
       mySwitch.switchOff("01111", "00010");
  }
if (strcmp(command, "7an=") == 0) {
       mySwitch.switchOn("01111", "00001");
  } else if  (strcmp(command, "7aus=") == 0) {
       mySwitch.switchOff("01111", "00001");
  }
      for (int i = 0; i < 3; i++) {
  if (strcmp(command, "VolDown=") ==0) {
      irsend.sendRC6(0x11, 20); // Samsung TV source
      delay(40);
	}
      }	
   for (int i = 0; i < 3; i++) {
  if (strcmp(command, "VolUp=") ==0) {
      irsend.sendRC6(0x10, 20); // Samsung TV source
      delay(40);
	}
   }
  for (int i = 0; i < 3; i++) {
  if (strcmp(command, "CHUp=") ==0) {
      irsend.sendRC6(0x4D, 20); // Samsung TV source
      delay(40);
	}
  }
for (int i = 0; i < 3; i++) {
  if (strcmp(command, "CHDown=") ==0) {
      irsend.sendRC6(0x4C, 20); // Samsung TV source
      delay(40);
	}
}

     for (int i = 0; i < 3; i++) {
  if (strcmp(command, "Power=") ==0) {
      irsend.sendRC6(0x1000C, 20); // Samsung TV source
      delay(40);
	}
     }
}


/**
 * HTML-Seite die dem Client zurückgeschickt wird.
 */
void httpResponse(EthernetClient c) {
  c.println("HTTP/1.1 200 OK");
  c.println("Content-Type: text/html");
  c.println();
  c.println("<html>");
    
c.println("<head>");
c.println("<title>Funksteckdosen</title>");

c.println("</head>");
c.println("<body bgcolor=black>");
  c.println("

");
  

 c.println("<form  method=get name=togl>");
 
 c.println("<button name=4an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Kaffeemaschiene</font></button>");
 c.println("

");
 c.println("<button name=4aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Kaffeemaschiene</font></button>");
  c.println("

");

 c.println("<center><text><font color=white>_______________________</font></text></center>
");
 c.println("

");

 c.println("<button name=3an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Schreibtischlampe</font></button>");
 c.println("

");
 c.println("<button name=3aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Schreibtischlampe</font></button>");
  c.println("

");

 c.println("<center><text><font color=white>_______________________</font></text></center>
");
 c.println("

");

 c.println("<button name=5an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Schreibtisch-PC</font></button>");
 c.println("

");
 c.println("<button name=5aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Schreibtisch-PC</font></button>");
 c.println("

");

 c.println("<center><text><font color=white>_______________________</font></text></center>
");
 
  c.println("

");
c.println("<button name=7an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Wohnzimmer-PC</font></button>");
 c.println("

");
 c.println("<button name=7aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Wohnzimmer-PC</font></button>");
  c.println("

");

  c.println("<center><text><font color=white>_______________________</font></text></center>
");
 c.println("

");

 c.println("<button name=6an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Zusatzsteckdose</font></button>");
 c.println("

");
 c.println("<button name=6aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Zusatzsteckdose</font></button>");
 
c.println("

");
 c.println("<button name=VolUp type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Volume Up</font></button>");
 c.println("<button name=VolDown type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Volume Down</font></button>");
 c.println("<button name=CHUp type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Channel Up</font></button>");
  c.println("<button name=CHDown type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Channel Down</font></button>");
    c.println("<button name=Power type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Power </font></button>");

 
 c.println("</form>"); 

   
   

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

}

/**
 * Verarbeitet Client Anfragen und gibt falls vorhanden den GET Query 
 * String, also alles was in der URL hinter dem ? steht, zurück
 */
char*  httpServer() {
  EthernetClient client = server.available();
  if (client) {
    char sReturnCommand[20];
    int nCommandPos=-1;
    sReturnCommand[0] = '\0';
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        if ((c == '\n') || (c == ' ' && nCommandPos>-1)) {
          httpResponse(client);
          break;
        }
        if (nCommandPos>-1) {
          sReturnCommand[nCommandPos++] = c;
        }
        if (c == '?' && nCommandPos == -1) {
          nCommandPos = 0;
        }
      }
      if (nCommandPos > 18) {
          client.println("HTTP/1.1 414 Internal server error");
          client.println("Content-Type: text/plain");
          client.println();
          client.println("414 Request URI too long");
          sReturnCommand[0] = '\0';
          break;
      }
    }
    if (nCommandPos!=-1) {
      sReturnCommand[nCommandPos] = '\0';
    }
    // give the web browser time to receive the data
    delay(1);
    client.stop();
    
    return sReturnCommand;
  }
  return '\0';
}

Hier gleich mal vielen Dank an alle die in diesem Code vereinigt sind. fragt mich aber nicht wer und wieviele es sind, Passen aber irgendwie alle zusammen.
So ganz einfach war die Erstellung des Codes nicht. Zwei Wochen lang Suchen, Kopieren, Ausprobieren und verstehen lernen warum was wann wie funkioniert. Aber die Ausdauer hat sich gelohnt, es funktioniert.
Das ganze läuft per Web-Interface und wie gesagt über NetIO für Android. Wenn ich den Code richtig verstehe, kann man es auch mit anderen Sofware und Platformlösungen bedienen welche die selben Kommandos übers Netzwerk verschicken.
Ich denke das wars erstmal zum Aufbau des Projektes selbst.

Komme ich mal zu den Problemen mit denen ich so zu kämpfen hatte.

Problem 1: Es gibt kaum genug Material im Netz um diese Projekt reibungslos als Anfänger zu realisieren. Die Anfänge waren meist von Fehlern behafet welche ich dann durch Suche von Fehlerbehebungen wieder beseitigen musste.

Problem 2: Biblioteken und Arduino Mega 2556. Anfangs wolle erstmal gar nichts funktionieren was die Bibliothek für das IR angeht. Es hat schon eine weile gedauert bis ich eine Info über vertauschte Pins gefunden habe. Im Beispielsketch zur Bibliothek ist Pin 3 als send angegeben, beim Mega ist es komischerweise dann Pin 9. Wie soll ich denn auf sowas kommen?

Problem 3: Die Sendeleistung einer IR im Pinmode ist wohl als eher bescheiden zu nennen. Mein Arbeitsplatz ist zwei Meter vom Fernseher entfernt und die Sendeleistung betrug grad mal 20 cm. Abhilfe geschaffen hab ich mir mit einer Transistorschaltung. Die Diode wird jetzt mit 5V bedient, das reicht bis zum Fernseher. Hat aber auch einen Tag gekostet um rauszufinden das es mal nicht am Sketch liegt.

Problem 4: Ist wohl meine mangelnde Löterfahrung. Anschließen is da nicht so mein Ding, aber Kurzschließen klappt einwandfrei. Mein Lieblingswerkzeug nach einer Erfolgreichen Lötsession, Multimeter und Skalpell, der Lötkolben wird auch erst vom Netz getrennt wenn alles funktioniert. Zum Glück verkraftet der Arduino mega meine feinmotorisch exakten Lötversuche ganz gut. Quittiert meist mit wild blinkender LED oder dunkel.

Komme jetzt mal zu dem, was mir noch am Herzen liegt. Das ganze so wie es ist funktioniert. Aber, es gibt da noch Dinge die besser laufen könnten.

  1. Ich möchte die HP vom mega raus auf die SD Karte. wenn das nicht geht, wie kann ich Bilder von der SD her in die HP einfügen. Ich weis nicht wie ich die SD als Image Speicher im HTML Code angebe.

  2. Der Sketch ist einfach mal zu groß. Mein Leonardo will ihn nicht. Und ich würde lieber den dafür verschwenden. Es gibt sicherlich Möglichkeiten mit weniger Befehlen das selbe Ergebnis zu erreichen.

  3. Kann ich auch Teile des Sketches von der SD Karte abrufen? Die HP geht ja theoretisch auch.

  4. Ich will das ganze in Zukunft noch erweitern, dazu soll noch ein Funkwettersensor und eine Uhr integriert werden und ein Relais zum ein und ausschalten meines PCs, ein LCD Display am Gerät selbst und ein großes LED Panel in der Wohnzimmerwand, zum Schluss dann auch noch für jede Steckdose einen Rückkanal, hab da was bei Conrad von Voltkraft gesehen mit Status und Energieverbrauchsanzeige über Funk.

Ich würde mich sehr über ein reges Interesse und jede menge Hilfe freuen.

LG aus Berlin

IR-LEDs werden gepulst betrieben. Die Spannung hat nichts zu sagen. Die ist immer ca. 1,5V (mehr bei höherem Strom!). Es kommt auf den Strom an. Normalerweise vertragen LEDs etwa 20-30mA Dauerstrom. Bei IR LEDs ist maximal sogar 100mA für mehrere Millisekunden angegeben und die Abstrahlleistung bezieht sich auch diesen Wert.
In den Datenblättern steht aber auch etwas wie z.B. "peak pulse current" oder "surge current". Das gibt an dass man die LED für ein paar µs auch mit einem viel höheren Strom beschalten kann. Die SFH409 z.B. verträgt für weniger als 10µs 3A wenn man ihr danach genug Zeit zum abkühlen gibt. Die SFH4550 hat bei 100mA für 20ms eine Leistung von mindestens 500mW/sr. Bei 1A für 100µs sind es das 10-fache!

100mA solltest du sicher verwenden können. Mehr wenn die Pulslänge entsprechend kurz ist. Da sollte es im Datenblatt ein Diagramm geben, das den maximalen Strom in Abhängigkeit vom Duty Cycle angibt.

Was du generell machen solltest ist die ganzen Strings per F-Makro in den Flash-Speicher verfrachten. Sonst landen die alle im RAM.

@Serenifly

Danke für die Info, Irgendwann wollte ich das Gerät auf 9V Accu umrüsten, dann könnte ich die IR theoretisch auch direct da aufschalten?

Sorry aber das mit Ram, Flash, Strings und so ziemlich viele andere Sachen verstehe ich noch nicht wirklich. Ich bin da noch so ziemlich am Anfang und lerne fast alles an Beispielen. Was ich sehe kann ich meist auch begreifen. Stundenlang Texte wälzen, hat schon mit Basic bei mir nicht funktioniert.

LEDs brauchen immer einen Vorwiderstand an dem der Rest der Spannung abfällt:
http://www.elektronik-kompendium.de/sites/grd/1006011.htm
LED-Vorwiderstandsrechner <--- Rechner

Wenn die Betriebsspannung höher wird, muss dann der Vorwiderstand größer werden.

Das mit F-Makro ist ganz einfach. Du schreibst statt println("Text"); -> println(F("Text"));
Dann belegt der String keinen Arbeitsspeicher, der auf Mikrocontrollern sehr begrenzt ist. Sonst stürzt dir recht schnell aus unerklärlichen Gründen das Programm ab.

Du musst dann aber auch statt strcmp -> strcmp_P verwenden. Für println() muss man sonst nichts ändern.

OK, genau so hab ichs mir vorgestellt. Werde es so machen wie von dir beschrieben. Alles in den Flash verfrachten. Weil das mit den Abstürzen und aufhängen ist mir leider bekannt. Und ne Homecontrol die nicht wirklich zu kontrollieren ist is eher sinnlos.
Arbeitet der dann auch effizienter? Immer wenn ich ne Taste drücke unterbricht er mir kurz die Serververbindung.

Das mit der LED lass ich erstmal unbeachtet, werds mir aber für die Zukunft merken.

Danke

Hallo ihr Lieben,

hab heute mal versucht alles in den Flashspeicher zu laden. Server geht dann zwar online, aber es reagiert keine Taste mehr und die IR-LED sendet die ganze Zeit.
Was habe ich geändert?
Zu erst: strmp zu strmp_p

void loop() {
  
  char* command = httpServer();
  
 
  

  if (strcmp_P(command, "6an=") == 0) {
       mySwitch.switchOn("01111", "00010");
  } else if  (strcmp_P(command, "6aus=") == 0) {
       mySwitch.switchOff("01111", "00010");
  }
if (strcmp_P(command, "7an=") == 0) {
       mySwitch.switchOn("01111", "00001");
  } else if  (strcmp_P(command, "7aus=") == 0) {
       mySwitch.switchOff("01111", "00001");
  }
      for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "VolDown=") ==0) {
      irsend.sendRC6(0x11, 20); // Samsung TV source
      delay(40);
	}
      }	
   for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "VolUp=") ==0) {
      irsend.sendRC6(0x10, 20); // Samsung TV source
      delay(40);
	}
   }
  for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "CHUp=") ==0) {
      irsend.sendRC6(0xD4, 20); // Samsung TV source
      delay(40);
	}
  }
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "CHDown=") ==0) {
      irsend.sendRC6(0xC4, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "0=") ==0) {
      irsend.sendRC6(0x00, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "9=") ==0) {
      irsend.sendRC6(0x09, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "8=") ==0) {
      irsend.sendRC6(0x08, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "7=") ==0) {
      irsend.sendRC6(0x07, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "6=") ==0) {
      irsend.sendRC6(0x06, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "5=") ==0) {
      irsend.sendRC6(0x05, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "4=") ==0) {
      irsend.sendRC6(0x04, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "3=") ==0) {
      irsend.sendRC6(0x03, 20); // Samsung TV source
      delay(40);
	}
}
      for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "2=") ==0) {
      irsend.sendRC6(0x02, 20); // Samsung TV source
      delay(40);
	}
      }
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "1=") ==0) {
      irsend.sendRC6(0x01, 20); // Samsung TV source
      delay(40);
	}
}
for (int i = 0; i < 3; i++) {
  if (strcmp_P(command, "Power=") ==0) {
      irsend.sendRC6(0x0C, 20); // Samsung TV source
      delay(40);
	}
}
}

Und dann noch das: println("irgendwas steht drinn") in println(F("irgendwas steht drinn"))

/**
 * HTML-Seite die dem Client zurückgeschickt wird.
 */
void httpResponse(EthernetClient c) {
  c.println(F("HTTP/1.1 200 OK"));
  c.println(F("Content-Type: text/html"));
  c.println();
  c.println(F("<html>"));
    
c.println(F("<head>"));
c.println(F("<title>Funksteckdosen</title>"));

c.println(F("</head>"));
c.println(F("<body bgcolor=black>"));
  c.println(F("

"));
  

 c.println(F("<form  method=get name=togl>"));
 

 c.println(F("<button name=5an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Schreibtisch-PC</font></button>"));
 c.println(F("

"));
 c.println(F("<button name=5aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Schreibtisch-PC</font></button>"));
 c.println(F("

"));

 c.println(F("<center><text><font color=white>_______________________</font></text></center>
"));
 
  c.println(F("

"));
c.println(F("<button name=7an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Wohnzimmer-PC</font></button>"));
 c.println(F("

"));
 c.println(F("<button name=7aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Wohnzimmer-PC</font></button>"));
  c.println(F("

"));

  c.println(F("<center><text><font color=white>_______________________</font></text></center>
"));
 c.println(F("

"));

 c.println(F("<button name=6an type=submit style=font-weight:bold;background-color:GREEN;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Zusatzsteckdose</font></button>"));
 c.println("

");
 c.println(F("<button name=6aus type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Zusatzsteckdose</font></button>"));
 
c.println(F("

"));
 c.println(F("<button name=VolUp type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Volume Up</font></button>"));
 c.println(F("<button name=VolDown type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Volume Down</font></button>"));
 c.println(F("<button name=CHUp type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Channel Up</font></button>"));
  c.println(F("<button name=CHDown type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Channel Down</font></button>"));
  c.println(F("<button name=0 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7> 0</font></button>"));
  c.println(F("<button name=9 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>9 </font></button>"));
  c.println(F("<button name=8 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>8 </font></button>"));
  c.println(F("<button name=7 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>7 </font></button>"));
  c.println(F("<button name=6 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>6 </font></button>"));
  c.println(F("<button name=5 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>5 </font></button>"));
  c.println(F("<button name=4 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>4 </font></button>"));
  c.println(F("<button name=3 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>3 </font></button>"));
  c.println(F("<button name=2 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>2 </font></button>"));
  c.println(F("<button name=1 type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7> 1</font></button>"));
  c.println(F("<button name=Power type=submit style=font-weight:bold;background-color:RED;padding:10px;margin:2px;color:WHITE;height:100px;width:1000px><font size=7>Power </font></button>"));

 
 c.println(F("</form>")); 
c.println(F("</body>"));
c.println(F("</html>"));

}

Auserdem hab ich noch ein paar Fehler in meinem Sketch korrigiert, hatte ein paar Klammern vergessen. Hab ihn oben gleich aktualisiert. So wie er jetzt ist, funktioniert er auch.

LG aus Berlin

Du musst für die Vergleichs-Strings dann auch ins Flash schreiben . Das ist aber komplizierter:

Geht anscheinend mit dem F-Makro alleine nicht. Da kommt dann ein Compiler-Fehler. Soweit hatte ich da nicht gedacht. Sorry :s

Wobei diese paar Byte im Gegensatz zu den riesigen HTML-Romanen gar nicht so ins Gewicht fallen. Also lass das vielleicht erst mal weg.

Geht zum Glück mit Bearbeiten -> Suchen leicht zu ändern :slight_smile:

Danke,

Hab nach deinem Post gleich die Suche nach F-Macro eingeschaltet und das mit Progmem dazu gefunden. Wie ich gesehen habe muss ich dann auch noch eine Bibliothek dazu einbinden.
Was meinst du? Soll ich die (F(Text)) oder scrmp_P wieder ändern oder beides?
werde mich dann trotzdem mal mit Progmem befassen.
hast du vieleich nen Plan wie ich die HTML vom Ardu auf die Speicherkarte bekomme? Ich sag mal ohne des ganze Geraffel mit der Homecontrol weis ich wies geht ne HTML von der Speicherkarte zu lesen. Nur wie ich dann auf die Funktionen zugreifen kann ist mir noch unklar. Hatte es schon versucht, aber da läßt sich dann nichts schalten. Da scheinen dann die Pfade nicht mehr zu stimmen.

Mach es erst mal so wie du es hattest. Das normale strcmp und ohne Flash-Makro. Also strcmp_P wieder durch strcmp ersetzen. Das F-Makro ist leider nur sehr begrenzt einsetzbar. Deshalb muss man das per Hand machen wenn man mehr Funktionalität will. Das lohnt sich für diese kurzen Strings nicht unbedingt.

Und F() dann nur für den HTML-Teil verwenden. Was sein kann, ist dass die Webseite dann etwas langsamer reagiert, da Flash-Zugriff langsamer als das SRAM ist. Aber das wäre mit der SD-Karte noch langsamer.

Mit SD-Karten kenne ich mir nicht aus. Aber das ist in diesem Fall auch nicht anders als generell Text darauf zu schreiben. Mann muss da halt dann zeilenweise auslesen aus einer Text-Datei auslesen. Die Text-Datei kann man auf dem PC per Hand anlegen.

Mal wieder Danke,

Neue Idee,
kann ich den HTML Teil nicht irgendwie weg lassen? Eigentlich brauch ich ihn ja nicht. Ich greife ja von einem Externen Programm drauf zu. Aber kann ich ohne die HTML-Links überhaupt auf strcmp zugreifen? Senden tu ich ja nur das char was bei strcmp angegeben ist.

Edit: Schon erledigt, einfach die HTML gelöscht.

Hi. kannst du bitte alles an Hardware auflisten was du verbaut hast? Konnte bisher nix finden in den Beiträgen.

Hallo skorpi08,

na mal sehen ob ich es zusammen bekomme.

Als Board ein Arduino mega2556, denk drann das die Pinbelegung nicht stimmt, mein Sendeshield geht nicht am Leo. Vieleicht kann man das ja noch nachträglich festlegen das immer der selbe Pin genutzt wird.
Ein Lan- shield, einen billig china RF-XD Sender, IR Diode 950nm, passende Wiederstände, 160 Ohm für die Diode, 1 KOhm für den NPN Transistor um der Diode genügend Saft zu geben, ein Bissl Leiterplatte und ein paar Drähte und des wars.
Um die Fernbedienung auszulesen habe ich mein Leo und nen TSOP 1838 = 4838 von Conrad benutzt. Für die Steckdosen halt das Billiggegenstück zum Empfänger.

Also dass mit dem Festplattengehäuse find ich super! Habe geschätzte 10 Stück hier liegen.
Der RF Sender sendet an die Funksteckdose, wozu dann die IR?
Ist es egal von Welchem Hersteller die Funksteckdosen sind?
Hatte was gelesen, dass man die Codes auslesen muss, die der Sender an die Steckdose liefert.
Welche Steckdosen hast du denn?

Das Gehäuse ist kein Festplattengehäuse, das is von Conrad son Gehäuse für solche Sachen, 4€ oder so.
Die IR ist dafür, das ich auch meinen TV über die Selbe App steuern kann.
Bei den Funksteckdosen hab ich nix besonderes, alles verschiedene Marken auf dem Flohmarkt gekauft, was sie gemeinsam haben ist, das sie 433 MHz empfangen und diese berümten 10 Schalterchen für die Kanaleistellung haben. Manche sind da von 1 - 10 nummeriert und einige 1 - 5 und A - D. Funktionieren alle gleich. Auslesen brauchst du sie nicht mehr, die Billigdinger scheinen alle gleich zu funktionieren. Zumindest hab ich das Glück das beim Stückpreis von 1 € alle 8 funktionieren. Und wenns mal nicht geht, tut der € auch nicht weh ,hohl ich halt ne neue.
Kannst entweder die Pins einstellen wie in meinem Sketch oben, oder du änderst den Sketch auf deine Pins.

So, da du meintest es ist egal welche Funksteckdosen man nimmt, habe ich mal solche gekauft.

Und siehe da, funktioniert nix.

Habe sowas getestet, funktioniert einwandfrei.
Wenn ich auf dem Funksteckdosen Sender Taste drücke und mit dem Sketch ReceiveDemo_Simple oder _Advanced die Codes auslesen will, kommt nix an.

Dose Modell: GT-FSI-06
Sender Modell: GT-9000

Als ich den Empfänger probiert hatte musste ich erstmal alle Pins durch testen bis ich den richtigen gefunden hatte. Ich weis nicht warum die Boards verschieden sind. Was bei meinem Mega geht, geht beim Leonardo nicht.
Deine Funksteckdosen sehen leider alle nicht so aus wie meine. Wenn die 433 MHz sind und das selbe Protokoll haben. sollten sie aner funktionieren. Versuch mal die Pins durch. Ich hab auch festgestellt beim probieren, das nicht alle Einstellungen der Funksteckdosen funktionieren.
Das andere Teil, dazu kann ich dir leider nichts sagen, wäre schön, wenn du es zum laufen bekämst, weil ich mir sowas auch kaufen wollte.

LG aus Berlin

Was genau wolltest du kaufen? Hatte an dem Empfänger rumgeschraubt und irgendwann zufällig hatte ich was auf dem Serial Monitor. Protokoll:3

Bei den teilen aus China ist das Protokoll:1

Die China teile funktionieren ja, nur Steckdose nicht.

Das Chinateil wollte ich mir auch holen und mit integrieren.
Das mit den Protokollen is natürlich doof, ich hab leider keine Ahnung wie man den Sketch auf ein anderes Protokoll umstellen kann oder ob man da ne andere Bibliothek zu braucht, oder obs die überhaupt schon gibt. Meine ganzen Billigdinger haben alle das gleiche Protokoll, die sind aber neu auch nur halb so teuer wie deine die du dir gekauft hast.
Ich hab das auch alles nur durch rum probieren zusammenbekommen, hab da ne Woche dran gehangen ehe ich was funktionierendes zusammen hatte.