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...");
}
}
Спасибо
@Tayyab Hussain, 👍0
Обсуждение0
Смотрите также:
- Разбор HTTP с аутентификацией в Arduino + Ethernet Shield
- связь между двумя arduino с помощью ENC28J60?
- Ethernet Shield не работает с TFT-экраном
- Ограничения подключения ко многим ардуино через Ethernet?
- DF Robot W5200 Ethernet Shield для Arduino Uno не работает?
- Ethernet Shield не подключается
- Сможет ли Arduino Uno считывать 3-кратные инкрементальные энкодеры?
- Какова работа pulseIn?
не делайте Ethernet в прерывании, @Juraj
переместите свой код ISR в
loop()
... обновите толькоencoder0Pos
и установите флаг внутри ISR... запустите код внутриloop()
, если флаг установлен, а затем очистите флаг, @jsotolaВы случайно не используете операционную систему MicroSoft, чтобы определить, включен ли Arduino Ethernet Shield или нет? Возможно, ситуация улучшилась (или нет), но однажды я потратил впустую часы, потому что ОС MicroSoft решила, что сетевое устройство, которое я тестировал, было плохим, и отключила его сеть и устройство, к которому оно было подключено, ничего не сказав. С тех пор я всегда пытался использовать операционные системы Linux при тестировании устройств Ethernet., @st2000
Я бы рекомендовал использовать библиотеку Encoder, прочитать ее в цикле () и отправить значение, если оно изменилось, @Juraj