• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос Реализация UDP между Ардуино и Компьютером.

Anton.M

New member
Всем Привет!
Собираю систему, которая будет регистрировать время события и передавать его в компьютер. Сейчас уперся уже в передачу данных, хочу реализовать это через UDP. Отправку данных с ардуино через esp8266 наладил, данные отображаются в программе на компьютере (через AT+CIPSEND), а вот устроить прием Ардуинкой команд и данных через +IPD у меня не получилось. Управление осуществляю через AT-команды.

Может кто-либо подсобить примером работы? Заранее спасибо!
 

Artur1985

New member
Сам занимаюсь аналогичным, но я только в начале пути, изучаю модуль ESP.

Если это одиночное подключение и IP и порты известны, то все просто. Пример - http://esp8266.ru/forum/threads/prozrachnyj-most-wifi-uart-na-esp2866.323/page-4, в примере ESP Wi-Fi клиент, при старте модуля подключается и создает соединение.

Еще, просто отправлял через сериал монитор, без автоматического подключения и создания соединения, но всегда знал IP и порт.
Создания соединение.
AT+CIPSTART="UDP","192.168.1.100",8888,8888,0

4-тый параметр это локальный порт UDP, IP для ESP устанавливал вручную
AT+CIPSTA_DEF="192.168.1.108","192.168.1.1","255.255.255.0"
Указываете в программе, которая шлет данные IP и этот порт и Ардуина получит данные.

И сама отправка, в 2 варианта, в основном сквозной и обычный, но через команду AT+CIPSEND, с +IPD не пользовался.
 

Anton.M

New member
Чтоб темы не плодить, продолжу тут
Не могу я так данные получить, что-то мешает... Причём и подключится адекватно не могу.
Имеются: Arduino Uno R3, ESP-201 и LCD KeyPad Shield.
Вот мой код:
Код:
#include <ESP8266wifi.h>
#include <SoftwareSerial.h>
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
SoftwareSerial dbgSerial(3, 2); /* RX:D3, TX:D2 */

int dataip;


void setup() {
{
  lcd.begin(16, 2);              // старт библиотеки дисплея
  Serial.begin(115200);
  Serial.setTimeout(5000);
  Serial.println("AT+RST"); // сброс и проверка, если модуль готов
  delay(1000);
  if(Serial.find("ready")) {
    lcd.print("WiFi is ready");
  }else{
    lcd.print("Module dosn't respond.");
    while(1);
  }
  delay(1000);
  Serial.println("AT+CIPMUX=0"); // установка в режим одиночного соединения
  delay(3000);
  Serial.println("AT+CWJAP=\"testWIFI\",\"pass123\""); // подключение к сети
  delay(5000);
  if(Serial.find("OK")) {
    lcd.print("                  ");
    lcd.setCursor(0,0);
    lcd.print("WiFi connected");
  }else{
    lcd.print("                  ");
    lcd.setCursor(0,0);
    lcd.print("Network dosn't connected.");
    while(1);
  }
  delay(5000);
  Serial.println("AT+CIPSTA=?"); // отобразить полученный от станции адрес
 
  char inChar[30] = "                              ";
  byte z = 0;
  while (Serial.available()) {
  inChar[z] = Serial.read();
  z++;
}
 
  lcd.print("            ");
  lcd.setCursor(0,0);
  lcd.print(z,DEC); //вывод ответа на дисплей
  lcd.setCursor(0,1);
  lcd.print(inChar);
}
}



void loop() {
  // put your main code here, to run repeatedly:

}
В итоге, у меня приходят лишь последние строки (AT+CIPSTA=?) и ответа так и не следует. UDP естественно тоже никак... Подскажите, спецы, что я не так делаю.......
 

Anton.M

New member
Подход у вас неперспективный: на AT прошивке и [inline]delay[/inline] стабильной работы очень трудно добиться
В каком векторе мне тогда двигаться? На Ардуине у меня стоит система высокоточного отсчета, и по идее, по событию, у меня время события должно уходить по UDP в компьютер. Через Serial, естественно, всё работало. Сейчас надо заменить провода на беспроводную связь....
 

Victor

Administrator
Команда форума
В каком векторе мне тогда двигаться?
Если совсем не хотите отказываться от Arduino UNO как устройства, то разработать собственный протокол обмена данными между Arduino UNO и ESP8266, в ESP8266 скетч будет из двух логических частей: прием от Arduino и отправка данных по WiFi куда вам нужно.
Более логичный вариант: использовать ESP8266 и как контроллер и как WiFi без Arduino UNO, тогда протокол обмена уже не нужен: берем данные и отправляем.

Но сначала вам нужно еще почитать и понять как все работает. Вы скетч свой заливали в Arduino UNO, а библиотеку [inline]ESP8266wifi.h[/inline] для ESP8266 использовали. Смысл этой библиотеки в том, что с помощью Arduino IDE и ESP8266 Community edition скетч заливается прямо в esp8266 и заменяет существующую в ней прошивку на свою, состоящую из вашего скетча и SDK. А Arduino, как устройство не используется вообще.
http://esp8266.ru/arduino-ide-esp8266/
 

Anton.M

New member
Ну, тут то все просто..
Надо вместо AT+CIPSTA=? писать AT+CIPSTA?
Не в этом дело было, ну да ладно.

Задача посложнее теперь. UDP поднялся, и сейчас проблема такова. Есть в параметрах такая штука как AT+CIPMODE, и у нее есть 2 режима - установить обычный режим, и установить сквозной (так называемый unvarnished transmission mode).

Включаю первый (обычный) режим - посылаю строчку в виде:
Код:
AT+CIPMODE=0
AT+CIPSEND=10
Module OK.
Все доходит до компьютера. С компьютера посылаю строчку "md1.start", в Ардуино приходит "+IPD,9:md1.start". Не тот формат что нужно....
9_qkB3dTRLQ[1].jpg


Включаю второй (сквозной режим). Отличается он тем, что указывать длину посылки не нужно, и оканчивается передача набором "+++".
Код:
AT+CIPMODE=1
AT+CIPSEND
Module OK.
И нифига не приходит. При этом, если пытаешься тоже самое проделать через монитор, он просто не вводит значения. Не появляется после ">" ничего....
Снимок.JPG

Но, если через UDP посылаешь строку на Ардуино, она отлично отображается без всякого лишнего мусора.
EGdeKTI1I5U[1].jpg

Вопрос - куда копать? Почему не уходят посылки в AT+CIPMODE=1?
Заранее спасибо за ответы....
 

fandy

Member
Так эха же нет, ничего в мониторе и не увидите.
Вопрос почему удаленный комп данные не получает..

Я использую TCP в прозрачном режиме. Там единственная проблема, ограничение TCP буфера 200 байт.
А так, пашет.
 
Сверху Снизу