Tudo bem? Se alguém souber como posso resolver este meu problema fico grato! Então vamos la:
Neste programa ao apertar o botão (via HTTP) gostaria que piscasse, no que montei somente esta piscando 6 vezes. Minha ideia seria que ele ficasse em loop ate interromper quando desejado.
#include <SPI.h> #include <Ethernet.h>
// MAC address for shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
EthernetServer server(80); // Using port 80
int led = 9; // LED attached to pin 7
int val = 0;
void setup() {
pinMode(led, OUTPUT); // Led set as an output
Ethernet.begin(mac); // Start the Ethernet shield
server.begin();
Serial.begin(9600); // Start serial communication
Serial.println("Server address:"); // Print server address
// (Arduino shield)
Serial.println(Ethernet.localIP());
}
void loop() {
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
String buffer = "";
while (client.connected()) {
if (client.available()) {
char c = client.read(); // Read from the Ethernet shield
buffer += c; // Add character to string buffer
// Client sent request, now waiting for response
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK"); // HTTP response
client.println("Content-Type: text/html");
client.println(); // HTML code
client.print("
<INPUT type="submit" name="status" value="OFF">");
client.print("");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
buffer = "";
}
else if (c == '\r') { // Command from webpage
// Did the on button get pressed
if (buffer.indexOf("GET /?status=ON") )
digitalWrite(led, LOW);
delay(500);
digitalWrite(led, HIGH);
delay(500);
/* // Did the off button get pressed
if (buffer.indexOf("GET /?status=OFF"))
digitalWrite(led, LOW);*/
}
else {
currentLineIsBlank = false;
}
}
}
client.stop(); // End server
Para ficar mais compreensível edita a tua mensagem anterior e coloca o teu programa entre um bloco de código. Basta colocar três acentos graves (`) seguidos antes e depois do código.
Quando detectas que o utilizador carrega num botão em vez de colocares o código para piscar o LED coloca uma variável de controlo. Depois, fora do bloco de processamento Ethernet, verifica essa variável de controlo e aí sim coloca o código para piscar o LED.
bool led_pisca = false;
void loop() {
EthernetClient client = server.available();
if (client) {
boolean currentLineIsBlank = true;
String buffer = "";
while (client.connected()) {
if (client.available()) {
char c = client.read(); // Read from the Ethernet shield
buffer += c; // Add character to string buffer
// Client sent request, now waiting for response
if (c == '\n' && currentLineIsBlank) {
client.println("HTTP/1.1 200 OK"); // HTTP response
client.println("Content-Type: text/html");
client.println(); // HTML code
client.print("<center><br><h1>Internet Controlled Led </h1><br><br><br><FORM>");
client.print("<P> <INPUT type=\"submit\" name=\"status\" value=\"ON\">");
client.print("<P> <INPUT type=\"submit\" name=\"status\" value=\"OFF\">");
client.print("</FORM></center>");
break;
}
if (c == '\n') {
currentLineIsBlank = true;
buffer = "";
}
else if (c == '\r') { // Command from webpage
// Did the on button get pressed
if (buffer.indexOf("GET /?status=ON") >= 0) {
//digitalWrite(led, HIGH);
led_pisca = true;
}
// Did the off button get pressed
if (buffer.indexOf("GET /?status=OFF") >= 0) {
digitalWrite(led, LOW);
led_pisca = false;
}
}
else {
currentLineIsBlank = false;
}
}
}
client.stop(); // End server
}
// Verifica a variavel de controlo para piscar o LED.
// Nota: usar a verificação de um timer ou contador em vez de usar
// a funcao delay() para evitar bloquear o código.
if (led_pisca) {
digitalWrite(led, LOW);
delay(100);
digitalWrite(led, HIGH);
delay(100);
}
}