Arduino Nano V3 mit Ethernet und Relays - lässt nicht ausschalten

Begonnen von MichlB, 06 Juni 2015, 11:51:57

Vorheriges Thema - Nächstes Thema

MichlB

Hallo
Ich habe nach der anleitung von http://www.fhemwiki.de/wiki/Arduino die einbindung ins FHEM vorgenommen, leider ging das kompilieren der dort befindlichen Sketches nicht, warum auch immer...
bin also auf die Suche gegangen und habe hier http://www.instructables.com/id/Ethernet-Switching-with-Arduino/ auch was gefunden, lässt sich kompilieren...

quint-essenz: also ich hab das teil zum laufen gebracht, aber es lässt sich nicht mittels fhem nicht mehr ausschalten....


hier mal der Sketch:
#include <UIPEthernet.h> // Used for Ethernet
#include <RCSwitch.h>
#include <SPI.h>


// **** ETHERNET SETTING ****
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };                                       
IPAddress ip(192, 168, 0, 223);                       
EthernetServer server(80);


int numPins = 5;
int pins[] = {3, 4, 5, 6, 7};
int pinState[] = {0, 0, 0, 0, 0};
char line1[100];

// RCSwitch configuration
RCSwitch mySwitch = RCSwitch();
int RCTransmissionPin = 6;

void setup() {
  Serial.begin(115200);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.print("IP Address: ");
  Serial.println(Ethernet.localIP());
 
  for (int i = 0; i < numPins; i++)
  {
     pinMode(pins[i], OUTPUT);
  }

}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
if (client)
  {
    while (client.connected())
    {
      readHeader(client);
      if (! pageNameIs("/"))
      {
        client.stop(); 
        return;
      }
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();

      // send the body
      client.println("<html><body>");
      client.println("<h1>Output Pins v.2</h1>");
      client.println("<form method='GET'>"); 
      setValuesFromParams();
      setPinStates();
      for (int i = 0; i < numPins; i++)
      {
         writeHTMLforPin(client, i);
      }
      client.println("<input type='submit' value='Update'/>");
      client.println("</form>");
      client.println("</body></html>");

      client.stop();           
    }
  }
}

void writeHTMLforPin(EthernetClient client, int i)
{
  client.print("<p>Pin ");
  client.print(pins[i]); 
  client.print("<select name='");
  client.print(i);
  client.println("'>");
  client.print("<option value='1'");
  if (pinState[i] == 1)
  {
    client.print(" selected");
  }
  client.println(">On</option>");
  client.print("<option value='1'");
  if (pinState[i] == 1)
  {
    client.print(" selected");
  }
  client.println(">Off</option>");
  //client.println("<option value='0'></p>"); 
  client.println("</select></p>"); 
 
}

void setPinStates()
{
  for (int i = 0; i < numPins; i++)
  {
     digitalWrite(pins[i], pinState[i]);
  }
}

void setValuesFromParams()
{
  for (int i = 0; i < numPins; i++)
  {
    pinState[i] = valueOfParam(i + '0');
  }
}

void readHeader(EthernetClient client)
{
  // read first line of header
  char ch;
  int i = 0;
  while (ch != '\n')
  {
    if (client.available())
    {
      ch = client.read();
      line1[i] = ch;
      i ++;
    }
  }
  line1[i] = '\0';
  Serial.println(line1);
}

boolean pageNameIs(char* name)
{
   // page name starts at char pos 4
   // ends with space
   int i = 4;
   char ch = line1[i];
   while (ch != ' ' && ch != '\n' && ch != '?')
   {
     if (name[i-4] != line1[i])
     {
       return false;
     }
     i++;
     ch = line1[i];
   }
   return true;
}

int valueOfParam(char param)
{
  for (int i = 0; i < strlen(line1); i++)
  {
    if (line1[i] == param && line1[i+1] == '=')
    {
      return (line1[i+2] - '0');
    }
  }
  return 0;
}


ich kann nur über die homepage direkt wieder ausschalten.

hat jemand eine idee?
lg und danke
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

MichlB

ok ich bin einen schritt weiter,
habe im sketch scheinbar einen fehler entdeckt bzw. wahrscheinlich selbst verursacht, weil ich wollte, dass die pins von Standard her auf OFF gestellt sind, bzw. das Relais auf off is und nicht wie beim nachstehenden Sketch ....
#include <UIPEthernet.h> // Used for Ethernet
#include <RCSwitch.h>
#include <SPI.h>


// **** ETHERNET SETTING ****
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };                                       
IPAddress ip(192, 168, 0, 223);                       
EthernetServer server(80);


int numPins = 5;
int pins[] = {3, 4, 5, 6, 7};
int pinState[] = {0, 0, 0, 0, 0};
char line1[100];

// RCSwitch configuration
RCSwitch mySwitch = RCSwitch();
int RCTransmissionPin = 6;

void setup() {
  Serial.begin(115200);

  // start the Ethernet connection and the server:
  Ethernet.begin(mac, ip);
  server.begin();

  Serial.print("IP Address: ");
  Serial.println(Ethernet.localIP());
 
  for (int i = 0; i < numPins; i++)
  {
     pinMode(pins[i], OUTPUT);
  }

}

void loop() {
  // listen for incoming clients
  EthernetClient client = server.available();
if (client)
  {
    while (client.connected())
    {
      readHeader(client);
      if (! pageNameIs("/"))
      {
        client.stop(); 
        return;
      }
      client.println("HTTP/1.1 200 OK");
      client.println("Content-Type: text/html");
      client.println();

      // send the body
      client.println("<html><body>");
      client.println("<h1>Output Pins v.2</h1>");
      client.println("<form method='GET'>"); 
      setValuesFromParams();
      setPinStates();
      for (int i = 0; i < numPins; i++)
      {
         writeHTMLforPin(client, i);
      }
      client.println("<input type='submit' value='Update'/>");
      client.println("</form>");
      client.println("</body></html>");

      client.stop();           
    }
  }
}

void writeHTMLforPin(EthernetClient client, int i)
{
  client.print("<p>Pin ");
  client.print(pins[i]); 
  client.print("<select name='");
  client.print(i);
  client.println("'>");
  client.print("<option value='0'");
  if (pinState[i] == 0)
  {
    client.print(" selected");
  }
  client.println(">Off</option>");
  client.print("<option value='1'");
  if (pinState[i] == 1)
  {
    client.print(" selected");
  }
  client.println(">On</option>");
  //client.println("<option value='0'"); 
  client.println("</select></p>"); 
 
}

void setPinStates()
{
  for (int i = 0; i < numPins; i++)
  {
     digitalWrite(pins[i], pinState[i]);
  }
}

void setValuesFromParams()
{
  for (int i = 0; i < numPins; i++)
  {
    pinState[i] = valueOfParam(i + '0');
  }
}

void readHeader(EthernetClient client)
{
  // read first line of header
  char ch;
  int i = 0;
  while (ch != '\n')
  {
    if (client.available())
    {
      ch = client.read();
      line1[i] = ch;
      i ++;
    }
  }
  line1[i] = '\0';
  Serial.println(line1);
}

boolean pageNameIs(char* name)
{
   // page name starts at char pos 4
   // ends with space
   int i = 4;
   char ch = line1[i];
   while (ch != ' ' && ch != '\n' && ch != '?')
   {
     if (name[i-4] != line1[i])
     {
       return false;
     }
     i++;
     ch = line1[i];
   }
   return true;
}

int valueOfParam(char param)
{
  for (int i = 0; i < strlen(line1); i++)
  {
    if (line1[i] == param && line1[i+1] == '=')
    {
      return (line1[i+2] - '0');
    }
  }
  return 0;
}


hier ist es so:
auf der Homepage wird "off" angezeigt, aber das RElay schaltet ein... ich hätte das gerne anders, d.h. wenn ich auf on gehe sollte das relay einschalten und wenn der Arduino startet soll auch auf off sein....

ach ja und schalten kann ich das aus dem FHEM heraus nun auch mittels:

define arduinobutton:off { GetHttpFile("192.168.0.223:80","/?3=1")}
define arduinobutton:on { GetHttpFile("192.168.0.223:80","/?3=0")}

1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

MichlB

und wieder ein stückschen weiter...

mittlerweile sind die Relays auf OFF wenn der Arduino gestartet wird...
einbindung in FHEM klappt auch, schalten im FHEM klappt auch....

TIMER: ha harperts... wenn ich den Arduino als FS20 definierte dann kann ich zwar on-for-timer, aber er schaltet nicht mehr ab nach der Zeitspanne...
define ArduinoTest FS20 55d1 00
attr ArduinoTest room Arduino
attr ArduinoTest webCmd on:off:timer
#define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton
#attr FileLog_arduinobutton room Arduino
define ArduinoTestswitchon notify ArduinoTest:on { GetHttpFile("192.168.0.223:80","/?3=0")}
attr ArduinoTestswitchon room Arduino
define ArduinoTestswitchoff notify ArduinoTest:off { GetHttpFile("192.168.0.223:80","/?3=1")}
attr ArduinoTestswitchoff room Arduino
define ArduinoTestswitchtimer notify ArduinoTest:timer set ArduinoTest:on ;;;; +00:01:00 set ArduinoTest:off


also habe ich herumgebastelt und das ganze als dummy
attr ArduinoTestswitchtimer room Arduino
define Timer dummy
attr Timer room Arduino
attr Timer webCmd on:off
define Timeron notify Timer:on set arduinobutton on ;; +00:01:00  set arduinobutton off
attr Timeron room Arduino


leider funktioniert auch hier die abschaltung nicht...
einschalten zum gewünschten Zeitpunkt klappt, aber das Abschalten nach ablauf der Zeit, egal ob on-for-timer oder mit der +00:01:00 variante bekomm ich nicht hin....
hab ich irgendwo einen syntaxfehler oder dergleichen?
denkfehler???

irgendwer ideen???
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

MichlB

Heureka!!!!!
ich habs geschafft...
witzig, immer wenn ich was poste, kommt entweder kurz drauf die lösung oder ich stotze durch zufall drauf....

hier der code wo der timer bei den Notifys funktioniert... in meinem fall...
;D

##################################################

define arduinobutton dummy
attr arduinobutton room Arduino
attr arduinobutton webCmd on:off:on-for-timer 30
#define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton
#attr FileLog_arduinobutton room Arduino
define arduinoswitchon notify arduinobutton:on { GetHttpFile("192.168.0.223:80","/?3=0")}
attr arduinoswitchon room Arduino
define arduinoswitchoff notify arduinobutton:off { GetHttpFile("192.168.0.223:80","/?3=1")}
attr arduinoswitchoff room Arduino
#define arduinobutton:on { GetHttpFile("192.168.0.223:80","/?cmd=set_6_Off")}
define sprinkleAbend at *00:08:01 set arduinobutton on
attr sprinkleAbend room Arduino

define AbendsSprinkle at *10:50:00 set ArduinoTest:on
attr AbendsSprinkle room Arduino

#####################
define ArduinoTest FS20 55d1 00
attr ArduinoTest room Arduino
attr ArduinoTest webCmd on:off:timer
#define FileLog_arduinobutton FileLog /otp/fhem/log/arduinobuttonon-%Y.log arduinobutton
#attr FileLog_arduinobutton room Arduino
define ArduinoTestswitchon notify ArduinoTest:on { GetHttpFile("192.168.0.223:80","/?3=0")}
attr ArduinoTestswitchon room Arduino
define ArduinoTestswitchoff notify ArduinoTest:off { GetHttpFile("192.168.0.223:80","/?3=1")}
attr ArduinoTestswitchoff room Arduino


#define ArduinoTestswitchtimer notify ArduinoTest:timer {\
#GetHttpFile("192.168.0.223:80","/?3=0");;;;\
#+00:00:20 GetHttpFile("192.168.0.223:80","/?3=1")";;;;\
#}
define ArduinoTestswitchtimer notify ArduinoTest:timer {fhem "set arduinobutton on";; fhem "define timer at +00:00:30 set arduinobutton off"}
attr ArduinoTestswitchtimer room Arduino



is noch etwas unordentlich aber ich wollte den erfolg mit euch teilen...
lg
falls es jemand brauchen kann.. bitte schön...
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

MichlB

zu früh gefreut... :'(

das vorangegangene funktioniert nur bei 1 Relais
wenn ich 2 anschließe, dann ist immer eines aktiv... beide ausschalten funkt irgendwie nicht...

ich vermute es liegt am { GetHttpFile("192.168.0.223:80","/?3=0")}
habe es auch schon mit { GetHttpFile("192.168.0.223:80","/?cmd set 3=0")} usw versucht aber es ist immer ein relay aktiv...
1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox

MichlB

update:
mittlerweile schalte ich die Relays über  {GetHttpFile("192.168.0.223:80","/?0=1&1=1&2=1&3=1&4=1")}
ist nicht besonders elegant aber es funktioniert... irgendwie...
jedoch macht sich das Arduino-Relay manchmal selbständig, deshalb hätte ich gerne eine prüfung zwischen den gewünschten timern, dass in regelmässigen Abständen ein ausschalt-befehl geschickt wird...

siehe http://forum.fhem.de/index.php/topic,37961.msg302013.html#msg302013



1x PI 2B+ FHEM - Heizung
1x Pi 3b+ - FHEM - Haussteuerung
1x Pi 3 - MagicMirror
2x Pi B - Musicbox