Hallo
ich bin erstens neu im Forum und 2. neu mit Arduino...
ich möchte mir mittels FHEM eine Homeautomation aufbauen... klappt auch ganz gut soweit.
jetzt habe ich nach langem googlen eine möglichkeit gefunden ein Relay via Ethernet am Arduino zu steuern...
was möchte ich:
FHEM (Rpi) sendet Befehl via LAN > ARduino schaltet Relay > gibt Rückmeldung an FHEM
derzeit :
FHEM > Arduino schaltet Relais > keine Rückmeldung
Problem: Wenn man auf die Site vom Arduino geht, wird der derzeit vorherrschende Befehl (vom FHEM) auf standard vom Arduino geswitcht... ist das verständlich beschrieben
ich habe hier diesen Code gefunden:
#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, 253);
EthernetServer server(80);
int numPins = 4;
int pins[] = {3, 4, 5, 6};
int pinState[] = {1, 1, 1, 1, 1}; //legt die standardwerte fest
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);
digitalWrite(pins[i], pinState[1]); //setzt alle pins standard auf 1
}
}
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.3</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(">On</option>");
client.print("<option value='1'");
if (pinState[i] == 1)
{
client.print(" selected");
}
client.println(">Off</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;
}
der funktioniert auch ganz gut, aber wie gesagt, wenn ich einzeln schlaten will über zb. die Adresszeile des Browsers funktioniert das nicht ganz...
hat jemand von euch ideen? bzw. kennt sich da wer aus?
hallo
ich habe jetzt einen anderen code, der funktioniert besser (und ist einfacher zum lesen für mich 
nur bleibt das Problem immer noch bestehend, dass nach einiger zeit der Arduino nicht mehr erreichbar ist ...
was kann man dagegen unternehmen?
hier mal mein code
#include <UIPEthernet.h> // Used for Ethernet
#include <RCSwitch.h>
#include <SPI.h>
#include <avr/wdt.h>
// **** ETHERNET SETTING ****
byte mac[] = { 0x54, 0x34, 0x41, 0x30, 0x30, 0x31 };
IPAddress ip(192, 168, 0, 223);
EthernetServer server(80);
const byte pin3 = 3;
const byte pin4 = 4;
const byte pin5 = 5;
const byte pin6 = 6;
String readString;
void setup() {
//delay(300);//time for Ethernet to initialise
Serial.begin(115200);
//wdt_enable(WDTO_1S);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
Serial.print("IP Address: ");
Serial.println(Ethernet.localIP());
pinMode(pin3, OUTPUT); //setze pins auf ausgang
pinMode(pin4, OUTPUT); //setze pins auf ausgang
pinMode(pin5, OUTPUT); //setze pins auf ausgang
pinMode(pin6, OUTPUT); //setze pins auf ausgang
digitalWrite(pin3, HIGH); //setze pins auf OFF
digitalWrite(pin4, HIGH); //setze pins auf OFF
digitalWrite(pin5, HIGH); //setze pins auf OFF
digitalWrite(pin6, HIGH); //setze pins auf OFF
Serial.println("starting");
}
void loop() {
// Programm starts working...now.
//wdt_reset();
// listen for incoming clients
EthernetClient client = server.available();
if (client == true)
{
while (client.connected())
{ //hier bin ich
if (client.available())
{
char c = client.read();// Read char by char HTTP request
if (readString.length() < 100)
{
readString = readString + c;// Store characters to string
}
if (c == '\n')
{
Serial.println(readString);
client.println(F("http/1.1 200 ok"));// Send standard http headers
client.println(F("content-type: text/html"));
client.println();
client.println(F("<!doctype html><html>"));
client.println(F("<body bgcolor='blue'>"));
client.println(F("<center><head><title>Home Web Control</title></head>"));
client.println(F("<h2>Arduino Nano Ethernet Shield Web Server(v1.2)</h2>"));
client.println(F("<h4>rewritten @ M.Berger</h4>"));
client.println(F("<hr/><p> Click the Buttons to turn On and OFF <p/><hr/>"));
client.print(F("<input type=button value='Pin3 ON' onmousedown=location.href='/?pin3_on'>"));
client.println(F("<input type=button value='Pin3 OFF' onmousedown=location.href='/?pin3_off'>
"));
client.print(F("<input type=button value='Pin4 ON' onmousedown=location.href='/?pin4_on'>"));
client.println(F("<input type=button value='Pin4 OFF' onmousedown=location.href='/?pin4_off'>
"));
client.print(F("<input type=button value='Pin5 ON' onmousedown=location.href='/?pin5_on'>"));
client.println(F("<input type=button value='Pin5 OFF' onmousedown=location.href='/?pin5_off'>
"));
client.print(F("<input type=button value='Pin6 ON' onmousedown=location.href='/?pin6_on'>"));
client.println(F("<input type=button value='Pin6 OFF' onmousedown=location.href='/?pin6_off'>
<hr/>"));
client.print(F("<input type=button value='Pin3+4 ON' onmousedown=location.href='/?pin3_4_on'>"));
client.println(F("<input type=button value='Pin3+4 OFF' onmousedown=location.href='/?pin3_4_off'>
<hr/>"));
client.print(F("<input type=button value='Alle ON' onmousedown=location.href='/?all_on'>"));
client.println(F("<input type=button value='Alle OFF' onmousedown=location.href='/?all_off'>
<hr/>"));
client.println(F("</body></html>"));
delay(1);// Page loading delay
client.stop();// Stopping client
if (readString.indexOf("/?pin3_on") > 0) digitalWrite(pin3, LOW); // Switch on Main Light
if (readString.indexOf("/?pin3_off") > 0) digitalWrite(pin3, HIGH); // Switch off Main Light
if (readString.indexOf("/?pin4_on") > 0) digitalWrite(pin4, LOW); // Switch on Chandelier Light
if (readString.indexOf("/?pin4_off") > 0) digitalWrite(pin4, HIGH); // Switch off Chandelier Light
if (readString.indexOf("/?pin5_on") > 0) digitalWrite(pin5, LOW); // Switch on Fan
if (readString.indexOf("/?pin5_off") > 0) digitalWrite(pin5, HIGH); // Switch off Fan
if (readString.indexOf("/?pin6_on") > 0) digitalWrite(pin6, LOW); // Switch on Auxillary Power
if (readString.indexOf("/?pin6_off") > 0) digitalWrite(pin6, HIGH); // Switch off Auxillary Power
if (readString.indexOf("/?pin3_4_off") > 0) {
digitalWrite(pin3, HIGH);
digitalWrite(pin4, HIGH);
}
if (readString.indexOf("/?pin3_4_on") > 0) {
digitalWrite(pin3, LOW);
digitalWrite(pin4, LOW);
}
if (readString.indexOf("/?all_off") > 0) {
digitalWrite(pin3, HIGH);
digitalWrite(pin4, HIGH);
digitalWrite(pin5, HIGH);
digitalWrite(pin6, HIGH);
}
if (readString.indexOf("/?all_on") > 0) {
digitalWrite(pin3, LOW);
digitalWrite(pin4, LOW);
digitalWrite(pin5, LOW);
digitalWrite(pin5, LOW);
}
readString = "";// Clearing string for next read
}// End of line reached
}// End of client available
}// End of client connected
}// End of client connection
}// End of loop