Arduino Ethernet Shield отключается через несколько секунд

Я использую довольно простой код, используя Arduino UNO и Ethernet Shield W5100. Задача состоит в том, чтобы подключить экран к серверу и, если он подключается, считывать показания с датчика (поворотного энкодера в моем случае), но через несколько секунд, примерно через 20-30 секунд, клиент отключается. Мой код приведен ниже, поэтому требуется помощь.

Мой Код

#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; //Настройка MAC-адреса

IPAddress server(192,168,8,118); //Установка IP-адреса сервера, т.е. этого компьютера
IPAddress ip(192,168,8,117); // Установка IP-адреса локальной карты 

EthernetClient client; //Установка объекта клиента

// Определения контактов Arduino
#define encoder0PinA 2 
#define encoder0PinB 3
#define encoder0Btn 4
//Определения глобальных переменных
int encoder0Pos = 0;
const float pi = 3.14;
const float R = 3.25;
const int N = 40;
float distance = 0;

//Настройка одноразовых процедур
void setup() {
  Serial.begin(9600);
  Ethernet.begin(mac, ip);
  delay(1000);
  pinMode(encoder0PinA, INPUT_PULLUP);
  pinMode(encoder0PinB, INPUT_PULLUP);
  pinMode(encoder0Btn, INPUT_PULLUP);

  //Настройка подключения сервера к Arduino Ehternet Shield
  if (client.connect(server,8888)) {
    Serial.println("connected");
    }else{
      Serial.println("Not connected");
   }
   attachInterrupt(0, doEncoder, CHANGE);
}

void loop() {
  

}
void doEncoder()
{
  if (client.connected()) 
  { 

    if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB))
      {
        encoder0Pos++;
      }
   else
    {
     encoder0Pos--;
    }
  /* The rotary encoder measures the number of the rotation but we have to convert the rotation into travelled distance. 
   * Travelled distance depends on the diameter of the wheel. Rotary encoder moves 40 steps in one complete rotation (360 degree). 
   * Steps per rotation depends on the rotary encoder which can be changed from 8 to 48, but in our case it is 40. 
   * Suppose N is the steps per rotation and R is the radius of wheel. therefore,
   * Travelled distance in one Rotation is = 2xπxR
   * Travelled distance in one Step is     = 2xπxR/N
   */
  distance = ((2*pi*R)/N) * encoder0Pos;
  Serial.print( distance);
  Serial.println("cm  ");
     }
    else{
      Serial.println("Client Disconnected...");
      }
  }

Спасибо

, 👍0

Обсуждение

не делайте Ethernet в прерывании, @Juraj

переместите свой код ISR в loop()... обновите только encoder0Pos и установите флаг внутри ISR... запустите код внутри loop(), если флаг установлен, а затем очистите флаг, @jsotola

Вы случайно не используете операционную систему MicroSoft, чтобы определить, включен ли Arduino Ethernet Shield или нет? Возможно, ситуация улучшилась (или нет), но однажды я потратил впустую часы, потому что ОС MicroSoft решила, что сетевое устройство, которое я тестировал, было плохим, и отключила его сеть и устройство, к которому оно было подключено, ничего не сказав. С тех пор я всегда пытался использовать операционные системы Linux при тестировании устройств Ethernet., @st2000

Я бы рекомендовал использовать библиотеку Encoder, прочитать ее в цикле () и отправить значение, если оно изменилось, @Juraj