Нужна помощь с передачей данных по ESP!

Тема в разделе "ESP8266, ESP32", создана пользователем crash777, 4 дек 2017.

  1. crash777

    crash777 Нуб

    Здравствуйте! Я бы хотел к вам обратиться за помощью! У меня сейчас стоит задача о прямой передаче данных между модулями ESP, вот уже долгое время никак не могу разобраться.
    Есть у меня 2 wifi модуля ESP12F и ESP07 (с внешней антенной).
    К модулю ESP12F я подсоединяю MPU6050 по I2C шине, реализую модуль в качестве клиента. ESP07 я реализовал в качестве сервера. Напрямую подключаюсь и пытаюсь передать данные с регистров MPU, но возникают трудности с самой передачей, или вообще ничего не передает, или медленно. Может подскажите как правильно реализовать? Совсем уже запутался. Быстро удается передавать только лишь уровень сигнала. Большое спасибо!

    (Иногда бывает что показывает нули по всем значениям, сбрасываю питание и выводятся уже нормальные данные с регистров)

    Код для клиента!

    Код (C++):
     #include<Wire.h>
    #include <EEPROM.h>
    #include <ESP8266WiFi.h>
      char*         TKDssid;            // Имя сервера (точки доступа)
      char*         TKDpassword;        // Пароль сервера (точки доступа)
      int             TKDServerPort  = 9001;
      IPAddress       TKDServer(192,168,4,1);
      WiFiClient      TKDClient;
    int MPU = 0x68;
    int16_t accResult[3], gyroResult[3];
    void setup()
    {
      Wire.begin();
      writeTo(MPU, 0x6B, 0);
      Serial.begin(115200);
    if(WiFi.status() == WL_CONNECTED)
        {
          WiFi.disconnect();
          WiFi.mode(WIFI_OFF);
          delay(50);
        }
        WiFi.mode(WIFI_STA);            // To Avoid Broadcasting An SSID
        WiFi.begin("TAKEONE", "");      // The SSID That We Want To Connect To
        CheckWiFiConnectivity();
        TKDRequest();
    }
    void loop()
    {
    GetAccelerometerReadings(accResult);
    GetGyroscopeReadings(gyroResult);
    /*Serial.print(gyroResult[0]);
    Serial.print('\t');
    Serial.print(gyroResult[1]);
    Serial.print('\t');
    Serial.print(gyroResult[2]);
    Serial.print('\t');
    Serial.print(accResult[0]);
    Serial.print('\t');
    Serial.print(accResult[1]);
    Serial.print('\t');
    Serial.print(accResult[2]);
    Serial.println();*/

    TKDClient.print(gyroResult[0]);
    TKDClient.print('\t');
    TKDClient.print(gyroResult[1]);
    TKDClient.print('\t');
    TKDClient.print(gyroResult[2]);
    TKDClient.print('\t');
    TKDClient.print(accResult[0]);
    TKDClient.print('\t');
    TKDClient.print(accResult[1]);
    TKDClient.print('\t');
    TKDClient.print(accResult[2]);
    TKDClient.print('\n');
    TKDClient.flush();
    }
    //====================================================================================
    void CheckWiFiConnectivity()
      {
        while(WiFi.status() != WL_CONNECTED)
        {
          for(int i=0; i < 10; i++)
          {
            delay(250);
            Serial.print(".");
          }
          Serial.println("");
        }
      }  
    //====================================================================================
      void TKDRequest()
      {
        // Сначала убедитесь, что вы отключены
        TKDClient.stop();
        // Если сообщение о успешном подключении отправлено
        if(TKDClient.connect(TKDServer, TKDServerPort))
        {
          Serial.println    ("Good connect!");
          TKDClient.println ("Good connect!");
        }
      }
    //====================================================================================
    //Function for writing a byte to an address on an I2C device
    void writeTo(byte device, byte toAddress, byte val) {
      Wire.beginTransmission(device);
      Wire.write(toAddress);    
      Wire.write(val);    
      Wire.endTransmission();
    }
    //Function for reading num bytes from addresses on an I2C device
    void readFrom(byte device, byte fromAddress, int num, byte result[]) {
      Wire.beginTransmission(device);
      Wire.write(fromAddress);
      Wire.endTransmission();
      Wire.requestFrom((int)device, num);
      int i = 0;
      while(Wire.available()) {
        result[i] = Wire.read();
        i++;
      }
    }
    //Function that reads the accelerometer readings
    void GetAccelerometerReadings(int16_t Result[])
    {
    byte buffer[6];
    readFrom(MPU, 0x3B, 6, buffer);
    Result[0] = (((int16_t)buffer[0]) << 8) | buffer[1];
    Result[1] = (((int16_t)buffer[2]) << 8) | buffer[3];
    Result[2] = (((int16_t)buffer[4]) << 8) | buffer[5];
    }
    //Function that reads gyroscope readings
    void GetGyroscopeReadings(int16_t Result[])
    {
    byte buffer[6];
    readFrom(MPU, 0x43, 6, buffer);
    Result[0] = (((int16_t)buffer[0]) << 8) | buffer[1];
    Result[1] = (((int16_t)buffer[2]) << 8) | buffer[3];
    Result[2] = (((int16_t)buffer[4]) << 8) | buffer[5];
    }
    Код для сервера.

    Код (C++):
    //-- Libraries Included --------------------------------------------------------------
      #include <ESP8266WiFi.h>
    //------------------------------------------------------------------------------------
    //------------------------------------------------------------------------------------
      // Authentication Variables
      char*       TKDssid;              // SERVER WIFI NAME
      char*       TKDpassword;          // SERVER PASSWORD
    //------------------------------------------------------------------------------------
      #define MAXSC 2           // МАКСИМАЛЬНОЕ ЧИСЛО КЛИЕНТОВ
      WiFiServer  TKDServer(9001);      // Номер порта сервера
      WiFiClient  TKDClient[MAXSC];     // Клиенты (устройства)
    //====================================================================================
    //БАЗОВЫЕ НАСТРОЙКИ ПЕРЕД ЗАПУСКОМ
    //====================================================================================
      void setup()
      {
        // Setting The Serial Port
        Serial.begin(115200);           // Computer Communication
     
     
        // Print Message Of MPU6050 Setting Progress
        Serial.println();
        Serial.println("MPU6050 ... Done");
        // Setting Up A Wifi Access Point
        SetWifi("TAKEONE", "");
      }
    //====================================================================================
    //ГЛАВНЫЙ ЦИКЛ ПРОГРАММЫ
    //====================================================================================
      void loop()
      {
        // Поиск доступных клиентов
        AvailableClients();
        // Поиск сообщений клиента
        AvailableMessage();
      }
    //====================================================================================
    //НАСТРОЙКА ТОЧКИ ДОСТУПА И СЕРВЕРА
    //====================================================================================
      void SetWifi(char* Name, char* Password)
      {
        // Останавливаем любой предыдущий вай-фай
        WiFi.disconnect();
        // Установка режима WI-FI в точку доступа
        WiFi.mode(WIFI_AP_STA);
        Serial.println("WIFI Mode : AccessPoint Station");
     
        // Имя и пароль точки доступа
        TKDssid      = Name;
        TKDpassword  = Password;
     
        // Запуск точки доступа
        WiFi.softAP(TKDssid, TKDpassword);
        Serial.println("WIFI < " + String(TKDssid) + " > ... Started");
     
        // Ждем 1 секунду
        delay(1000);
     
        // Получаем IP адрес сервера
        IPAddress IP = WiFi.softAPIP();
     
        // Выводим IP адрес сервера
        Serial.print("AccessPoint IP : ");
        Serial.println(IP);
        // Выводим MAC Address сервера
        Serial.print("AccessPoint MC : ");
        Serial.println(String(WiFi.softAPmacAddress()));
        // Запуск сервера
        TKDServer.begin();
        TKDServer.setNoDelay(true);
        Serial.println("Server Started");
      }
    //====================================================================================
    //ПОИСК КЛИЕНТОВ
    //====================================================================================
      void AvailableClients()
      {
        if (TKDServer.hasClient())
        {
       
          for(uint8_t i = 0; i < MAXSC; i++)
          {
            //Поиск свободного клиента
            if (!TKDClient[i] || !TKDClient[i].connected())
            {
              //Проверка прошлого клиента
              if(TKDClient[i])
              {
                TKDClient[i].stop();
              }
              // Проверка если клиенты подключены к серверу
              if(TKDClient[i] = TKDServer.available())
              {
                Serial.println("New Client: " + String(i));
              }
              // Продолжить сканирование
              continue;
            }
          }
       
          //no free/disconnected spot so reject
          WiFiClient TKDClient = TKDServer.available();
          TKDClient.stop();
        }
        else
        {
     
        }
      }
    //====================================================================================
    //ПОИСК СООБЩЕНИЙ ОТ КЛИЕНТОВ
    //====================================================================================
      void AvailableMessage()
      {
        //Проверка клиента на наличие данных!
        for(uint8_t i = 0; i < MAXSC; i++)
        {
          if (TKDClient[i] && TKDClient[i].connected() && TKDClient[i].available())
          {
              while(TKDClient[i].available())
              {
                String Message = TKDClient[i].readStringUntil('\r');
                TKDClient[i].flush();
                Serial.println("Client No " + String(i) + " - " + Message);
              }
          }
        }
      }
    //====================================================================================
     
  2. MihaNN52

    MihaNN52 Нерд

    у вас у клиента в лупе без пауз что то передает вы уверены что так надо?
     
  3. REMBOV

    REMBOV Воскреситель Матрёшек

    Согласен не надо