Проблемы с подключением ethernet shield к сети

Dymanski200
Offline
Зарегистрирован: 31.07.2018

Здравствуйте, удалось завести ethernet shield, успешно посылает http запросы на удалённый сервер и получает ответы. Но это только при подключении напрямую к компьютеру дома по патч корду (На windows 10 расшариваю интернет с 4g модема на ethernet ).
Но нужно подключить в учебном заведении. Подключаюсь к кабелю, который идёт по кабинету на один из компьютеров. Запросы не идут !
Проверяю процесс работы по Serial, и вся работа останавливается на инициализации Ethernet.begin(mac).
Попробовал принудительно указать ip, без использования DHCP - инициализация проходит, но запросы не выполняются.
Подскажите пожалуйста, что я делаю не так ? Спасибо

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Основной шлюз верно указан? Устройства в той же локальной сети доступны? Шлюз доступен? Где скетч? 

Dymanski200
Offline
Зарегистрирован: 31.07.2018

На компьютере, который находится в локальной сети, сделал ipconfig, взял первые 3 байта адреса и вставил в скетч, а 4 прописал рандомно. Пинг к устройствам локальной сети не проверял
Метод Setup:
 

const byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(172,16,84,127);

void setup() 
{
  pinMode(5, OUTPUT);   
  pinMode(6, OUTPUT);   
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  Serial.begin(9600);
  while (!Serial) continue;
  if (!Ethernet.begin(mac)) 
  {
    Serial.println(F("Ошибка инициализации ethernet!"));
    return;
  }
  /* Пробовал с ip
   Ethernet.begin(mac,ip);
   */
  dht.begin();
  delay(1000);
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Не вижу в скетче конфигурации сетевого интерфейса.

Dymanski200
Offline
Зарегистрирован: 31.07.2018

Не понял вас, вы про IP и MAC ?

Dymanski200
Offline
Зарегистрирован: 31.07.2018

Проще наверное кинуть весть скетч:
 

#include <DHT.h>
#include <DHT_U.h>
#include <ArduinoJson.h>
#include <SPI.h>
#include <Ethernet.h>

const String login = "Зал";
const String password = "qfasw";
const byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(172,16,84,127);
const char server[] = "testclimateapi.somee.com";
String firstCommand = "";
String secondCommand = "";
bool valueFlag = false;
bool statusFlag = false;
bool refreshOk = false;
float temperature; 
float humidity;
DHT dht(2, DHT11);

void sendValues()
{
  EthernetClient client;
  Serial.println(F("Метод sendValues()"));
  Serial.println(F("Подключение..."));
  client.setTimeout(10000);
  if (!client.connect(server, 80)) 
  {
    Serial.println(F("Подключение не установлено!"));
    valueFlag=false;
    client.flush();
    client.stop();
    return;
  }
  Serial.println(F("Подключено!"));
  Serial.println(F("Делаем запрос..."));
  String request = "";
  String data = "{\"Name\":\""+login+"\",\"Password\":\""+password+"\",\"Temperature\":"+(String)temperature+",\"Humidity\":"+(String)humidity+"}";
  Serial.println(data);
  request+="PUT /Rooms HTTP/1.1\r\n";
  request+="Host: testclimateapi.somee.com\r\n";
  request+="Content-Type: application/json\r\n";
  request+="Content-Length: "+(String)data.length()+"\r\n";
  request+="Connection: close\r\n\r\n";
  request+=data;
  client.print(request);
  if (client.println() == 0) 
  {
    Serial.println(F("Ошибка в отправлении запроса!"));
    valueFlag=false;
    client.flush();
    client.stop();
    return;
  }
  Serial.println(F("Запрос отправлен!"));
  Serial.println(F("Ждём ответ..."));
  char status[32] = {0};
  client.readBytesUntil('\r', status, sizeof(status));
  if (strcmp(status, "HTTP/1.1 200 OK") != 0) 
  {
    Serial.print(F("Неожиданный ответ: "));
    Serial.println(status);
    valueFlag=false;
    client.flush();
    client.stop();
    return;
  }
  Serial.println(F("Уcпешный ответ!"));

  char endOfHeaders[] = "\r\n\r\n";
  if (!client.find(endOfHeaders)) 
  {
    Serial.println(F("Ошибка в структуре ответа"));
    valueFlag = false;
    client.flush();
    client.stop();
    return;
  }
  const size_t capacity = 100;
  DynamicJsonDocument json(capacity);
  DeserializationError error = deserializeJson(json, client);
  if (error) 
  {
    Serial.print(F("Ошибка распаковки: "));
    Serial.println(error.f_str());
    valueFlag = false;
    client.flush();
    client.stop();
    return;
  }
  firstCommand = json["first"].as<char*>();
  secondCommand = json["second"].as<char*>();
  Serial.println(firstCommand);
  Serial.println(secondCommand);
  valueFlag = true;
  client.flush();
  client.stop();
  return;
}

  void changeStatus(int num, String value)
  {
  EthernetClient client;
  Serial.println(F("Метод changeStatus()"));
  Serial.println(F("Подключение..."));
  client.setTimeout(10000);
  if (!client.connect(server, 80)) 
  {
    Serial.println(F("Подключение не установлено!"));
    statusFlag=false;
    client.flush();
    client.stop();
    return;
  }
  Serial.println(F("Подключено!"));
  Serial.println(F("Делаем запрос..."));
  String request = "";
  String data = "{\"Name\":\""+login+"\",\"Password\":\""+password+"\",\"DeviceNum\":"+(String)num+",\"Launched\":"+(String)value+"}";
  Serial.println(data);
  
  request+="PUT /Devices/sendStatus HTTP/1.1\r\n";
  request+="Host: testclimateapi.somee.com\r\n";
  request+="Content-Type: application/json\r\n";
  request+="Content-Length: "+(String)data.length()+"\r\n";
  request+="Connection: close\r\n\r\n";
  request+=data;
  client.print(request);
  if (client.println() == 0) 
  {
    Serial.println(F("Ошибка в отправлении запроса!"));
    statusFlag=false;
    client.flush();
    client.stop();
    return;
  }
  Serial.println(F("Запрос отправлен!"));
  Serial.println(F("Ждём ответ..."));
  char status[32] = {0};
  client.readBytesUntil('\r', status, sizeof(status));
  if (strcmp(status, "HTTP/1.1 200 OK") != 0) 
  {
    Serial.print(F("Неожиданный ответ: "));
    Serial.println(status);
    statusFlag=false;
    client.flush();
    client.stop();
    return;
  }
  Serial.println(F("Уcпешный ответ!"));
  statusFlag=true;
  client.flush();
  client.stop();
}

void setup() 
{
  pinMode(5, OUTPUT);   
  pinMode(6, OUTPUT);   
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  Serial.begin(9600);
  while (!Serial) continue;
  if (!Ethernet.begin(mac)) 
  {
    Serial.println(F("Ошибка инициализации ethernet!"));
    return;
  }
  /*
   Ethernet.begin(mac,ip);
   */
  dht.begin();
  delay(1000);
}

void setPins()
{
  if(firstCommand=="on")
      {
        digitalWrite(5,LOW);
        changeStatus(0,"true");
      }
      if(firstCommand=="off")
      {
        digitalWrite(5,HIGH);
        changeStatus(0,"false");
      }
      if(secondCommand=="on")
      {
        digitalWrite(6,LOW);
        changeStatus(1,"true");
      }
      if(secondCommand=="off")
      {
        digitalWrite(6,HIGH);
        changeStatus(1,"false");
      }
}

void loop() 
{
  delay(30000);
  temperature = dht.readTemperature(); 
  humidity = dht.readHumidity(); 
  if (isnan(temperature) || isnan(humidity)) 
  {
    Serial.println("Ошибка чтения датчика");
    return;
  }
  for(byte i=0;i<10;i++)
  {
    sendValues();
    if(valueFlag==true)
    {
      valueFlag=false;
      setPins();
      if(statusFlag==true)
      {
        statusFlag=false;
        return;
      }
      return;
    }
  }
  Serial.println("Ошибка аутентификации");
  digitalWrite(5,HIGH);
  digitalWrite(6,HIGH);
  while(true)
  {
  }
}

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

может библиотеку посмотрите?  В ESP8266 это делается так:
 

 // Задайте свой статический IP-адрес
    IPAddress local_IP(192, 168, 1, 240);
    // Укажите IP-адрес шлюза
    IPAddress gateway(192, 168, 1, 1);
    IPAddress subnet(255, 255, 255, 0);
    IPAddress primaryDNS(8, 8, 8, 8);   // опционально
    IPAddress secondaryDNS(8, 8, 4, 4); // опционально


void setup()
{

  Serial.begin(115200);
   // Настраиваем статический IP-адрес сервера:
   if (!WiFi.config(local_IP, gateway, subnet, primaryDNS, secondaryDNS)) {
   Serial.println("STA Failed to configure");  //  "Не удалось задать статический IP-адрес"
   }

 

Dymanski200
Offline
Зарегистрирован: 31.07.2018

Спасибо за то, что тыкнули пальцем. Действительно есть перегрузка begin(), которая имеет намного больше параметров. Мне нужно научиться читать официальную документацию)
Короче, если не получается получить ip динамически, то нужно пытаться статический вбить ?

sadman41
Offline
Зарегистрирован: 19.10.2016

Нужно не гадать, а сделать ipconfig /all в учебном заведении.

Dymanski200
Offline
Зарегистрирован: 31.07.2018

Сделал ipconfig /all, сервер dhcp включен.
На arduino он возвращает ip 0.0.0.0
При статических настройках ip, шлюза, dns всё работает.
Почему dhcp возвращает 0.0.0.0 ?

sadman41
Offline
Зарегистрирован: 19.10.2016

https://arduinodiy.wordpress.com/2017/04/12/the-w5100-bug/ -> "Bug 2- The ‘510’ bug"

Или DHCP только по резервированным работает. Или...