Go Down

Topic: Web client mit Taster und LED (Read 17475 times) previous topic - next topic

Haustechno

Jan 16, 2014, 05:32 pm Last Edit: Jan 16, 2014, 05:34 pm by Haustechno Reason: 1
Abend zusammen,

ich habe mir folgenden code zusammengezimmert,bei dem ich auch  die ClickButton verwende:
/
Code: [Select]
/---------------------------Bibliotheken hinzufügen
#include <SPI.h>                                                                // Spi Bus Bibliothek
#include <Ethernet.h>                                                           // 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<buttons; i++)
 {
   pinMode(ledPin[i],OUTPUT);                                                  //Led pins als Ausgang deffinieren
//-------------------------Button Timer
   button[i].debounceTime   = 20;                                              //timer debounce
   //button[i].longClickTime  = 1000;                                            // Timer für drücken Lang
 }
}
//========================Programm Loop
void loop()
{
//************************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
//************************Ende Server Code
  }
 for (int i=0; i<buttons; i++)
 {
   //---------------------Zustand aller Buttons aktualisieren
   button[i].Update();
   //---------------------Speichern der Tastendrücke in Funktion
   if (button[i].clicks != 0) LEDfunction[i] = button[i].clicks;
   //---------------------Funktion 1
   if(button[i].clicks == 1) ledState[i] = !ledState[i];
}
 //-----------------------LED Update
 for (int i=0; i<buttons; i++)
 {
   digitalWrite(ledPin[i],ledState[i]);
 }
}


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

Code: [Select]
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




sschultewolter

#1
Jan 16, 2014, 05:49 pm Last Edit: Jan 16, 2014, 05:57 pm by sschultewolter Reason: 1
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.
Code: [Select]

 //************************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:
Code: [Select]

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.

Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Haustechno

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.

Haustechno

Danke,

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

sschultewolter

Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Haustechno

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?

sschultewolter

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.
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

Haustechno

ok Danke wieder was gelernt ;-)

Zeile 79:
  for (int i=0; i<buttons; i++)

Haustechno


Haustechno

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,


sschultewolter

Also klappt es nun so wie gewollt, nur dass er es halt dauerhaft zum server kommt?
Orginal Atmel AVRISP mkII zu verkaufen. Anfrage per PN ;)

skorpi080

playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Haustechno

#12
Jan 18, 2014, 12:10 pm Last Edit: Jan 18, 2014, 12:17 pm by Haustechno Reason: 1
Morgen zusammen,

@sschultewolter

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

@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 :(


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

skorpi080

Code: [Select]

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.
playground.arduino.cc/PmWiki/433Mhz-Funkmodule
[Arduino IDE] Feinheiten und Tricks  forum.arduino.cc/index.php?topic=632403.0

Haustechno

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.

Go Up