Передача данных по WI-FI

SergSV
Offline
Зарегистрирован: 17.11.2015

Есть два модуля ESP8266.  Соеденил их между собой по WI-FI. Но вот не как не разберусь как передать данные с одного модуля на другой. Задача передать данные с датчиков с одногомодуля на другой. Делал при помощи AT команд на прошивках которые идут с модулями все работает. Но в Arduino запутался и уперся в стену.

Нашел что есть такие команды. Посмотрите правильно ли я понял их синтаксис написания.

udp.beginPacketMulticast(addr, port, WiFi.localIP()) эу пишем в передающем модуле

addr - это  IP адрес принимающего модуля

port - открытый порт

WiFi.localIP() - IP модуля передающего данные

 

udp.beginMulticast(WiFi.localIP(), multicast_ip_addr, port) - эту пише в принимающем модуле.

WiFi.localIP() - IP модуля принимающего

multicast_ip_addr - IP адрес откуда принимаем

port - открытый порт

Этими командами мы настравиваем прием и передачу, а вот как передавать , какими командами?

Т.к должно же быть указанно откуда эти данные брать.

Как указывается конец передачи ? Этого я не смог найти. И где можно более подробно прочитать про команды передачи данных иодуля ESP8266 по WI-FI.

 

SergSV
Offline
Зарегистрирован: 17.11.2015

Накидал вот такой код в принимающем модуле:

#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

//********************************Изменить для себя ***********
#define AP_SSID                  "name"        // Логин к вашему WiFi(кавычки оставить)
#define AP_PASS                  "password"   //Пароль у вашему WiFi 
#define TIMEZONE 3                                // Часовой пояс
const char* SSIDDAT = "Datchik";                  // имя сети к которой будет подключаться втророй модуль изменить на желаемую
const char* PASSSIDDAT = "oPeNseT1";              // пароль сети к которой будет подключаться втророй модуль изменить на желаемый
//*************************************************************
char packetBuffer[255];                    //buffer to hold incoming packet
char ReplyBuffer[] = "acknowledged";       // a string to send back
char ssid[] = "";  
char pass[] = "";      
const char* error = "E0_";  

unsigned int  localPort = 2590;      // local port to listen for UDP packets
const int byte_am2321 = 10; 
byte packet_am2321[ byte_am2321];
WiFiUDP Udp;

void setup()
{
   Serial.begin(9600);
   delay(1000);
   WiFi.mode( WIFI_AP_STA);             // режим точки и клиента
   WiFi.softAP( SSIDDAT,PASSSIDDAT);
   
// Соединение с WiFi   
 
   if( !ConnectWiFi(AP_SSID,AP_PASS) )
   {
        error = "E1_";   // неудачное подключение WiFi
       
   }
  else
       error = "E2_";   // удачное подключение WiFi 
       
   Serial.print('A');                 // _ означает начало строки с данными        
&nbsp;&nbsp;&nbsp; Serial.print(error);              // выдача в порт информации об ошибке   
   delay(1000);
   Udp.begin(localPort);
}


//###########################################
// Основная программа
void loop()
{  
   
    int packetSize = Udp.parsePacket();
    if (packetSize) {
    Serial.print("Received packet of size ");
    Serial.println(packetSize);
    Serial.print("From ");
    IPAddress remoteIp = Udp.remoteIP();
    Serial.print(remoteIp);
    Serial.print(", port ");
    Serial.println(Udp.remotePort());

    // чтение пакета
    int len = Udp.read(packetBuffer, 255);
    if (len > 0) {
      packetBuffer[len] = 0;
    }
    Serial.println("Contents:");
    Serial.println(packetBuffer);

    // отправка принятого пакета
    Udp.beginPacket(Udp.remoteIP(), Udp.remotePort());
    Udp.write(ReplyBuffer);
    Udp.endPacket();
  }
 
}
   
//####################################
/**
 * Соединение с WiFi
 */
bool ConnectWiFi(const char *ssid, const char *pass) 
{
// Три попытки соединения по WiFi
   for( int i=0; i<3; i++)
   {
      WiFi.begin(ssid,pass);
      delay(1000);
// Максиммум 5 раз проверка соединения       
      for( int j=0; j<5; j++ )
      {
          if (WiFi.status() == WL_CONNECTED) 
          { 
              return true; 
          } 
          delay(1000);  
      }
   } 
return false;
   
} 








И такой код для передающего модуля. Этот модуль читает данные с датчика AM2321 и должен отправлять на второй модуль ESP8266


#include <AM2321.h>
#include <Weather.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

//********************************Изменить для себя ***********
#define AP_SSID                  "Datchik"//"Datchik"        // Логин к вашему WiFi(кавычки оставить)
#define AP_PASS                  "oPeNseT1"//"oPeNseT1"   //Пароль у вашему WiFi 

//*********************************************************
unsigned int  localPort = 2590; 
char ssid[] = "";  
char pass[] = "";      
const char* error = "E0_";
const char* buffer_data ="";
const int NTP_PACKET_SIZE = 48; 
byte packetBuffer[ NTP_PACKET_SIZE];
IPAddress ip_test (192, 168, 4, 1);
WiFiUDP Udp;

void setup()
{
   Wire.begin(); // подключение к шине i2c
   Serial.begin(9600);  // запуск последовательного порта
   
  
   WiFi.mode( WIFI_AP_STA);
//   WiFi.mode( WIFI_STA);             // режим клиента
//   WiFi.softAP( SSIDDAT,PASSSIDDAT);
   // Соединение с WiFi   
 
   if( !ConnectWiFi(AP_SSID,AP_PASS) )
   {
        error = "E1_";   // неудачное подключение WiFi
       
   }
  else
       error = "E2_";   // удачное подключение WiFi 
           
   Serial.print("\r\n A");        // А - начало строки, _ означает конец строки с данными        
   Serial.print(error);           // выдача в порт информации об ошибке   
   Udp.begin(localPort);          // открываем порт
   
}


void loop()
{
    AM2321 th;
    th.read();
   
    if (Udp.beginPacket(ip_test, localPort))  //устанавливаем соединение с удаленным устройством
    {
      Serial.println ("IP OK");
    }
    else 
    Serial.println ("IP Error");
    
    Udp.write(th.temperature);            // отправляем температуру
    Udp.endPacket();
    
    Udp.beginPacket(ip_test, localPort);
    Udp.write(th.humidity);                // отправляем твлажность
    Udp.endPacket();
    Udp.stop();            //Разрывает соединение с сервером, освобождая все ресурсы, используемые во время UDP-сессии.

    Serial.print("Temp:  ");

    Serial.print(th.temperature/10.0);  // температура

    Serial.print(",Vlaga: " );

    Serial.print(th.humidity/10.0); // Влажность
    
    Serial.print ("\r\n");
    ESP.deepSleep(900*1000000,WAKE_RFCAL); // время сна 30 минут
   
}

//######################################
/**
 * Соединение с WiFi
 */
bool ConnectWiFi(const char *ssid, const char *pass) 
{
// Три попытки соединения по WiFi
   for( int i=0; i<3; i++)
   {
      WiFi.begin(ssid,pass);
 //    delay(1000);
// Максиммум 20 раз проверка соединения       
      for( int j=0; j<10; j++ )
      {
          if (WiFi.status() == WL_CONNECTED) 
          { 
              return true; 
          } 
          delay(500);
         
      }
   } 
return false; 
} 

 

Проблема в том что в передающем модуле какой бы я не задал IP адрес всегда пишет что "IP OK". При задании правильного адреса данные не приходят на второй модуль. Второй модуль соответственно молчит т.к нет принимаемых данных. Подскажите где я напортачил ?

SergSV
Offline
Зарегистрирован: 17.11.2015

Решил проблему.

Первому модулю принудительно назначил IP адрес. Во втором модуле добавил небольшую задержку . Без нее данные не успевали отправиться и модуль засыпал.

Код для второго модуля получился такой:


#include <AM2321.h>
#include <Weather.h>
#include <Wire.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>

//********************************Изменить для себя *******************************************************
#define AP_SSID                  "Datchik"//"Datchik"        // Логин к вашему WiFi(кавычки оставить)
#define AP_PASS                  "oPeNseT1"//"oPeNseT1"   //Пароль у вашему WiFi  
//*********************************************************************************************************
unsigned int  localPort = 2590; 
char ssid[] = "";  
char pass[] = "";      
const char* error = "E0_";
const char* buffer_data ="";
const int NTP_PACKET_SIZE = 48; 
byte packetBuffer[ NTP_PACKET_SIZE];
IPAddress ip_test (192, 168, 1, 5);     // IP адрес первого модуля
WiFiUDP Udp;
void setup()
{
   Wire.begin(); // подключение к шине i2c
   Serial.begin(9600);  // запуск последовательного порта
   WiFi.mode( WIFI_STA);             // режим клиента

// Соединение с WiFi 
   if( !ConnectWiFi(AP_SSID,AP_PASS) )
   {
        error = "E1_";   // неудачное подключение WiFi
       
   }
  else
       error = "E2_";   // удачное подключение WiFi 
           
   Serial.print("\r\n A");        // А - начало строки, _ означает конец строки с данными        
   Serial.print(error);           // выдача в порт информации об ошибке   
   Udp.begin(localPort);          // открываем порт
   
}

void loop()
{
  
    AM2321 th;
    th.read();
    int temper=(th.temperature/10.0);   // отбрасываем дробную часть температуры
    int vlaga=(th.humidity/10.0);       // отбрасываем дробную часть влажности
    unsigned int packetSize = Udp.beginPacket(ip_test, localPort);
    if (packetSize)  //устанавливаем соединение с удаленным устройством
   {
    Serial.println ("IP OK");
    Udp.write("T"); 
    Udp.print(temper);
    Udp.write("V"); 
    Udp.print(vlaga);
    Udp.write("_");       // конец данных
    Udp.endPacket();
    Udp.stop(); 
    delay(10);
    }
    else 
    Serial.println ("IP Error");
 
    ESP.deepSleep(900*1000000,WAKE_RFCAL); // время сна 15 минут
}

/*########################################################
  Соединение с WiFi
 */
bool ConnectWiFi(const char *ssid, const char *pass) 
{
// Три попытки соединения по WiFi
   for( int i=0; i<3; i++)
   {
      WiFi.begin(ssid,pass);
 //    delay(1000);
// Максиммум 10 раз проверка соединения       
      for( int j=0; j<10; j++ )
      {
          if (WiFi.status() == WL_CONNECTED) 
          { 
              return true; 
          } 
          delay(500);
         
      }
   } 
return false; 
} 

 

AleksLux
Offline
Зарегистрирован: 23.04.2017

Спасибо познавательно. Скажите нет ли у вас случайно скетча, или этот доработать как то . чтоб один модуль ESP-12f Создавал сеть и в этой сети слушал подключенный терминал, или программу, получал от нее АТ комманды и отправлял в порт RX TX, и также наоборот с порта через свою сетку программе, или терминалу.

Turbo
Offline
Зарегистрирован: 25.10.2019

Добрый день!

Помогите создать проект передачи данных последовательное срабатывания датчиков с arduino wi-fi на андроид

Надо подключить три датчика движения к ардуино (программа): 1 датчик на вход, 2й-3й датчик на вход, 3й-2й датчик на выход.

Смотреть передачу информации с ардуино по мобильному приложению отчет за сутки сколько раз первый датчик сработал и сколько раз 2-3, 3-2

Если это возможно и что для этого нужно. Заранее спасибо.

Logik
Offline
Зарегистрирован: 05.08.2014

Нужен программист способный излагать мысли не по дибильному как у вас "1 датчик на вход, 2й-3й датчик на вход, 3й-2й датчик на выход." 

nik182
Онлайн
Зарегистрирован: 04.05.2015

Ой. Да ладно. Пообщаешся со студентами будешь такие задачки щелкать на раз. Хочет человек посчитать сколько раз моргнул первый датчик, сколько раз второй датчик моргнул на какое то время раньше третьего и тем самым обозначил проход и наоборот. Вот только как он будет разбирать ситуации прошёл второй датчик и остановился поговорить? Или вообще вернулся и третий 2 раза сработал а второй нет. Чую программа умельца на рог встанет.    

astwo
Offline
Зарегистрирован: 10.07.2019

Нужна пара сапог. Один на правый, второй тоже на правый. А третий, вот вы не угадали, на левый, патамушто правые больше изнашиваются.

Logik
Offline
Зарегистрирован: 05.08.2014

nik182 пишет:

Ой. Да ладно. Пообщаешся со студентами будешь такие задачки щелкать на раз. Хочет человек посчитать сколько раз моргнул первый датчик, сколько раз второй датчик моргнул на какое то время раньше третьего и тем самым обозначил проход и наоборот. Вот только как он будет разбирать ситуации прошёл второй датчик и остановился поговорить? Или вообще вернулся и третий 2 раза сработал а второй нет. Чую программа умельца на рог встанет.    

У Вас отличный пост, ход мысли от "щелкать на раз" до "программа умельца на рог встанет."  в 4-х строках )))

Пока чел сам не сможет понять и рассказать что он хочет - он ниче не напишет. Напишет ли потом - ХЗ. Но "3й-2й датчик на выход" - это невменяемо.

nik182
Онлайн
Зарегистрирован: 04.05.2015

Вот это и называется манипуляцией. С вести в одном предложении две разные сущности и сделать совершенно непонятный, но нравящийся себе вывод, никак не связанный с содержимым исходного материала. Про программу и задачу я писал в разных предложениях. Почему Вы их в одно тянете?  

Turbo
Offline
Зарегистрирован: 25.10.2019

Если вы такие умные, что же вы не задали какой нибудь вопрос по этому предложению или слабо заняться эти проектом.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Turbo пишет:

 или слабо заняться эти проектом.

а оно нам ннада?

Logik
Offline
Зарегистрирован: 05.08.2014

Turbo пишет:

Если вы такие умные, что же вы не задали какой нибудь вопрос ...

Не... Что толку спрашивать человека который не может мысли свои изложить. Я лучше у кота спрошу, он хоть глупостей не скажет.

Turbo
Offline
Зарегистрирован: 25.10.2019

Если не понимают русского языка о чем можно говорить. Я просил помочь разобраться, тем более не безвозмездно. Если кого заинтересует Я подробно опишу проект. 

nik182
Онлайн
Зарегистрирован: 04.05.2015

И на русском можно сказать так, что ничего не будет понятно. Вам лень расписать тех. задание. Те крохи что были написаны совешенно не понятны человеку не в теме. Я попытался разгадать, но Вы даже не подтвердили и не опровергли мои догадки. Я даже уточняющие вопросы задал. Ну и кто сам себе злобный буратино?

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

Разделом промахнулся. Тебе надо в платный раздел - Ищу исполнителя.