Устройство Arduino Ethernet W5100 перестает отвечать через несколько дней - PullRequest
0 голосов
/ 25 марта 2019

Я использую простой веб-сервер (статический IP) на основе примера веб-сервера по умолчанию, который иногда прерывается внешним входом (например, RFID-считывателем), который отправляет данные в качестве клиента на другой сервер в локальной сети изапуск сервера снова.устройство работает в течение нескольких дней, как предполагалось, но затем перестает отвечать на пин-вводы, при обращении к странице сервера, кажется, он снова включается (не уверен в этом), в противном случае я вынужден выполнить сброс вручную, когда это произойдет.

Может ли проблема быть в использовании последовательной печати (используемой на этапе отладки) без подключения последовательного монитора?

тестовый код:

/*

  This program will decode the wiegand data from a HID RFID Reader (or, theoretically,
  any other device that outputs weigand data).
  The Wiegand interface has two data lines, DATA0 and DATA1.  These lines are normally held
  high at 5V.  When a 0 is sent, DATA0 drops to 0V for a few us.  When a 1 is sent, DATA1 drops
  to 0V for a few us.  There is usually a few ms between the pulses.

  Your reader should have at least 4 connections (some readers have more).  Connect the Red wire
  to 5V.  Connect the black to ground.  Connect the green wire (DATA0) to Digital Pin 2 (INT0).
  Connect the white wire (DATA1) to Digital Pin 3 (INT1).  That's it!

  Operation is simple - each of the data lines are connected to hardware interrupt lines.  When
  one drops low, an interrupt routine is called and some bits are flipped.  After some time of
  of not receiving any bits, the Arduino will decode the data.

*/

#include <Ethernet.h>
#include <SPI.h>
#include <EEPROM.h>

#define MAX_BITS 100                 // max number of bits 
#define WEIGAND_WAIT_TIME  3000      // time to wait for another weigand pulse.  

unsigned char databits[MAX_BITS];    // stores all of the data bits
unsigned char bitCount;              // number of bits currently captured
unsigned char flagDone;              // goes low when data is currently being captured
unsigned int weigand_counter;        // countdown until we assume there are no more bits

unsigned long facilityCode = 0;      // decoded facility code
unsigned long cardCode = 0;          // decoded card code
byte tr = 0;                         //testing trigger

byte ship[4];                       //Home Center IP
byte wsip[4];                       //Web Server IP
int scene[100];                      //scene ID storage
//byte ptr = 0;                       //log pointer
byte ld = 0;                         //latest updated log
byte bc[20];                         //Wiegand bitCount log
unsigned long wd[20];                //Wiegand data log
String readString1;                  //IP buffer
String tempstr = "{\r\n\"value\":\"";
String PostData = "{\r\n\"value\":\"1\"\r\n}"; //JSON data to send

// interrupt that happens when INTO goes low (0 bit)-2
void ISR_INT0()
{
  Serial.print("0");   // uncomment this line to display raw binary
  bitCount++;
  flagDone = 0;
  weigand_counter = WEIGAND_WAIT_TIME;
  tr = 1;
}

// interrupt that happens when INT1 goes low (1 bit)
void ISR_INT1()
{
  Serial.print("1");   // uncomment this line to display raw binary
  if(bitCount<MAX_BITS)
  databits[bitCount] = 1;
  bitCount++;
  flagDone = 0;
  weigand_counter = WEIGAND_WAIT_TIME;
}

byte mac[] = {  0x00, 0xAB, 0xCB, 0xCD, 0xDE, 0x05 };

// byte ip[] = {192,168,4,101};
IPAddress ip(192, 168, 5, 211);

// byte gateway[] = {192,168,4,254};
// byte gateway[] = {192, 168, 5, 1};

// byte subnet[] = {255, 255, 255, 0};

// IPAddress server(192,168,4,100);
IPAddress sh(192, 168, 5, 65);

EthernetServer server(80); //server port arduino server will use
EthernetClient client;

char cnt1 = 0, cnt2 = 0;

void setup()
{
  //pinMode(13, OUTPUT);  // LED
  pinMode(2, INPUT_PULLUP);     // DATA0 (INT0)
  pinMode(3, INPUT_PULLUP);     // DATA1 (INT1)

  Serial.begin(9600);
  Serial.println("BioLite Net");
  attachInterrupt(0, ISR_INT0, FALLING);
  attachInterrupt(1, ISR_INT1, FALLING);
  // binds the ISR functions to the falling edge of INTO and INT1

  EEPROM.get(15, wsip);
  IPAddress ip(wsip[0], wsip[1], wsip[2], wsip[3]);
  net();
  delay(10);
  server.begin();
  Serial.print(F("Web server is at "));
  Serial.println(ip);
//  Serial.print(F("server is at "));
//  Serial.println(Ethernet.localIP());

  EEPROM.get(10, ship);
  IPAddress sh(ship[0], ship[1], ship[2], ship[3]);
  Serial.print(F("Home Center is at "));
  Serial.println(sh);

  Serial.println(F("stored scenes are :"));
  EEPROM.get(20, scene);
  for (byte i = 0; i < 10 ; i++)
  {
    for (byte j = 0; j < 10 ; j++)
    {
      Serial.print((10 * i) + j);
      Serial.print(" : ");
      Serial.print(scene[(10 * i) + j]);
      Serial.print(" ; ");
    }
    Serial.println();
  }
  EEPROM.get(310, bc);
  EEPROM.get(330, wd);
  EEPROM.get(305, ld);
  byte temp = ld;
  Serial.println(temp);
  for (byte i = 0; i < 10 ; i++)
  {
    for (byte j = 0; j < 2 ; j++)
    {
      Serial.print(bc[temp]);
      Serial.print(" : ");
      Serial.print(wd[temp], BIN);
      Serial.print(" ; ");
      if (temp == 0)
        temp = 20;
      temp--;      
    }
    Serial.println();
  }
  Serial.println();
 /* temp = 19;
  for (byte i = 0; i < 10 ; i++)
  {
    for (byte j = 0; j < 2 ; j++)
    {
      Serial.print(bc[temp]);
      Serial.print(" : ");
      Serial.print(wd[temp], BIN);
      Serial.print(" ; ");
      temp--;
      if (temp < 0)
        temp = 19;
    }
    Serial.println();
  }*/


  weigand_counter = WEIGAND_WAIT_TIME;
}

void loop()
{
  // This waits to make sure that there have been no more data pulses before processing data
  if (!flagDone) {
    if (--weigand_counter == 0)
      flagDone = 1;
  }

  // if we have bits and we the weigand counter went out
  if (bitCount > 0 && flagDone) {
    //if (tr == 1) {
    tr == 0; delay(3000);
    unsigned char i;

    Serial.println();

    if(bitCount>255) bitCount=255;

    EEPROM.get(305, ld);
    EEPROM.get(310, bc);
    EEPROM.get(330, wd);
    ld++;
    if (ld > 19)
      ld = 0;
    Serial.println(ld);
    //    ptr += 5;
    //    ld = (ptr - 310) / 5;
    bc[ld] = bitCount;
    wd[ld] = 0;
    for (i = 0; i < bitCount; i++)
    {
      Serial.print(databits[i]);
      wd[ld] <<= 1;
      wd[ld] |= databits[i];
    }
    EEPROM.put(305, ld);
    EEPROM.put(310, bc);
    EEPROM.put(330, wd);

    Serial.println();
    Serial.print("Read ");
    Serial.print(bitCount);
    Serial.print(" bits. ");

    // we will decode the bits differently depending on how many bits we have
    // see www.pagemac.com/azure/data_formats.php for mor info
    if (bitCount == 35)
    {
      // 35 bit HID Corporate 1000 format
      // facility code = bits 2 to 14
      for (i = 2; i < 14; i++)
      {
        facilityCode <<= 1;
        facilityCode |= databits[i];
      }

      // card code = bits 15 to 34
      for (i = 14; i < 34; i++)
      {
        cardCode <<= 1;
        cardCode |= databits[i];
      }

      printBits();
    }
    else if (bitCount == 37)
    {
      // HID 37 bit format H10304
      // facility code = bits 2 to 17
      for (i = 1; i < 17; i++)
      {
        facilityCode <<= 1;
        facilityCode |= databits[i];
      }

      // card code = bits 18 to 36
      for (i = 17; i < 36; i++)
      {
        cardCode <<= 1;
        cardCode |= databits[i];
      }

      printBits();
    }
    else if (bitCount == 34)
    {
      // HID 34 bit format N1002
      // facility code = bits 2 to 17
      for (i = 1; i < 17; i++)
      {
        facilityCode <<= 1;
        facilityCode |= databits[i];
      }

      // card code = bits 18 to 33
      for (i = 17; i < 33; i++)
      {
        cardCode <<= 1;
        cardCode |= databits[i];
      }

      printBits();
    }
    else if (bitCount == 26)
    {
      // standard 26 bit format H10301
      // facility code = bits 2 to 9
      for (i = 1; i < 9; i++)
      {
        facilityCode <<= 1;
        facilityCode |= databits[i];
      }

      // card code = bits 10 to 25
      for (i = 9; i < 25; i++)
      {
        cardCode <<= 1;
        cardCode |= databits[i];
      }

      printBits();
    }
    else if (bitCount == 11)
    {
      // older Magstripe 11 bit format
      // facility code = bits 6 to 9
      for (i = 5; i < 9; i++)
      {
        facilityCode <<= 1;
        facilityCode |= databits[i];
      }

      // card code = bits 1 to 5
      for (i = 0; i < 5; i++)
      {
        cardCode <<= 1;
        cardCode |= databits[i];
      }

      printBits();
    }
    else {
      // you can add other formats if you want!
      Serial.println("Unable to decode.");
    }

    EEPROM.get(10, ship);
    IPAddress sh(ship[0], ship[1], ship[2], ship[3]);
    EEPROM.get(20, scene);

    String tempstr = "{\r\n\"value\":\"";
    String PostData = "{\r\n\"value\":\"1\",\"invokeScenes\":true\r\n}"; //JSON data to send
    tempstr = tempstr + cardCode;
    PostData = tempstr + "\",\"invokeScenes\":true\r\n}";

    if (client.connect(sh, 80)) {
      client.print("GET /api/sceneControl?id=");
      client.print(scene[cardCode]);
      client.println("&action=start HTTP/1.1");
      auth(sh);
      Serial.print("Scene ");
      Serial.print(scene[cardCode]);
      Serial.println(" treggered");
  /*  }

    if (Ethernet.begin(mac) == 0) {
      Serial.println(F("Failed to configure Ethernet using DHCP"));
      delay(3000);
      Ethernet.begin(mac, ip);
      if (Ethernet.localIP() != ip)
      {
        Serial.println(F("Failed to configure Ethernet using static IP"));
        for (;;)
          ;
      }
    }
    if (!client.connected())client.stop();
    delay(1);

    if (client.connect(sh, 80)) {*/
      client.println("PUT /api/globalVariables/UID HTTP/1.1");
      auth(sh);
      Serial.print(cardCode);
      Serial.println(" registered");
    }


    //if (!client.connected())client.stop();
    while (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    //while (true);
  }



    // cleanup and get ready for the next card
    bitCount = 0;
    facilityCode = 0;
    cardCode = 0;
    for (i = 0; i < MAX_BITS; i++)
    {
      databits[i] = 0;
    }
    delay(10);
    net();
    delay(10);
    server.begin();
  }

  // Create a client connection
  EthernetClient nclient = server.available();
  if (nclient) {
    Serial.println(F("new client"));
    while (nclient.connected()) {
      if (nclient.available()) {
        /* char c = client.read();
          Serial.write(c);

          //read char by char HTTP request
          if (readString1.length() < 100) {

           //store characters to string
           readString1 += c;
          }*/
        readString1 = nclient.readStringUntil('\n');
        Serial.println(readString1);

        //if HTTP request has ended– 0x0D is Carriage Return \n ASCII
        // if (c == 0x0D) {
        nclient.println("HTTP/1.1 200 OK"); //send new page
        nclient.println("Content-Type: text/html");
        nclient.println();

        nclient.println(F("<HTML>"));
        nclient.println(F("<HEAD>"));
        nclient.println(F("<TITLE> Wegand to Home Center Configurator</TITLE>"));
        nclient.println(F("</HEAD>"));
        nclient.println(F("<BODY style=\"background-color:#F0F0FF; text-align: center;\">"));
        nclient.println(F("<br>"));
        nclient.println(F("<H1 style=\"color:LimeGreen;\">Wegand<span style=\"color:Teal;\">2</span><span style=\"color:Blue;\">HC</span></H1>"));
        // client.println(F("<hr>"));
        nclient.println(F("<br>"));

        //nclient.println(F("<a style=\"color:SteelBlue;background-color:White;padding: 5px;\" href=\"/?TEST\"\">TEST</a><br /><br />"));

        nclient.println(F("<form id=\"txt_form\" name=\"frmText\">"));
        nclient.println(F("<H2 style=\"color:Crimson;\"><b>Configurator</b></H2>"));
        nclient.println(F("<label style=\"color:DodgerBlue;\" for=\"code\">code : <input type=\"password\" id=\"code\" size=\"4\" maxlength=\"4\" value=\"0000\" /></label><br /><br />"));
        nclient.println(F("<label style=\"color:DodgerBlue;\" for=\"hcip\">Home Center IP : <input type=\"text\" id=\"hcip\" size=\"15\" minlength=\"15\" maxlength=\"15\" value=\""));
        if (ship[0] < 10)
        {
          nclient.print("00");
        }
        else if (ship[0] < 100)
        {
          nclient.print("0");
        }
        nclient.print(ship[0]);
        nclient.print(F("."));
        if (ship[1] < 10)
        {
          nclient.print("00");
        }
        else if (ship[1] < 100)
        {
          nclient.print("0");
        }
        nclient.print(ship[1]);
        nclient.print(F("."));
        if (ship[2] < 10)
        {
          nclient.print("00");
        }
        else if (ship[2] < 100)
        {
          nclient.print("0");
        }
        nclient.print(ship[2]);

        nclient.print(F("."));
        if (ship[3] < 10)
        {
          nclient.print("00");
        }
        else if (ship[3] < 100)
        {
          nclient.print("0");
        }
        nclient.print(ship[3]);
        nclient.println(F("\" required></label><br /><br />"));
        nclient.println(F("<label style=\"color:DodgerBlue;\" for=\"sip\">Web Server IP : <input type=\"text\" id=\"sip\" size=\"15\" minlength=\"15\" maxlength=\"15\" value=\""));
        if (wsip[0] < 10)
        {
          nclient.print("00");
        }
        else if (wsip[0] < 100)
        {
          nclient.print("0");
        }
        nclient.print(wsip[0]);
        nclient.print(F("."));
        if (wsip[1] < 10)
        {
          nclient.print("00");
        }
        else if (wsip[1] < 100)
        {
          nclient.print("0");
        }
        nclient.print(wsip[1]);
        nclient.print(F("."));
        if (wsip[2] < 10)
        {
          nclient.print("00");
        }
        else if (wsip[2] < 100)
        {
          nclient.print("0");
        }
        nclient.print(wsip[2]);

        nclient.print(F("."));
        if (wsip[3] < 10)
        {
          nclient.print("00");
        }
        else if (wsip[3] < 100)
        {
          nclient.print("0");
        }
        nclient.print(wsip[3]);
        nclient.println(F("\" readonly></label><br /><br />"));
        nclient.println(F("<label style=\"color:DodgerBlue;\" for=\"uid\">User ID : <input type=\"text\" id=\"uid\" size=\"2\" maxlength=\"2\" autocomplete=\"on\" value=\"00\" /></label><br /><br />"));
        nclient.println(F("<label style=\"color:DodgerBlue;\" for=\"sid\">Scene ID : <input type=\"text\" id=\"sid\" size=\"4\" maxlength=\"4\" autocomplete=\"on\" value=\"0000\" /></label><br /><br />"));
        nclient.println(F("<a style=\"color:SteelBlue;background-color:White;padding: 5px;\" href=\"\" onclick=\"this.href='/?'+document.getElementById('code').value+document.getElementById('uid').value+document.getElementById('sid').value+document.getElementById('hcip').value+document.getElementById('sip').value\" >EDIT</a>"));
        nclient.println(F("</form>"));

        nclient.println(F("</BODY>"));
        nclient.println(F("</HTML>"));

        delay(10);
        //stopping client
        nclient.stop();
        Serial.println(F("client disconnected"));

        if (readString1.indexOf("?1729") == 5 && readString1.indexOf("HTTP/1.1") == 47) //checks code
        {
          Serial.println(F("pwd match"));
          //  readString1.toCharArray(url, 25);
          Serial.println(readString1);
          byte ad = readString1.substring(10, 12).toInt();
          Serial.println(ad);
          if (ad > 0 && ad < 100) {
            scene[ad] = readString1.substring(12, 16).toInt();
            Serial.println(scene[ad]);
          }
          else
            Serial.println(F("invalid UID"));
          byte p = 16;
          for (byte i = 0; i < 4; i++) {
            ship[i] = readString1.substring(p, p + 3).toInt();
            p = p + 4;
          }
          p--;
          for (byte i = 0; i < 4; i++) {
            wsip[i] = readString1.substring(p, p + 3).toInt();
            p = p + 4;
          }
          EEPROM.put(10, ship);
          EEPROM.put(15, wsip);
          EEPROM.put(20, scene);
          delay(1500);
          EEPROM.get(10, ship);
          EEPROM.get(15, wsip);
          EEPROM.get(20, scene);
          //digitalWrite(5, HIGH);
          //delay(1500);
          //digitalWrite(5, LOW);
          Serial.println(F("Edited"));
        }

        //clearing string for next read
        readString1 = "";

        // }
      }
    }
  }

  switch (Ethernet.maintain())
  {
    case 1:
      //renewed fail
      Serial.println(F("Error: renewed fail"));
      break;

    case 2:
      //renewed success
      Serial.println(F("Renewed success"));

      //print your local IP address:
      Serial.print(F("server is at "));
      Serial.println(Ethernet.localIP());
      break;

    case 3:
      //rebind fail
      Serial.println(F("Error: rebind fail"));
      break;

    case 4:
      //rebind success
      Serial.println(F("Rebind success"));

      //print your local IP address:
      Serial.print(F("server is at "));
      Serial.println(Ethernet.localIP());
      break;

    default:
      //nothing happened
      break;

  }
}

void printBits()
{
  // I really hope you can figure out what this function does
  Serial.println();
  Serial.print("FC = ");
  Serial.print(facilityCode);
  Serial.print(", CC = ");
  Serial.println(cardCode);
}
void net()
{
  if (Ethernet.begin(mac) == 0) {
      Serial.println(F("Failed to configure Ethernet using DHCP"));
//      if (Ethernet.hardwareStatus() == EthernetNoHardware) {
//      Serial.println(F("Ethernet shield was not found.  Sorry, can't run without hardware. :("));
//    } else if (Ethernet.linkStatus() == LinkOFF) {
//      Serial.println(F("Ethernet cable is not connected."));
//    } else {
//      Serial.println(F("No idea why"));
//    }
      delay(3000);
      Ethernet.begin(mac, ip);
      if (Ethernet.localIP() != ip)
      {
        Serial.println(F("Failed to configure Ethernet using static IP"));
        for (;;)
          ;
      }
    }
    Serial.print(F("server is at "));
    Serial.println(Ethernet.localIP());
    ip = Ethernet.localIP();
    for (byte i = 0; i < 4; i++) {
            wsip[i] = ip[i];
          }
  EEPROM.put(15, wsip);
}
void auth(IPAddress sh)
{
  Serial.println(sh);
  client.print("Host: ");
  client.println(sh);
  client.println("Authorization: Basic YmVuc2U6Qmlnc");   //need to insert base 64 user:password
  client.print("Content-Length: ");
  client.println(PostData.length());
  client.println();
  client.println(PostData);
}
...