Web client mit Taster und LED

Abend zusammen,

ich habe mir folgenden code zusammengezimmert,bei dem ich auch die ClickButton verwende: /

/---------------------------Bibliotheken hinzufügen
#include                                                                 // Spi Bus Bibliothek
#include                                                            // Ethernet Bibliothek
#include "ClickButton.h"                                                        // Taster Bibliothek
//***************************TCPIP Server Einstellungen                         
byte mac[] = {  0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };                           // Mac adresse
IPAddress serverIP(192,168,178,22);                                             // IP Adresse des servers
int serverPort=54711;                                                           // Port des Servers
EthernetClient client;                                                          // Starten des clients
//---------------------------Taster variablen
const int buttons = 3;                                                          // Anzahl der Taster und deren Variablen
//---------------------------LED
const int ledPin[buttons] = { 6, 7, 8 };                                        // Arduino pins to the LEDs
int ledState[buttons]     = { 0, 0, 0 };                                        // Led Zustand 
int LEDfunction[buttons]  = { 0, 0, 0 };                                        // Led Funktionen
//---------------------------Arduino Eingangpins der Taster
const int buttonPin1 = 2;                                                       // Taster1 Konstante
const int buttonPin2 = 3;                                                       // Taster2 Konstante
const int buttonPin3 = 5;                                                       // Taster3 Konstante
//---------------------------Buttons in array schreiben
ClickButton button[3] = {
  ClickButton (buttonPin1, LOW, CLICKBTN_PULLUP),
  ClickButton (buttonPin2, LOW, CLICKBTN_PULLUP),
  ClickButton (buttonPin3, LOW, CLICKBTN_PULLUP),
};
//===========================Programm Setup
void setup()
{
//---------------------------Serial debug starten
   Serial.begin(9600);
//***************************Server code   
   if (Ethernet.begin(mac) == 0) {                                              // Starte internet Verbindung
    Serial.println("DHCP Fehlgeschlagen");
  }
  delay(1000);                                                                  // Pause zum initialisieren des Lan shields
  Serial.println("Verbinde mit dem Server...");                                 // Debug serial
if (client.connect(serverIP, serverPort)) {                                     // wenn klient verbunden
  Serial.println("Verbunden mit dem Server");                                   // Debug serial
  
//-------------------------Funktion Test beim Start
   String webtaster2an="swebtaster2=an";                                        //Text der gesendet werden soll
    Serial.println("Gesendete Nachricht:"+webtaster2an);                        //Debug serial
    client.println(webtaster2an);                                               // Text senden
  
  }
  else {
   
    Serial.println("Verbindung Fehlgeschlagen");                                // Debug serial bei Felschlagen der Verbindung
    }
//*************************Ende Server
  for (int i=0; i

Der client funktioniert prima was den DHCP angeht,und die Zeile:

String webtaster2an="swebtaster2=an";                                        //Text der gesendet werden soll
    Serial.println("Gesendete Nachricht:"+webtaster2an);                        //Debug serial
    client.println(webtaster2an);

wird ja beim start einmal ausgeführt zum test,und dies funktioniert auch,der Aktor am Server wird eingeschaltet.

So, nun möchte ich mit den drei Tastern parallel zu der LED einen text an den Server senden,also:

  • Taster1 gedrückt=)Led geht an=) Text senden an Server(webtaster1=an)
  • Taster1 gedrückt=)Led geht aus=) Text senden an Server(webtaster1=aus)

Wie kann ich die zeile zum Textsenden mikt den zuständen der LEDs verknüpfen?

Mfg. Haustechno

Mir ist der Einsatzzweck jetzt nicht so ganz klar. Sind die Taster nun ortsnah am Arduino inkl. EthernetShield verdrahtet und es geht letzten Endes nur über eine Ausgabe auf dem Client?

Das ist die entscheidende Stelle im Sketch, hoffe ich hab die Variablen passend aus der ClickFunktion übernommen, kenne diese Lib nicht.

  //************************Server Code 
  if (client.available()) {                                                     // wenn rückantwort vom Server kommt
    char c = client.read();                                                      // Variable server antwort
    Serial.print(c);                                                             // Debug serial rückantwort

    for(int i = 0; i < buttons; i++) {
      client.print("Webtaster");
      client.print(i); //Bennenung beginnt bei 1
      // client.print(i+1); //Bennenung beginnt bei 1
      client.print(" = ");
       if(ledState[i] == 1) client.println("AN");
      else client.println("AUS");
    }
  }
  //************************Ende Server Code

Ausgabe auf Client sollte wie folgt aussehen:

Webtaster0 = AN
Webtaster1 = AUS
Webtaster2 = AUS

Ach Mist, jetzt hab ich das hier gemacht und ich hab bei dir nicht richtig gelesen.

Was du suchst, ist die Textfinder Lib. Dort wird gezeigt, wie du entsprechend parsen kannst. Hierbei kannst du die Adresse dann direkt in den Browser schreiben, oder aber du machst dir eine html Seite, wo du diese als Button klicken kannst.

Hallo, ja Taster und LED sind am Arduino,daher auch der client drauf.

Server horcht auf dem Port des clients und auf klartext Befehle wenn z.b. "webtaster2=an" ankommt, dann wird der Schaltaktor 2 eingeschaltet.

Grundlegend soll also wenn Taster gedrückt und led ein,dann deffinierten text an server senden. Dabei dient die LED neben dem Taster als optische Anzeige.

Danke,

leider geht das nicht :frowning:
Oder gibt es dan eine einfachere Möglichkeit ohne die lib?

Was steht in Zeile 79?

Tja gute Frage, ich bin neulung :(,und hab keine Ahnung wie die gezählt werden??? Werden da auch die // Zeilen mitgezählt? Wie kann ich die Zeilennummern anzeigen lassen?

Ganz unten links im Arduino Fenster steht eine Zahl, die gibt die Zeile an, schau mal, was da steht, wenn du die 79 erwischt hast.

ok Danke wieder was gelernt ;-)

Zeile 79: for (int i=0; i

Ok, eine Klammer war zuviel :roll_eyes:

ok compilieren geht nun,aber es ist leider nicht das was ich wollte,sorry

Also ich brauche quasi nur ein beispiel für die Erkennung des Zustands der leds. D.h. Taster ist als toggle mit led verknüpft,also kurzes drücken Led an,nochmaliges drücken Led aus. Dies geht ja mit dem code schon.

Jedoch möchte ich z.b.: - wenn led1 auf high geht ,dann den Text einmalig an die ip und port gesendet wird,nicht dauernd! - wenn led1 auf low geht,dann der Text einmalig an die ip und port gesendet wird,nicht dauernd

Hoffe habe es nun genauer beschrieben,

Also klappt es nun so wie gewollt, nur dass er es halt dauerhaft zum server kommt?

Könnte ja vielleicht dass helfen: http://forum.arduino.cc/index.php?topic=182861.15

Ansonsten dieses: http://startingelectronics.com/tutorials/arduino/ethernet-shield-web-server-tutorial/SD-card-IO/

Morgen zusammen,

@sschultewolter

Also der code sendet dauern den server zu,so das ich die funktion nichtmal testen konnte :frowning:

@scorpi08

deine links sind auch interresant,leider aber nicht das was ich möchte,sorry.

Also nochmal,

  • ich habe Taster und Leds direkt am arduino
  • ich möchte mit den Tastern die leds als toggle schalten können d.h.:
  • klick Taster1,led1 an
    (einmaliges senden eines Textes an server ip und port)

  • nochmaliger klick taster1, led1 aus
    (einmaliges senden eines Textes an server ip und port)

Mein problem ist,das ich nicht weiß ,wo und wie ich in dem code nun die Anweisungen wegen dem senden
der Texte an Server einfüge :frowning:

Die Funktion an sich sollte halt dafür sein,wenn ich an dem Taster1 klicke,und die Led1 als optische Anzeige für on angeht,
dann soll der text “webtaster1=an” an den server gesendet werden,der weiter weg steht,und an dem dann ein Schaltaktor ist,und der dann einen Verbraucher einschaltet.

So hoffe nun es ist jetzt besser zu verstehen was ich erreichen möchte,

EDIT: im Anhang ein shot der serial Ausgabe und der antwort des Servers auf die für das Testsenden in dem setup teil meines codes

Mfg.
Haustechno

server.JPG

void loop()
{
  if(button1.clicks == 1)
  {
    ledState = !ledState;
Daten_senden(temp1, temp2);
  }

}

void Daten_senden(float T1, float T2)
{
  if (client.connect(server, 80)) // Verbindung zum Server aufbauen
  {
    Serial.println("Verbunden, Sende Daten...");
  }
  else
  {
    Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");
  }
}

Wie das nun mit dem Text senden weiß ich nicht aber wenn du ein externen Webserver hast wie in http://forum.arduino.cc/index.php?topic=182861.15 dann kann man es so machen, dass der Text immer ändert sobald die LED an ist oder aus. Da braucht der Arduino kein Text senden, es wird per HTML geregelt.

Morgen,

@scorpi08

Also der server ist eine Haussteuerungs software die halt auf dem Port befehle entgegennimmt,und diese bestättigt. Get und set Befehle werden engegengenommen und verarbeitet,also keine website oder ähnliches.

meine Idee war halt ein 6fach Wand-Taster incl. LCD Modul,aber auf lan Bassis halt zu bauen. Dieser soll halt an die Haussteuerung bestimmte Texte wie "gWeter" senden,und bekommt als antwort dann Aussentemperatur und Feuchte.

Also beim Taster 1 drücken,der text: "sWebtaster1=an" einmalig an Ip und Port senden,und bekommt als antwort "set ok" zurück. Die led neben Taster 1 soll dannquasi parallel zu dem geschaltetem Aktor am Server an und ausgehen.

Alles was ich möchte ist in dem code vom post 1 halt den text beim ein oder aus einmalig senden.
Also es muss halt je nach zustand der led ein text gesendet werden.
Also:

  • led 1 an =text senden “sWebtaster1=an” einmalig
  • led 1 aus =text senden “sWebtaster1=aus” einmalig

EDIT:
Im Anhang noch mein prototyp des Wandtasters

plexitaster.JPG

Sketch:

#include "ClickButton.h"
#include 
#include   
//ETHERNET-SETTINGS
byte mac[]     = { 0x5D, 0xA2, 0xFA, 0x2D, 0x36, 0x3C };    // MAC-Adresse des Arduino
byte ip[]      = { 192, 168, 178, 178 };                     // IP-Adresse des Arduino
byte gateway[] = { 192, 168, 178, 1 };                    // Gateway
byte subnet[]  = { 255, 255, 255, 0 };                    // SubNet
byte server[]  = { 192, 168, 178, 2 };                     // IP-Adresse des Servers
EthernetClient client;
char host[]    = "localhost";                      // Domain
char schreiben[]     = "/save.php"; // Pfad zur PHP-Datei zum schreiben
char key[]     = "DEINPASSWORTEGALWELCHES";                     // Kennwort aus PHP-Datei
char c;                                                     // Variable für Rückgabe des Servers



// the LED
const int ledPin = 8;
int ledState = 1;

// the Button
const int buttonPin1 = 3;
ClickButton button1(buttonPin1, LOW, CLICKBTN_PULLUP);

// Arbitrary LED function 
int LEDfunction = 0;


void setup()
{
delay(1000);
  Serial.begin(9600); 
  Serial.flush();
  delay(200);
  Serial.println("Ethernet initialisieren...");  
  Ethernet.begin(mac, ip);

  delay(1000);
  pinMode(ledPin,OUTPUT);  

  // Setup button timers (all in milliseconds / ms)
  // (These are default if not set, but changeable for convenience)
  button1.debounceTime   = 20;   // Debounce timer in ms
  button1.multiclickTime = 250;  // Time limit for multi clicks
  button1.longClickTime  = 1000; // time until "held-down clicks" register
}


void loop()
{
  // Update button state
  button1.Update();
  // Save click codes in LEDfunction, as click codes are reset at next Update()
  if (button1.clicks != 0) LEDfunction = button1.clicks;


  // Simply toggle LED on single clicks
  // (Cant use LEDfunction like the others here,
  //  as it would toggle on and off all the time)
  if(button1.clicks == 1) 
  {
    ledState = !ledState;
    
   Daten_senden(ledState,ledState); 
    delay(700);

  byte maxReads = 10; //Seconds
  while ((maxReads-- > 0) && client.connected())              // Antwort des Servers lesen
  {
    delay(1000);
    while (client.available())
    {
      char response = client.read();
      Serial.print(response);
    }
  }
  client.stop();
  Serial.println("Done.");
  client.flush();
}
  

  // blink faster if double clicked
  if(LEDfunction == 2) ledState = (millis()/500)%2;

  // blink even faster if triple clicked
  if(LEDfunction == 3) ledState = (millis()/200)%2;

  // slow blink (must hold down button. 1 second long blinks)
  if(LEDfunction == -1) ledState = (millis()/1000)%2;

  // slower blink (must hold down button. 2 second loong blinks)
  if(LEDfunction == -2) ledState = (millis()/2000)%2;

  // even slower blink (must hold down button. 3 second looong blinks)
  if(LEDfunction == -3) ledState = (millis()/3000)%2;


  // update the LED
  digitalWrite(ledPin,ledState);

}


/******************************
                              *
  Daten an Server schickenn   *
                              *
*******************************/
void Daten_senden(boolean T1, boolean T2)
{
  if (client.connect(server, 80)) // Verbindung zum Server aufbauen
  {
    Serial.println("Verbunden, Sende Daten...");
    client.print("GET " + String(schreiben));
    Serial.println("GET " + String(schreiben));
    client.print("?T1=");
    Serial.print("?T1=");
    client.print(T1);
    Serial.println(T1);
    client.print("&T2=");
    Serial.print("&T2=");
    client.print(T2);
    Serial.println(T2);
    client.print("&key=" + String(key));
    Serial.print("&key=" + String(key));
    client.println(" HTTP/1.1");
    Serial.println(" HTTP/1.1");
    client.print("Host: " + String(host));
    Serial.print("Host: " + String(host));
    client.println();
    Serial.println();
    client.println("User-Agent: Arduino");
    Serial.println("User-Agent: Arduino");
    client.println("Connection: close");
    Serial.println("Connection: close");
    client.println();
    Serial.println();
  }
  else
  {
    Serial.println(" ***** VERBINDUNG KANN NICHT HERGESTELLT WERDEN *****");
  }
}

Wieso machst du es nicht mit rs485? http://forum.arduino.cc/index.php?topic=206317.0

Ansonsten stellt hier einer sein Projekt vor, allerdings ohne code. http://forum.arduino.cc/index.php?topic=203022

Tja die Frage ist ganz einfach zu beantworten: - keine Kabeverlegung da Lan/wlan/Powerline schon vorhanden ist - flexible Installation auch im Außenbereich wie Gartenhaus,Garage usw -vor allem keine Sendebeschrenkung obwohl per Funk :grin:

EDIT: wifi to serial Module bekommst du schon unter 20€

Taster muss Strom haben, also kabel her. Processor muss auch jeder Taster haben. Dazu kommt noch jeder Taster muss ein WLAN modul haben oder halt ein Kabel fürs LAN. Denke es wird teurer als max485 (8€ 100 Stück)

Dass mit Beschränkung ist so eine sache....

Hast den Sketch getestet? Hier meine SerialMonitor Ausgabe:

Verbunden, Sende Daten...
GET /save.php
?T1=1
&T2=1
&key=MEINPASSWORT123 HTTP/1.1
Host: localhost
User-Agent: Arduino
Connection: close

HTTP/1.1 200 OK
Date: Sun, 19 Jan 2014 12:12:10 GMT
Server: Apache
X-Powered-By: PHP/5.5.3
Content-Length: 27
Connection: close
Content-Type: text/html

Temperaturwerte gespeichertDone.
Verbunden, Sende Daten...
GET /save.php
?T1=0
&T2=0
&key=MEINPASSWORT123 HTTP/1.1
Host: localhost
User-Agent: Arduino
Connection: close

HTTP/1.1 200 OK
Date: Sun, 19 Jan 2014 12:12:15 GMT
Server: Apache
X-Powered-By: PHP/5.5.3
Content-Length: 27
Connection: close
Content-Type: text/html

Temperaturwerte gespeichertDone.

EDIT: Dann kannst du genauso KNX einbauen