Передача звука по сети

Тема в разделе "Arduino & Shields", создана пользователем atlo, 21 мар 2017.

  1. rkit

    rkit Гуру

    Для начала уберите из скетча лишний код. Зачем вам прием пакета там?
     
  2. atlo

    atlo Нерд

    Поправил, вот так стала вроде более стабильно работать,
    только при изменение массива char ReplyBuffer[100]; больше 100 начинает все равно зависать, если меньше 100 то вроде нормально



    Код (C++):
    #include <SPI.h>        
    #include <Ethernet.h>
    #include <EthernetUdp.h>      

    int microphonePin = A0; // выбор пина для входа от микрофона
    int microphoneValue = 0; // переменная для хранения значения от микрофона
    int i = 0; // для счетчика считывания аналоговых покозаний
    String str = "";

    // IP-адрес
    byte mac[] = {
      0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
    IPAddress ip(192, 168, 1, 33);
    unsigned int localPort = 8;      // локальный порт, который будем прослушивать
    // буферы для отправки данных
    char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // буфер, в котором будет храниться входящий пакет
    char  ReplyBuffer[100];       // строка, которая будет отсылаться обратно
    // Создаем экземпляр класса EthernetUDP, чтобы отправлять  пакеты через UDP:
    EthernetUDP Udp;
    void setup() {
       // Запускаем Ethernet и UDP:
      Ethernet.begin(mac,ip);
      Udp.begin(localPort);
      Serial.begin(9600);
      Serial.print("My IP address: ");
      Serial.print(Ethernet.localIP());
    }
    void loop() {
      // Если есть какие-либо доступные данные, считываем пакет:
      int packetSize = Udp.parsePacket();
      if(packetSize)
      {
       IPAddress remote = Udp.remoteIP();
         
       // Serial.println(packetBuffer);
        Serial.println (ReplyBuffer);
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
         // отправляем значение
        Udp.write(ReplyBuffer);
        Udp.endPacket();
        str="";
      }
      delay(10);
      mic();
    }
    // записываем данные в буфер(массив)
    void mic(){
      str= str+String(analogRead(microphonePin), DEC)+"|";
      if(str.length()==100){
        str.toCharArray(ReplyBuffer,100);
      }
    }
     
  3. atlo

    atlo Нерд

    Подскажите не пойму почему вешается ардуино когда идет обращение к ней по UDP
    Зависание происходит из-за очистки массива
    memset(&ReplyBuffer,0,sizeof(ReplyBuffer));

    Код (C++):
    #include <SPI.h>
    #include <Ethernet.h>
    #include <EthernetUdp.h>


    const int sampleWindow = 50; // Sample  (50 mS = 20Hz)
    unsigned int sample;


    int i = 0; // для счетчика считывания аналоговых покозаний
    String str = "";
    unsigned int localPort = 8;      // локальный порт, который будем прослушивать
    // буферы для отправки данных
    char packetBuffer[UDP_TX_PACKET_MAX_SIZE]; // буфер, в котором будет храниться входящий пакет
    char  ReplyBuffer[100];       // массив строка, которая будет отсылаться обратно
    // Создаем EthernetUDP, чтобы отправлять  пакеты через UDP:
    EthernetUDP Udp;

    // Enter a MAC address
    byte mac[] = {
      0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02
    };

    // Initialize the Ethernet client library
    EthernetClient client;

    void setup() {
      // Open serial
      Serial.begin(9600);

      // 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:
      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(".");
        Udp.begin(localPort); // открываем порт UDP
      }
      Serial.println();
     
    }

    void loop() {
      //опрос микрофона
      mic();
      // Если есть какие-либо доступные данные, считываем пакет:
      int packetSize = Udp.parsePacket();
      if(packetSize)
      {
       IPAddress remote = Udp.remoteIP();
    //Выводим ip b порт удал компа и данные массива
      // Serial.println(packetBuffer);
     //  Serial.println (Udp.remoteIP());
    //порт
      //  Serial.println (Udp.remotePort());
     //   Serial.println (ReplyBuffer);
        Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
         // отправляем значение
        Udp.write(ReplyBuffer);
        Udp.endPacket();
        //очистить строку и массив
    str="";
    // Если закомментить строку очистки массива то все работает, но массив не обновляется и данные отправляются одни и теже
    memset(&ReplyBuffer,0,sizeof(ReplyBuffer));  
       
      }
      delay(10);
    }



    void mic(){

    unsigned long startMillis= millis();  // Start
       unsigned int peakToPeak = 0;   // Максимальный уровень
       unsigned int signalMax = 0;
       unsigned int signalMin = 1024;
       // collect data for 50 mS
       while (millis() - startMillis < sampleWindow)
       {
          sample = analogRead(0);
          if (sample < 1024)  // Выкидывать ложные показания
          {
             if (sample > signalMax)
             {
                signalMax = sample;  // Сохранить только максимальные уровни
             }
             else if (sample < signalMin)
             {
                signalMin = sample;  // Сохранить только минимальные уровни
             }
          }
       }
       peakToPeak = signalMax - signalMin;  // max - min = peak-peak amplitude
      str= str+String(analogRead(peakToPeak), DEC)+":";

        if(str.length()==100){
        str.toCharArray(ReplyBuffer,100);
    //Serial.println(ReplyBuffer);
    // str="";
    // memset(&ReplyBuffer,0,sizeof(ReplyBuffer));
        }
        }



     
     
  4. rkit

    rkit Гуру

    Массив не надо очищать
     
  5. atlo

    atlo Нерд

    а как тогда мне данные обновлять, если я его не очищаю то данные постоянно одни и те же на удаленном ПК принемаются
     
  6. atlo

    atlo Нерд

    Передается одно и тоже значение
    348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391
    172.18.227.214
    348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391
    172.18.227.214
    348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391
    172.18.227.214
    348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391
    172.18.227.214
    348:369:353:350:377:426:353:364:392:367:347:366:330:399:362:373:390:357:321:389:391:363:362:347:391
     
  7. atlo

    atlo Нерд

    Это данные с микрофона если очищать массив, видно , что данные изменяются

    359:387:377:349:360:591:359:363:384:381:375:350:384:348:349:315:343:369:365:365:372:359:224:363:291
    385:367:378:376:248:352:348:390:366:342:400:306:354:345:368:416:364:330:344:354:359:347:586:336:353
    401:411:377:374:360:368:354:496:343:436:377:356:367:355:391:359:348:544:368:362:364:359:360:360:424
    376:346:393:322:406:356:258:374:370:376:330:355:370:359:341:383:386:301:324:365:356:336:351:345:340
    386:375:364:347:354:374:316:377:358:358:367:416:353:364:348:263:334:355:349:366:378:377:353:346:352
    355:366:361:379:345:379:387:362:336:358:344:337:351:366:362:350:354:375:363:380:359:358:332:344:374
    337:365:351:366:344:362:344:358:395:371:348:366:365:370:366:362:345:365:361:383:379:387:384:341:362
     
  8. rkit

    rkit Гуру

    Значит вы отправляете одни и те же данные.
     
  9. atlo

    atlo Нерд

    Подскажите тогда где у меня загвоздка?? Почему данные одни и те же

    Все спасибо, сам разобрался
     
    Последнее редактирование: 21 апр 2017
  10. Alexs13111987

    Alexs13111987 Нуб

    Нужна Ваша помощь в решении такого вопроса. Как исправили скетч?