Подключение Arduino ethernet shield (ip-адрес - 0.0.0.0)

Мне нужна помощь для подключения моего arduino uno R3 и ethernet-щита. У меня нет mac-адреса с моим щитом, поэтому я использую этот: байтовый mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

Контроллер Ethernet на экране Ethernet-это W5100, и я не использую SD-карту.

У меня есть модуль приемника, который принимает данные от передатчика, и я хочу сохранить их в базе данных, но есть проблема, связанная с подключением. Когда я печатаю Ethernet.localIP, я наблюдал только 0.0.0.0.

Это IP - адрес моего сервера локальной сети-char[] = "192.168.0.106"

Вы можете найти мой код ниже:

  #include <Wire.h> // use Wire library for protocol i2c (A4 = SDA & A5 = SCL)
  #include <VirtualWire.h> // use Virtual library for decode signal from Rx module
  #include <SPI.h>
  #include <Ethernet.h>


  EthernetClient client;
  byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; 
  char server[] = "192.168.0.106";

  int humidity=0;
  int temp=0;
  int pressure=0;
  char MsgReceived[21]; 


  void setup() 
  {
     Serial.begin(115200);
     Ethernet.begin(mac);

     Serial.println(Ethernet.localIP());

    // Bits per sec
    vw_setup(2000);
    // set pin for connect receiver module 
    vw_set_rx_pin(3);  
    // Start the receiver PLL running
    vw_rx_start();       

  }
  void loop()
  {    
  uint8_t buf[VW_MAX_MESSAGE_LEN];
  uint8_t buflen = VW_MAX_MESSAGE_LEN;
  //Taking the data from the control base
  if (vw_get_message(buf, &buflen)) 
  {
    int i;
    // Message with a good checksum received, dump it. 
    for (i = 0; i < buflen; i++)
    {            
      // Fill Msg Char array with corresponding 
      // chars from buffer.   
      MsgReceived[i] = char(buf[i]);
      //Serial.print(MsgReceived[i]);
    }

    sscanf(MsgReceived, "%d,%d,%d",&humidity, &temp,&pressure); // Converts a string to an array 
    lcd_display();
    memset( MsgReceived, 0, sizeof(MsgReceived));// This line is for reset the StringReceived

    Serial.print("Temperature = ");
    Serial.print(temp);
    Serial.println(" *C");
    Serial.print("Pressure = ");
    Serial.print(pressure);
    Serial.println(" Pa");
    Serial.print("humidity = ");
    Serial.print(humidity);
    Serial.println(" %");

if (client.connect(server, 80)) {
   Serial.println("CONNECTED");
   client.print( "GET /diplomna/Arduino/add_data.php?");
   client.print("temperature=");;
   client.print( temp);
   client.print("&&");
   client.print("humidity=");
// change this to a print rather than println
   client.print( humidity );
// add a leading space in this println
   client.println( " HTTP/1.1");
// add a second cr/lf here to denote end of header
   client.println();
   client.println( "Connection: close\r\n" );

   while(client.connected()) {
      while(client.available()) {
        char ch = client.read();
        Serial.write(ch);
      }
    }
   client.stop();
   Serial.println("DISCONNECTED");
   }
 else {
   // you didn't get a connection to the server:
   Serial.println("-> connection failed/n");
 }
   delay(10000);
  }
  } 

Вы можете найти вывод последовательного монитора ниже:

0.0.0.0 Температура = 26 *C Давление = 997 Па влажность = 57 % -> сбой подключения/n>

Я также попытался выполнить следующий пример кода (DhcpAddressPrinter), и результаты те же - 0.0.0.0

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

// Введите MAC - адрес вашего контроллера ниже.
// Более новые экраны Ethernet имеют MAC-адрес, напечатанный на наклейке на
byte mac[] = {
  0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02
};

// Инициализация клиентской библиотеки Ethernet
// с IP - адресом и портом сервера
// к которому вы хотите подключиться (порт 80 по умолчанию для HTTP):
EthernetClient client;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(9600);
  // this check is only needed on the Leonardo:
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }

  // start the Ethernet connection:
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    // no point in carrying on, so do nothing forevermore:
    for (;;)
      ;
  }
  // print your local IP address:
  printIPAddress();
}

void loop() {

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

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

      //print your local IP address:
      printIPAddress();
      break;

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

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

      //print your local IP address:
      printIPAddress();
      break;

    default:
      //nothing happened
      break;

  }
}

void printIPAddress()
{
  Serial.print("My IP address: ");
  for (byte thisByte = 0; thisByte < 4; thisByte++) {
    // print the value of each byte of the IP address:
    Serial.print(Ethernet.localIP()[thisByte], DEC);
    Serial.print(".");
  }

  Serial.println();
}

Выход последовательного монитора: Не удалось настроить Ethernet с помощью DHCP

Я также попытался установить ip-адрес экрана на 192.168.137.1 и сделал следующее обновление: Ethernet.begin(mac); ===> Ethernet.begin(mac,ip); Результаты те же самые.

Не могли бы вы, пожалуйста, помочь мне решить эту проблему. Заранее спасибо!

С уважением, СК

, 👍1

Обсуждение

Если вы не используете одно из периферийных устройств в своей программе, вам нужно будет явно отменить его выбор. Чтобы сделать это с помощью SD-карты, установите вывод 4 в качестве вывода и запишите на него высокое значение. https://store.arduino.cc/arduino-ethernet-shield-2, @Juraj

какие исследования вы провели? .... вы пробовали примерный скетч?, @jsotola

Как ваш экран Ethernet подключен к вашей сети? Из чего состоит ваша сеть?, @Majenko

Привет, Юрай, спасибо за отзыв. Я попробую это сделать сегодня., @Supreme

Привет, джстола, Да, я сделал повторное исследование. Я прочитал много темзы и просмотрел множество видеороликов, касающихся проблем, связанных с подключениями. У вас была возможность прочитать о моей проблеме, прежде чем комментировать ее? Там я объясняю, что попробовал примерный скетч, но результаты оказались не такими, как ожидалось., @Supreme

Привет, Майенко, Я использую прямой соединительный кабель для подключения экрана Ethernet к своему ноутбуку и использую сеть Wi-Fi. Я также использую xampp для создания виртуального хоста с портом 80., @Supreme

Также спрашивали по адресу: http://forum.arduino.cc/index.php?topic=552471 Если вы собираетесь это сделать, пожалуйста, будьте достаточно внимательны, чтобы добавить ссылки на другие места, которые вы разместили. Это позволит нам избежать пустой траты времени из-за дублирования усилий, а также поможет другим, у кого есть те же вопросы, найти ваш пост и получить всю необходимую информацию., @per1234

Привет, Пер, ты прав. Спасибо вам за комментарий., @Supreme

в моем случае был контакт SS, он был отключен., @Silviu Seico


2 ответа


Лучший ответ:

2

из комментариев: "Я использую прямой соединительный кабель для подключения экрана Ethernet к ноутбуку и пользуюсь сетью Wi-Fi. "

В этом-то и проблема. Подключитесь к маршрутизатору.

Для прямого подключения Ethernet может потребоваться использование перекрестного кабеля, а на ПК, вероятно, нет DHCP-сервера для интерфейса Ethernet, поэтому вам следует установить IP-адрес для сетевого интерфейса и в скетче Arduino.

смотрите этот вопрос SO

,

Привет, Юрай, ты прав. Я подключил ethernet к маршрутизатору, и теперь пример scratch работает., @Supreme


1

Первое, что вам следует сделать, это отключить или отключить все устройства от Arduino, кроме сетевой карты, а затем снова запустить тесты, если они работают (в чем я сомневаюсь), то проблема заключается в столкновении аппаратных ресурсов, для чего вам нужно будет прочитать спецификации.

Я подозреваю, что проблема, с которой вы столкнулись, более фундаментальна: у вас есть DHCP-сервер в вашей сети?

В первом примере конкретно не упоминается DHCP, но во втором примере выполняется тот же вызов top Ethernet.begin() и, похоже, ожидается, что вызов настроил сетевой адаптер через DHCP.

Поэтому я бы посоветовал взглянуть на API для сетевой карты и посмотреть, что вам нужно сделать, чтобы статически настроить параметры IPv4. Кроме того, вам, возможно, придется отказаться от адресов IPv4 и сетевых масок, потому что адреса, которые вы упомянули, не смогут обмениваться данными, если у вас нет специального механизма маршрутизации (возможно, я неправильно прочитал вопрос).

Надеюсь, это поможет.

,