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());
}
}
布列松 发表于 2015-4-13 16:22 static/image/common/back.gif
的确后面加了,但还是
这表示在该行之前你漏掉了一个 }
使得这新函数放到前面函数内部了 !
可能你复制贴上贴错地方 !?
这种小错误要自己找出来
不然要问问旁边的同学 !
布列松 发表于 2015-4-13 16:22 static/image/common/back.gif
的确后面加了,但还是
你 line 75 的 } 是 line 55 的 { 對應的
所以 line 54 的 { 對應的 } 應該出現在 line 76
可能每個 void doLed???(???) {
都漏掉了最後的 }
自己對照看看
tsaiwn 发表于 2015-4-13 18:37 static/image/common/back.gif
你 line 75 的 } 是 line 55 的 { 對應的
所以 line 54 的 { 對應的 } 應該出現在 line 76
还是搞不明白,不知是不是IDE版本的问题了,能不能帮忙用arduino IDE检验一下代码,只是控制两个LED就可以了,后面的自己添加复制吧
布列松 发表于 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(
布列松 发表于 2015-4-13 19:03 static/image/common/back.gif
还是搞不明白,不知是不是IDE版本的问题了,能不能帮忙用arduino IDE检验一下代码,只是控制两个LED就可以 ...
因為你把原先該在 loop( ) { 內最後的那段搬走了
已經幫你搬回 loop( ) { 內最後
並幫你把每個 void doLed??(??){ 最後的 } 補回去了
本帖最后由 布列松 于 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(
布列松 发表于 2015-4-13 22:09 static/image/common/back.gif
终于解决了,不过现在页面少了一次刷新(应该是),按钮要按两次才能出现反映回来的状态
是说原来只做一个 Led 不必按两次
但现在做四个 Led 每个LED的改变都要按两次 ?
布列松 发表于 2015-4-13 22:09 static/image/common/back.gif
终于解决了,不过现在页面少了一次刷新(应该是),按钮要按两次才能出现反映回来的状态
问一下
你那些用 RS485 送出的 8 bytes 是连接到啥 ?
布列松 发表于 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
这样看看是否单击即可 ?
tsaiwn 发表于 2015-4-13 22:44 static/image/common/back.gif
把 Line 84 的
"WebLed"
改为如下三行:
好的 我试试,每一秒自动好像太快了
tsaiwn 发表于 2015-4-13 22:31 static/image/common/back.gif
问一下
你那些用 RS485 送出的 8 bytes 是连接到啥 ?
那个是输出给一个RS485的继电器开关的
布列松 发表于 2015-4-13 22:59 static/image/common/back.gif
那个是输出给一个RS485的继电器开关的
但是你的 Serial 不是 .print 到串口監視器
你同時把 pin 0, pin 1 連接到继电器开关 ?
這樣 .write 那 8 char 時, 串口監視器不是會出現亂碼 ?
tsaiwn 发表于 2015-4-13 23:05 static/image/common/back.gif
但是你的 Serial 不是 .print 到串口監視器
你同時把 pin 0, pin 1 連接到继电器开关 ?
這樣 .write 那 ...
是会乱码但是,对效果无影响,我用串口接上一个“TTL转RS485模块”然后再到RS485那里
tsaiwn 发表于 2015-4-13 23:05 static/image/common/back.gif
但是你的 Serial 不是 .print 到串口監視器
你同時把 pin 0, pin 1 連接到继电器开关 ?
這樣 .write 那 ...
有两个问题,那个刷新可能不太好,我用nano板 好像会死机,但是在不自动刷新的情况下也会死机,