Arduino + EthernetShield (непрерывная передача данных)

Тема в разделе "Arduino & Shields", создана пользователем denisov.dv, 21 май 2019.

  1. denisov.dv

    denisov.dv Нуб

    Здравствуйте, коллеги!

    Хочу написать скрипт, который непрерывно пересылает данные с аналоговых портов Arduino по Ethernet на нужный порт (в данном случае 5010).
    Подскажете, как изменить программный код ниже, чтобы данные "слались" постоянно?
    Подключаемая библиотека Ethernet2.h прилагается. Вообще за основу брал пример Web-Server'a отсюда (http://wiki.amperka.ru/продукты:ethernet-shield), только мне нужно чтобы данные слались не по запросу а постоянно, и не на http а просто по ethernet на заданные порт

    Код (C++):
    #include <SPI.h>
    #include <Ethernet2.h>
    // Задаем MAC-адрес и статический IP
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    IPAddress ip(192, 168, 88, 177);
    // устанавливаем порт 5010
    EthernetServer server(5010);
    void setup()
    {
      // запускаем сервер и выводим локальный IP адрес
      Ethernet.begin(mac, ip);
      server.begin();
    }

    void loop()
    {
      for (int analogChannel = 0; analogChannel < 6; analogChannel++) {
      int sensorReading = analogRead(analogChannel);
      Serial.print(analogChannel);
      Serial.print(sensorReading);
      delay(100);
      }
    }
     

    Вложения:

    • ethernet2.zip
      Размер файла:
      50,6 КБ
      Просмотров:
      21
  2. b707

    b707 Гуру

    "просто по эзернет" отсылать вы не сможете. В любом случае нужен какой-то протокол. HTTP - один из протоколов. Есть еще масса других - FTP, SMTP и тд
    Ответьте для начала на вопрос - что за программа будет принимать данные на противоположном конце канала?
     
  3. dmitron1036

    dmitron1036 Гик

    Есть подводный камень: канал может иметь различную пропускную способность в разное время. И данные не будут проходить. в остальном всё должно получиться.
     
  4. denisov.dv

    denisov.dv Нуб

    Программа на противоположной стороне очень специфична. Остановимся на том, что она при запуске открывает нужный порт (например 5010) и слушает данные, которые на него приходят. У меня есть скрипт на питоне, который шлет тестовые данные на этот порт - все работает. Но шлет он их по localhost.

    Хочу чтобы данные с Arduino по Ethernet слались на нужный порт. Ничего не выходит что-то. Даже просто не получается установить соединение с пк. Сейчас ковыряюсь вот с этим кодом (рассматриваю ардуину как клиента):
    Код (C++):
    /*
      Web client

    This sketch connects to a website (http://www.google.com)
    using an Arduino Wiznet Ethernet shield.

    Circuit:
    * Ethernet shield attached to pins 10, 11, 12, 13

    created 18 Dec 2009
    by David A. Mellis
    modified 9 Apr 2012
    by Tom Igoe, based on work by Adrian McEwen

    */


    #include <SPI.h>
    #include <Ethernet2.h>

    // MAC-адрес контроллера
    byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    // адрес запрашиваемого сервера
    char server[] = "192.168.88.170";
    // задаем статический IP-адрес
    // на тот случай, если у DHCP выдать IP-адрес не получится
    IPAddress ip(192, 168, 88, 177);
    // создаём клиента, который будет подключаться
    // к необходимому для нас серверу и порту
    // портом по умолчанию для HTTP является 80
    EthernetClient client;
    void setup()
    {
      // открываем последовательный порт
      Serial.begin(9600);
      // ждём, пока не откроется монитор последовательного порта
      // для того, чтобы отследить все события в программе
      while (!Serial) {
      }
      Serial.print("Serial init OK\r\n");
      // запускаем Ethernet-соединение:
        Ethernet.begin(mac, ip);

      // получаем  и выводим локальный IP адрес
      Serial.print("My IP address: ");
      Serial.println(Ethernet.localIP());
      // даем Ethernet 2 секунды на инициализацию
      delay(2000);
      Serial.println("connecting...");
      // если подключение установлено, сообщаем об этом на Serial-порт:
      if (client.connect(server, 5010)) {
        Serial.println("connected");
      } else {
        // если соединения с сервером нет, пишем об этом на Serial-порт:
        Serial.println("connection failed");
      }
    }
    void loop()
    {
      // если есть непрочитанные байты
      // принятые клиентом от удаленного сервера, с которым установлено соединение
      if (client.available()) {
        // считываем данные и печатаем в Serial-порт
        char c = client.read();
        Serial.print(c);
      }
      // если сервер отключился
      if (!client.connected()) {
        // печатаем об этом в Serial-порт
        Serial.println();
        Serial.println("disconnecting.");
        // останавливаем работу клиента
        client.stop();
        // останавливаем программу в бесконечном цикле
        while (1) {
        }
       }
      }
    Но все висит на том, что соединение просто не устанавливается с пк (информация из монитор-порта ардуины):
    -Serial init OK
    -My IP address: 192.168.88.177
    -connecting...
    -connection failed

    -disconnecting.


    Может быть для начала существует какая-то возможность через usb-интерфейс ардуины сразу передавать данные на localhost пк?
     
  5. Daniil

    Daniil Гуру

    Определите термин, который вы постоянно берёте в кавычки - "слать".
    Если я буду передавать сигнал от 0 до 10 В - пойдёт? Или импульсы с разным временем лог. уровня "1"?
    Я с езернотом не играл, но даже меня ставит в тупик такой запрос:
    и что такое "постоянно". Вы же понимаете, что время передачи одного пакета не мгновенно? Подготовить пакет тоже требуется время...