布列松 发表于 2015-4-13 16:22:01

tsaiwn 发表于 2015-4-13 14:47 static/image/common/back.gif
最简单就是把我给你的整个
void doLed4(word pos) {
...


的确后面加了,但还是


#include <EtherCard.h>

static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
static byte myip[] = {192,168,1,180};
byte Ethernet::buffer;

const int ledPin = 3;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;
char* statusLabel2;
char* buttonLabel2;
char* statusLabel3;
char* buttonLabel3;
char* statusLabel4;
char* buttonLabel4;
unsigned char hexdata = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};
unsigned char yy[] = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0x0F};

void setup () {

Serial.begin(9600);
Serial.println("WebLed Demo");

if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
else
   Serial.println("Ethernet controller initialized");

if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");

Serial.println();

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
ledStatus = false;
}

void loop() {

word len = ether.packetReceive();
word pos = ether.packetLoop(len);
doLed(pos);
doLed2(pos);
doLed3(pos);
doLed4(pos);
}


void doLed( word pos) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.write(hexdata, 8);
      ledStatus = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.write(yy,sizeof( yy ));
      ledStatus = false;
    }

    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }
}

void doLed2(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
      Serial.write(hexdata, 8);
      ledStatus2 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
      Serial.write(yy,sizeof( yy ));
      ledStatus2 = false;
    }

    if(ledStatus2) {
      digitalWrite(ledPin, HIGH);
      statusLabel2 = on;
      buttonLabel2 = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel2 = off;
      buttonLabel2 = on;
    }

}
void doLed3(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
   Serial.write(hexdata, 8);
      ledStatus3 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
   Serial.write(yy,sizeof( yy ));
      ledStatus3 = false;
    }

    if(ledStatus3) {
      digitalWrite(ledPin, HIGH);
      statusLabel3 = on;
      buttonLabel3 = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel3 = off;
      buttonLabel3 = on;
    }

}
void doLed4(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
    Serial.write(hexdata, 8);
      ledStatus4 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
    Serial.write(yy,sizeof( yy ));
      ledStatus4 = false;
    }

    if(ledStatus4) {
      digitalWrite(ledPin4, HIGH);
      statusLabel4 = on;
      buttonLabel4 = off;
    } else {
      digitalWrite(ledPin4, LOW);
      statusLabel4 = off;
      buttonLabel4 = on;
    }

}
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>"
      "LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED2 Status: $S "
      "<a href=\"/?status2=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED3 Status: $S "
      "<a href=\"/?status3=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED4 Status: $S "
      "<a href=\"/?status4=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "</body></html>\r\n\r\n"      
      ), statusLabel, buttonLabel, buttonLabel,
      statusLabel2, buttonLabel2, buttonLabel2,
      statusLabel3, buttonLabel3, buttonLabel3,
      statusLabel4, buttonLabel4, buttonLabel4
      );
    ether.httpServerReply(bfill.position());
}
}

tsaiwn 发表于 2015-4-13 18:34:00

布列松 发表于 2015-4-13 16:22 static/image/common/back.gif
的确后面加了,但还是




这表示在该行之前你漏掉了一个 }
使得这新函数放到前面函数内部了 !
可能你复制贴上贴错地方 !?
这种小错误要自己找出来
不然要问问旁边的同学 !

tsaiwn 发表于 2015-4-13 18:37:41

布列松 发表于 2015-4-13 16:22 static/image/common/back.gif
的确后面加了,但还是





你 line 75 的 } 是 line 55 的 { 對應的
所以 line 54 的 { 對應的 } 應該出現在 line 76

可能每個 void doLed???(???) {

都漏掉了最後的 }
自己對照看看

布列松 发表于 2015-4-13 19:03:15

tsaiwn 发表于 2015-4-13 18:37 static/image/common/back.gif
你 line 75 的 } 是 line 55 的 { 對應的
所以 line 54 的 { 對應的 } 應該出現在 line 76



还是搞不明白,不知是不是IDE版本的问题了,能不能帮忙用arduino IDE检验一下代码,只是控制两个LED就可以了,后面的自己添加复制吧

tsaiwn 发表于 2015-4-13 19:21:03

布列松 发表于 2015-4-13 19:03 static/image/common/back.gif
还是搞不明白,不知是不是IDE版本的问题了,能不能帮忙用arduino IDE检验一下代码,只是控制两个LED就可以 ...


好了:#include <EtherCard.h>

static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
static byte myip[] = {192,168,1,180};
byte Ethernet::buffer;

const int ledPin = 3;
boolean ledStatus;

char* on = "ON";
char* off = "OFF";
char* statusLabel;
char* buttonLabel;
char* statusLabel2;
char* buttonLabel2;
char* statusLabel3;
char* buttonLabel3;
char* statusLabel4;
char* buttonLabel4;
unsigned char hexdata = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};
unsigned char yy[] = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0x0F};

void setup () {

Serial.begin(9600);
Serial.println("WebLed Demo");

if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
else
   Serial.println("Ethernet controller initialized");

if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");

Serial.println();

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
ledStatus = false;
} // setup(

void loop() {

word len = ether.packetReceive();
word pos = ether.packetLoop(len);
doLed(pos);
doLed2(pos);
doLed3(pos);
doLed4(pos);
    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>"
      "LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED2 Status: $S "
      "<a href=\"/?status2=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED3 Status: $S "
      "<a href=\"/?status3=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED4 Status: $S "
      "<a href=\"/?status4=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "</body></html>\r\n\r\n"      
      ), statusLabel, buttonLabel, buttonLabel,
      statusLabel2, buttonLabel2, buttonLabel2,
      statusLabel3, buttonLabel3, buttonLabel3,
      statusLabel4, buttonLabel4, buttonLabel4
      );
    ether.httpServerReply(bfill.position());
} // loop(

void doLed( word pos) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.write(hexdata, 8);
      ledStatus = true;
    }// if(strstr

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.write(yy,sizeof( yy ));
      ledStatus = false;
    }

    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }// if(..else..
   }// if(pos
} // doLed(
///////////////////////////
void doLed2(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
      Serial.write(hexdata, 8);
      ledStatus2 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
      Serial.write(yy,sizeof( yy ));
      ledStatus2 = false;
    }

    if(ledStatus2) {
      digitalWrite(ledPin, HIGH);
      statusLabel2 = on;
      buttonLabel2 = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel2 = off;
      buttonLabel2 = on;
    }
   }// if(pos
} // doLed2(
void doLed3(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
   Serial.write(hexdata, 8);
      ledStatus3 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
   Serial.write(yy,sizeof( yy ));
      ledStatus3 = false;
    }

    if(ledStatus3) {
      digitalWrite(ledPin, HIGH);
      statusLabel3 = on;
      buttonLabel3 = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel3 = off;
      buttonLabel3 = on;
    }
   } // if(pos
} // doLed3(
void doLed4(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
    Serial.write(hexdata, 8);
      ledStatus4 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
    Serial.write(yy,sizeof( yy ));
      ledStatus4 = false;
    }

    if(ledStatus4) {
      digitalWrite(ledPin4, HIGH);
      statusLabel4 = on;
      buttonLabel4 = off;
    } else {
      digitalWrite(ledPin4, LOW);
      statusLabel4 = off;
      buttonLabel4 = on;
    }
   }// if(pos
}// doLed4(

tsaiwn 发表于 2015-4-13 19:25:03

布列松 发表于 2015-4-13 19:03 static/image/common/back.gif
还是搞不明白,不知是不是IDE版本的问题了,能不能帮忙用arduino IDE检验一下代码,只是控制两个LED就可以 ...

因為你把原先該在 loop( ) { 內最後的那段搬走了
已經幫你搬回 loop( ) { 內最後
並幫你把每個 void doLed??(??){ 最後的 } 補回去了

布列松 发表于 2015-4-13 22:09:12

本帖最后由 布列松 于 2015-4-13 22:10 编辑

tsaiwn 发表于 2015-4-13 19:25 static/image/common/back.gif
因為你把原先該在 loop( ) { 內最後的那段搬走了
已經幫你搬回 loop( ) { 內最後
並幫你把每個 void do ...

终于解决了,不过现在页面少了一次刷新(应该是),按钮要按两次才能出现反映回来的状态




#include <EtherCard.h>

static byte mymac[] = {0x74,0x69,0x69,0x2D,0x30,0x31};
static byte myip[] = {192,168,1,180};
byte Ethernet::buffer;

const int ledPin = 3;
const int ledPin2 = 4;
const int ledPin3 = 5;
const int ledPin4 = 6;

boolean ledStatus;
boolean ledStatus2;
boolean ledStatus3;
boolean ledStatus4;

char* on = "ON";
char* off = "OFF";

char* statusLabel;
char* buttonLabel;
char* statusLabel2;
char* buttonLabel2;
char* statusLabel3;
char* buttonLabel3;
char* statusLabel4;
char* buttonLabel4;

unsigned char rs485_ON_01 = {0x01,0x05,0x00,0x10,0xFF,0x00,0x8D,0xFF};
unsigned char rs485_OFF_01 = {0x01,0x05,0x00,0x10,0x00,0x00,0xCC,0x0F};

unsigned char rs485_ON_02 = {0x01,0x05,0x00,0x11,0xFF,0x00,0xDC,0x3F};
unsigned char rs485_OFF_02 = {0x01,0x05,0x00,0x11,0x00,0x00,0x9D,0xCF};

unsigned char rs485_ON_03 = {0x01,0x05,0x00,0x12,0xFF,0x00,0x2C,0x3F};
unsigned char rs485_OFF_03 = {0x01,0x05,0x00,0x12,0x00,0x00,0x6D,0xCF};

unsigned char rs485_ON_04 = {0x01,0x05,0x00,0x13,0xFF,0x00,0x7D,0xFF};
unsigned char rs485_OFF_04 = {0x01,0x05,0x00,0x13,0x00,0x00,0x3C,0x0F};

void setup () {

Serial.begin(9600);
Serial.println("WebLed Demo");

if (!ether.begin(sizeof Ethernet::buffer, mymac, 10))
    Serial.println( "Failed to access Ethernet controller");
else
   Serial.println("Ethernet controller initialized");

if (!ether.staticSetup(myip))
    Serial.println("Failed to set IP address");

Serial.println();

pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, LOW);
pinMode(ledPin2, OUTPUT);
digitalWrite(ledPin2, LOW);
pinMode(ledPin3, OUTPUT);
digitalWrite(ledPin3, LOW);
pinMode(ledPin4, OUTPUT);
digitalWrite(ledPin4, LOW);

ledStatus = false;
ledStatus2 = false;
ledStatus3 = false;
ledStatus4 = false;
} // setup(

void loop() {

word len = ether.packetReceive();
word pos = ether.packetLoop(len);

doLed(pos);
doLed2(pos);
doLed3(pos);
doLed4(pos);

    BufferFiller bfill = ether.tcpOffset();
    bfill.emit_p(PSTR("HTTP/1.0 200 OK\r\n"
      "Content-Type: text/html\r\nPragma: no-cache\r\n\r\n"
      "<html><head><title>WebLed</title></head>"
      "<body>"
      "LED Status: $S "
      "<a href=\"/?status=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED2 Status: $S "
      "<a href=\"/?status2=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED3 Status: $S "
      "<a href=\"/?status3=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "LED4 Status: $S "
      "<a href=\"/?status4=$S\"><input type=\"button\" value=\"$S\"></a>"
      "<br><br>"

      "</body></html>\r\n\r\n"      
      ), statusLabel, buttonLabel, buttonLabel,
      statusLabel2, buttonLabel2, buttonLabel2,
      statusLabel3, buttonLabel3, buttonLabel3,
      statusLabel4, buttonLabel4, buttonLabel4
      );
    ether.httpServerReply(bfill.position());
} // loop(

void doLed( word pos) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=ON") != 0) {
      Serial.write(rs485_ON_01, 8);
      ledStatus = true;
    }// if(strstr

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status=OFF") != 0) {
      Serial.write(rs485_OFF_01, 8);
      ledStatus = false;
    }

    if(ledStatus) {
      digitalWrite(ledPin, HIGH);
      statusLabel = on;
      buttonLabel = off;
    } else {
      digitalWrite(ledPin, LOW);
      statusLabel = off;
      buttonLabel = on;
    }// if(..else..
   }// if(pos
} // doLed(
///////////////////////////
void doLed2(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status2=ON") != 0) {
      Serial.write(rs485_ON_02, 8);
      ledStatus2 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status2=OFF") != 0) {
      Serial.write(rs485_OFF_02, 8);
      ledStatus2 = false;
    }

    if(ledStatus2) {
      digitalWrite(ledPin2, HIGH);
      statusLabel2 = on;
      buttonLabel2 = off;
    } else {
      digitalWrite(ledPin2, LOW);
      statusLabel2 = off;
      buttonLabel2 = on;
    }
   }// if(pos
} // doLed2(
void doLed3(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status3=ON") != 0) {
   Serial.write(rs485_ON_03, 8);
      ledStatus3 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status3=OFF") != 0) {
   Serial.write(rs485_OFF_03, 8);
      ledStatus3 = false;
    }

    if(ledStatus3) {
      digitalWrite(ledPin3, HIGH);
      statusLabel3 = on;
      buttonLabel3 = off;
    } else {
      digitalWrite(ledPin3, LOW);
      statusLabel3 = off;
      buttonLabel3 = on;
    }
   } // if(pos
} // doLed3(
void doLed4(word pos ) {
   if(pos) {
    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=ON") != 0) {
    Serial.write(rs485_ON_04, 8);
      ledStatus4 = true;
    }

    if(strstr((char *)Ethernet::buffer + pos, "GET /?status4=OFF") != 0) {
    Serial.write(rs485_OFF_04, 8);
      ledStatus4 = false;
    }

    if(ledStatus4) {
      digitalWrite(ledPin4, HIGH);
      statusLabel4 = on;
      buttonLabel4 = off;
    } else {
      digitalWrite(ledPin4, LOW);
      statusLabel4 = off;
      buttonLabel4 = on;
    }
   }// if(pos
}// doLed4(

tsaiwn 发表于 2015-4-13 22:28:30

布列松 发表于 2015-4-13 22:09 static/image/common/back.gif
终于解决了,不过现在页面少了一次刷新(应该是),按钮要按两次才能出现反映回来的状态




是说原来只做一个 Led 不必按两次
但现在做四个 Led 每个LED的改变都要按两次 ?

tsaiwn 发表于 2015-4-13 22:31:14

布列松 发表于 2015-4-13 22:09 static/image/common/back.gif
终于解决了,不过现在页面少了一次刷新(应该是),按钮要按两次才能出现反映回来的状态




问一下
你那些用 RS485 送出的 8 bytes 是连接到啥 ?

tsaiwn 发表于 2015-4-13 22:44:48

布列松 发表于 2015-4-13 22:09 static/image/common/back.gif
终于解决了,不过现在页面少了一次刷新(应该是),按钮要按两次才能出现反映回来的状态




把 Line 84 的
"<html><head><title>WebLed</title></head>"
改为如下三行:
"<html><head><title>WebLed</title>"
"<meta http-equiv=\"refresh\" content=\"1\">"
"</head>"
这意思是让 Web page 每秒自动 Refresh
这样看看是否单击即可 ?

布列松 发表于 2015-4-13 22:58:37

tsaiwn 发表于 2015-4-13 22:44 static/image/common/back.gif
把 Line 84 的
"WebLed"
改为如下三行:


好的 我试试,每一秒自动好像太快了

布列松 发表于 2015-4-13 22:59:04

tsaiwn 发表于 2015-4-13 22:31 static/image/common/back.gif
问一下
你那些用 RS485 送出的 8 bytes 是连接到啥 ?

那个是输出给一个RS485的继电器开关的

tsaiwn 发表于 2015-4-13 23:05:17

布列松 发表于 2015-4-13 22:59 static/image/common/back.gif
那个是输出给一个RS485的继电器开关的

但是你的 Serial 不是 .print 到串口監視器
你同時把 pin 0, pin 1 連接到继电器开关 ?
這樣 .write 那 8 char 時, 串口監視器不是會出現亂碼 ?

布列松 发表于 2015-4-13 23:43:23

tsaiwn 发表于 2015-4-13 23:05 static/image/common/back.gif
但是你的 Serial 不是 .print 到串口監視器
你同時把 pin 0, pin 1 連接到继电器开关 ?
這樣 .write 那 ...

是会乱码但是,对效果无影响,我用串口接上一个“TTL转RS485模块”然后再到RS485那里

布列松 发表于 2015-4-13 23:44:29

tsaiwn 发表于 2015-4-13 23:05 static/image/common/back.gif
但是你的 Serial 不是 .print 到串口監視器
你同時把 pin 0, pin 1 連接到继电器开关 ?
這樣 .write 那 ...

有两个问题,那个刷新可能不太好,我用nano板 好像会死机,但是在不自动刷新的情况下也会死机,
页: 1 2 [3] 4
查看完整版本: enc28j60 控制多个 led IO 的代码,模块本身带控制的html页面