Problem mit der (Home Control) Lichtschalter Ausgabe

Hallo,

ich arbeite gerade an einem Arduino Home Control. Nun dazu habe ich einen Arduino Uno und ENC28J60 zur verfügung. Diese beiden Teile habe ich ohne Probleme, dank der “EtherCard.h” lib, zum Laufen gebracht. Ich kann damit also eine LED per Internet ansteuern. Soweit so gut. Weiters habe ich mir überlegt dieses Projekt ein bischen auszubauen, sprich ich würde gerne per Internet auch feststellen können ob ein Lichtschalter “on” oder “off” ist.

Meine Idee dazu war das ich den Lichtschalter nicht direkt ans 230V Netz anstecke sondern an Arduino. Somit könnte ich mich auch ein bischen mit FSM herumspielen, aber dazu später.

Jetzt ist der Lichtschalter an Arduino angeschlossen. Arduino ist wiedderrum mit ENC28J60 und Relais verbunden. Mein Problem liegt jetzt in der Programmierung.

Mein Code sieht jetzt so aus:

#include <EtherCard.h>


#define STATIC 0  

#if STATIC
static byte myip[] = { 192,168,1,200 };
static byte gwip[] = { 192,168,1,1 };
#endif


static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };

byte Ethernet::buffer[700]; 
BufferFiller bfill;

//----------------LED
const int ledPin = 2;
boolean ledStatus;
char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;
const int buttonPin =3;
int pinstate = 0;
//-----------------------




void setup(){
  Serial.begin(57600);
  Serial.println("\n[Funktionsmenu]");
  
  if (ether.begin(sizeof Ethernet::buffer, mymac) == 0) 
    Serial.println( "Failed to access Ethernet controller");
#if STATIC
  ether.staticSetup(myip, gwip);
#else
  if (!ether.dhcpSetup())
    Serial.println("DHCP failed");
#endif

  ether.printIp("IP:  ", ether.myip);
  ether.printIp("GW:  ", ether.gwip);  
  ether.printIp("DNS: ", ether.dnsip);
//------------------------LED
  pinMode(ledPin, OUTPUT);
  pinMode(buttonPin, INPUT);
  digitalWrite(ledPin, LOW); 
  ledStatus = false;
//-------------------------------  


}



void loop(){
  
  //----- Schalterabfrage
  pinstate = digitalRead(buttonPin);

   if(pinstate == HIGH){
    digitalWrite(ledPin,HIGH); 
   statusLabel = on;
  }
  
  if(pinstate == LOW){
    digitalWrite(ledPin,LOW);
    statusLabel = off;
  }
 //------------
 
  word len = ether.packetReceive();
  word pos = ether.packetLoop(len);
 
   
    bfill = ether.tcpOffset();
  bfill.emit_p(PSTR(
    "HTTP/1.0 200 OK\r\n"
    "Content-Type: text/html\r\n"
    "Pragma: no-cache\r\n"
    "\r\n"
    "<meta http-equiv='refresh' content='1'/>"
    "<html><head><title>HomeControl</title></head>"
    "<body>LED Status: $S "
    "</body></html>"),statusLabel);
   
    ether.httpServerReply(bfill.position());
}

Zwar funktioniert es so aber leider muss sich die Seite jede Sekunde refresehn. Gibts eine möglichkeit dies besser zu Programmieren ?? Ich könnte mir vorstellen das es vielleicht über die “GET” Funktion funktioniert, leider schaffe ich es nicht. :frowning: :frowning: :frowning: Hat jemand eine idee dazu ?

mfg Gregor

hi,
ich bin leider auch nur ein "dau", aber ich hab das mal mit ajax (javascript) gelöst.
Die html website schickt mittels javascript eine Anfrage an den arduino und der schickt nur den wert zurück. Das ganze mit einem javascript timer zB.
Die funktion die du mit xmlhttp.onreadystatechange definierst wird dann aufgerufen, und dort kannst du dann zB die Farbe der jeweiligen Buttons ändern.

unction getHttpRequest() {
   
    var xmlhttp = null;
    // Mozilla
    if (window.XMLHttpRequest) {
        xmlhttp = new XMLHttpRequest();
    }
    // IE
    else if (window.ActiveXObject) {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
   
    xmlhttp.open("GET", 'httprequest.php', true);
    xmlhttp.onreadystatechange = function() {
        if(xmlhttp.readyState != 4) {
            $('ergebnis').innerHTML = 'Seite wird geladen ...';
        }
        if(xmlhttp.readyState == 4 && xmlhttp.status == 200) {
            $('ergebnis').innerHTML = xmlhttp.responseText;
        }
    }
    xmlhttp.send(null);
}

GLG
Peter

Klick dich durch die Seite durch, da sind noch mehr Beispiele