Почему останавливается Arduino с запуском примерно через 1 неделю? #ethernet #webrequest
Это для небольшой домашней системы автоматизации. У меня есть Arduino Uno с сетевым экраном. Этот arduino обрабатывает запрос, поступающий с другого сайта, и устанавливает высокий пин-код на 1,5 секунды. тогда наши ворота или забор открывается или закрывается.
Эта система прекрасно работает в течение примерно одной недели. тогда я должен вручную сбросить Arduino, и он работает еще неделю.
Код:
#include <SPI.h>
#include <Ethernet.h>
// Enter a MAC address and IP address for your controller below.
// The IP address will be dependent on your local network:
byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEE };
IPAddress ip(192,168,1,54);
// Initialize the Ethernet server library
// with the IP address and port you want to use
// (port 80 is default for HTTP):
EthernetServer server(8080);
//variables for clicking
bool gateClick = false;
bool fenceClick = false;
long time = 0;
boolean isBusy = false;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
// start the Ethernet connection and the server:
Ethernet.begin(mac, ip);
server.begin();
pinMode(6, OUTPUT);
pinMode(7, OUTPUT);
Serial.print("server is at ");
Serial.println(Ethernet.localIP());
}
void loop() {
// listen for incoming clients
EthernetClient client = server.available();
if (client) {
Serial.println("new client");
// an http request ends with a blank line
boolean newData = false;
String request = "";
while (client.connected()) {
while (client.available()) {
char c = client.read();
Serial.write(c);
request += c;
newData = true;
}
if (newData) {
// send a standard http response header
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/plain");
client.println("Connection: close"); // the connection will be closed after completion of the response
//client.println("Refresh: 5"); // refresh the page automatically every 5 sec
client.println("Access-Control-Allow-Origin: *");
client.println();
client.println("<!DOCTYPE HTML>");
client.println("<html>");
//Request is always: "value(abc)?".
// a is always 2,
// b: 1 = fence, 2 = gate,
// c: 0 of 1 open of close, regular push button, not important
if (request.indexOf("value(210)?") != -1 || request.indexOf("value(211)?") != -1)
{
client.println("Ok");
fenceClick = true;
}
else if (request.indexOf("value(220)?") != -1 || request.indexOf("value(220)?") != -1)
{
client.println("Ok");
gateClick = true;
}
else
{
client.println("not in use");
}
client.println("</html>");
newData = false;
break;
}
}
// give the web browser time to receive the data
delay(1);
// close the connection:
client.stop();
Serial.println("client disonnected");
}
//setting pin high or low
//There only can be one pin high at the same time, hardware requires that
//when any pin is high
if(isBusy == true)
{
//when any pin is high for more than 1500 millis, make it all low
if(millis() - time > 1500 || millis() - time <0)
{
digitalWrite(7, LOW);//gate
digitalWrite(6, LOW);//fence
Serial.println("All low");
isBusy = false;
}
}
else
//when all pins are low, check if there's any that must be high
{
if( gateClick == true)
{
digitalWrite(7, HIGH);
time = millis();
isBusy = true;
gateClick = false;
Serial.println("Gate high");
}
else if( fenceClick == true)
{
digitalWrite(6, HIGH);
time = millis();
isBusy = true;
fenceClick = false;
Serial.println("fence high");
}
}
}
1 ответ
Я решил проблему, удалив все "последовательные" линии. Похоже, что буфер заполнен и arduino останавливается. Это работает хорошо в течение нескольких месяцев.