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

Вопрос Как напрямую передавать команды на Arduino

LightDiode

New member
Есть ESP8266-01 и arduino uno. Планирую делать управление движущимся обьектом(на ардуине). Так вот, как сделать подключение не через роутер, а напрямую Ноутбук - ESP. Задаю такой вопрос, так как для подключения к роутеру нужно будет каждый раз подключать вручную есп к роутерам, что не очень удобно на мой взгляд, плюс узнавать каждый раз ip присвоенный роутером.
Буду рад услышать любые предложения по решению данного вопроса, так как я еще много чего не знаю.
 

LightDiode

New member
Такой вопрос, программирование скетчем, и прошивка esp это же разные вещи?:rolleyes:
 

LightDiode

New member
Тогда следственный вопрос, если я хочу открывать точку доступа, и обрабатывать поступающие команды(посылать команды с ардуино), прошивки SDK 0.9.5 Хватит? Я подразумеваю, что я буду просто инициализацией ардуины стартовать точку доступа, и после просто отслеживать команды(и парсить их). Если где то ошибаюсь, поправьте)
 

Юрий Ботов

Moderator
Команда форума
Тогда следственный вопрос, если я хочу открывать точку доступа, и обрабатывать поступающие команды(посылать команды с ардуино), прошивки SDK 0.9.5 Хватит? Я подразумеваю, что я буду просто инициализацией ардуины стартовать точку доступа, и после просто отслеживать команды(и парсить их).
Должно хватить.
 

LightDiode

New member
Данный скетч не срабатывает должным образом, в чем проблема? Может есть способ лучше?
Код:
#include <SoftwareSerial.h>

#define SSID "ArduinoCar"
#define PASSWORD "88888888"

SoftwareSerial esp8266(10, 11);// RX, TX

void setup() {
  SetupESP();
}

void loop() {
}

void SetupESP()
{
  String cmd = "AT+CWSAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASSWORD;
  cmd+="\",11,0";
  esp8266.println(cmd);
  delay(10);
  esp8266.println("AT+CIPMUX=1");
  delay(10);
  esp8266.println("AT+CIPSERVER=1,8888");
  delay(10);
}
В видимости появляется сеть ARDUINO которую я запускал прежде(через COM порт). Может не нужно каждый раз настраивать плату как AP?
 
Последнее редактирование:

maks100

New member
Для себя решил поставленную автором задачу (управление со смартфона)
#include <AFMotor.h>

#include <EEPROM.h>

#include <Servo.h>



HardwareSerial & ESPport = Serial;
int echoPin = 10;
int trigPin = 2;
AF_DCMotor motor(1);


const int ledPin = 13;
const int ledPin12 = 12;
const int ledPin9 = 9;
const int ledPin3 = 3;
const int ledPin5 = 5;
const int ledPin6 = 6;
int ledState = HIGH;
int ledStatett = HIGH;
int ledState12 = HIGH;
int ledState9 = HIGH;
int ledState3 = HIGH;
int ledState5 = HIGH;
int ledState6 = HIGH;
#define BUFFER_SIZE 64
char buffer[BUFFER_SIZE];
String vklotkl;
String vklotkl12;
String vklotkl9;
String vklotk22;
int temp[10]; // переменная, которой будет присваиваться значения например с датчика температуры
int duration,cm,j=0;
void setup()
{
motor.setSpeed(200);
motor.run(RELEASE);
pinMode(ledPin, OUTPUT);
pinMode(ledPin12, OUTPUT);
pinMode(ledPin9, OUTPUT);
pinMode(ledPin3, OUTPUT);
ESPport.begin(115200); // ESP8266
clearSerialBuffer();
GetResponse("AT+RST",3400); // перезагрузка ESP
Serial.println(GetResponse("AT+CIOWRITE=0,1",3400)); //
GetResponse("AT+CWMODE=2",300); // режим клиента
GetResponse("AT+RST",3400); // перезагрузка ESP
GetResponse("AT+CSYSWDTENABLE",300); // сторож
GetResponse("AT+CWSAP=\"seto44ka\",\"12345678\",9,4",7000); //создаем сеть

GetResponse("AT+CIPMODE=0",300); // сквозной режим передачи данных.
GetResponse("AT+CIPMUX=1",300); // multiple connection.
GetResponse("AT+CIPSERVER=1,88", 300); // запускаем ТСР-сервер на 88-ом порту
GetResponse("AT+CIPSTO=3", 300); // таймаут сервера 3 сек
GetResponse("AT+CIFSR", 300); // узнаём адрес
digitalWrite(ledPin,ledState);
digitalWrite(ledPin12,ledState12);
digitalWrite(ledPin9,ledState9);
analogWrite(ledPin3,ledState3);
analogWrite(ledPin5,ledState5);
analogWrite(ledPin6,ledState6);

}
///////////////////основной цикл, принимает запрос от клиента///////////////////
void loop()
{
// int duration, cm;
/*
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58;
// temp=cm;*/


j++;


int ch_id, packet_len;
char *pb;
ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE);
if(strncmp(buffer, "+IPD,", 5)==0)
{
sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
otvet_klienty(ch_id);
if (packet_len > 0)
{
pb = buffer+5;
while(*pb!=':') pb++;
pb++;





switch (pb[5])
{


case 'a':
{ clearSerialBuffer();

if(ledState == LOW)
{
ledState = HIGH;
vklotkl = "VKL";
}

else
{
ledState = LOW;
vklotkl = "OTKL";
}
digitalWrite(ledPin, ledState);
break;
}

case 'z'://livo
{ clearSerialBuffer();

motor.setSpeed(255);
motor.run(FORWARD);

break;
}
case 'd': //prawo
{ clearSerialBuffer();

motor.setSpeed(255);
motor.run(FORWARD);

break;
}
case 'w'://pered
{ clearSerialBuffer();

motor.setSpeed(255);
motor.run(FORWARD);

break;
}

case 's': //nazat
{ clearSerialBuffer();
motor.setSpeed(255);
motor.run(BACKWARD);

break;
}


case 'q': //stop
{ clearSerialBuffer();
motor.setSpeed(1);
motor.run(RELEASE);

break;
}
case 'b': //zbros
{ clearSerialBuffer();
motor.run(RELEASE);

break;
}
default:
{ otvet_klienty(ch_id);}
// otvet_klienty(ch_id);


}
// otvet_klienty(ch_id);
}
clearBuffer();
}

}
//////////////////////формирование ответа клиенту////////////////////
void otvet_klienty(int ch_id)
{
String Header;
String data;
for (int k=0;k<10;k++)
{ //cm=eho();
cm=j;
data+=String(cm)+", " ; }

Header = "HTTP/1.1 200 OK\r\n";
Header += "Content-Type: text/html\r\n";
Header += "Connection: close\r\n";
String Content;
Content = "<html><body>";
/*Content += "<form action='a' method='GET'>D13 <input type='submit' value='VKL/OTKL'> " + vklotkl + "</form>";
Content += "<form action='b' method='GET'>D12 <input type='submit' value='VKL/OTKL'> " + vklotkl12 + "</form>";
Content += "<form action='c' method='GET'>D9 <input type='submit' value='VKL/OTKL'> " + vklotkl9 + "</form>";
Content += "<form action='w' method='GET'>WW </form>";
Content += "<form action='s' method='GET'>SS </form>";
Content += "<form action='q' method='GET'>QQ </form>"; */
// Content += "<br />Temp: " + String(cm) + " C"; // передача переменной cm
Content += "<br />Temp: " + data + " C";
Content += "</body></html>";
Header += "Content-Length: ";
Header += (int)(Content.length());
Header += "\r\n\r\n";
ESPport.print("AT+CIPSEND="); // ответ клиенту
ESPport.print(ch_id);
ESPport.print(",");
ESPport.println(Header.length()+Content.length());
delay(20);

if(ESPport.find(">"))
{
ESPport.print(Header);
ESPport.print(Content);
// delay(200);
}
}
/////////////////////отправка АТ-команд/////////////////////
String GetResponse(String AT_Command, int wait)
{
String tmpData;
ESPport.println(AT_Command);
delay(wait);
while (ESPport.available() >0 )
{
char c = ESPport.read();
tmpData += c;

if ( tmpData.indexOf(AT_Command) > -1 )
tmpData = "";
else
tmpData.trim();

}
return tmpData;
}
//////////////////////очистка ESPport////////////////////
void clearSerialBuffer(void)
{
while ( ESPport.available() > 0 )
{
ESPport.read();
}
}
////////////////////очистка буфера////////////////////////
void clearBuffer(void) {
for (int i =0;i<BUFFER_SIZE;i++ )
{
buffer=0;
}
}
////////////////////подключение к wifi/////////////////////
boolean connectWiFi(String NetworkSSID,String NetworkPASS)
{
String cmd = "AT+CWJAP=\"";
cmd += NetworkSSID;
cmd += "\",\"";
cmd += NetworkPASS;
cmd += "\"";
ESPport.println(cmd);
delay(6500);
}
int eho(void){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration / 58;
}
В Esp прошивка at024. Приложение для андроида в в виде джойстика написал На данный момент думаю как усовершенствовать Скетч так чтоб посылалась Ат команда с запросом подключен ли кто то, и если клиент был но отключился , принять действия (например машинка остановилась)
 
Последнее редактирование:

maks100

New member
Данный скетч не срабатывает должным образом, в чем проблема? Может есть способ лучше?
Код:
#include <SoftwareSerial.h>

#define SSID "ArduinoCar"
#define PASSWORD "88888888"

SoftwareSerial esp8266(10, 11);// RX, TX

void setup() {
  SetupESP();
}

void loop() {
}

void SetupESP()
{
  String cmd = "AT+CWSAP=\"";
  cmd+=SSID;
  cmd+="\",\"";
  cmd+=PASSWORD;
  cmd+="\",11,0";
  esp8266.println(cmd);
  delay(10);
  esp8266.println("AT+CIPMUX=1");
  delay(10);
  esp8266.println("AT+CIPSERVER=1,8888");
  delay(10);
}
В видимости появляется сеть ARDUINO которую я запускал прежде(через COM порт). Может не нужно каждый раз настраивать плату как AP?
Встречался с похожей проблемой. Просто поменял RX, TX местами. Прошивал используя уно (нету конвектора usb-ttl) а потом менял местами чтоб заработало.
 

LightDiode

New member
Для себя решил поставленную автором задачу (управление со смартфона)
#include <AFMotor.h>

#include <EEPROM.h>

#include <Servo.h>



HardwareSerial & ESPport = Serial;
int echoPin = 10;
int trigPin = 2;
AF_DCMotor motor(1);


const int ledPin = 13;
const int ledPin12 = 12;
const int ledPin9 = 9;
const int ledPin3 = 3;
const int ledPin5 = 5;
const int ledPin6 = 6;
int ledState = HIGH;
int ledStatett = HIGH;
int ledState12 = HIGH;
int ledState9 = HIGH;
int ledState3 = HIGH;
int ledState5 = HIGH;
int ledState6 = HIGH;
#define BUFFER_SIZE 64
char buffer[BUFFER_SIZE];
String vklotkl;
String vklotkl12;
String vklotkl9;
String vklotk22;
int temp[10]; // переменная, которой будет присваиваться значения например с датчика температуры
int duration,cm,j=0;
void setup()
{
motor.setSpeed(200);
motor.run(RELEASE);
pinMode(ledPin, OUTPUT);
pinMode(ledPin12, OUTPUT);
pinMode(ledPin9, OUTPUT);
pinMode(ledPin3, OUTPUT);
ESPport.begin(115200); // ESP8266
clearSerialBuffer();
GetResponse("AT+RST",3400); // перезагрузка ESP
Serial.println(GetResponse("AT+CIOWRITE=0,1",3400)); //
GetResponse("AT+CWMODE=2",300); // режим клиента
GetResponse("AT+RST",3400); // перезагрузка ESP
GetResponse("AT+CSYSWDTENABLE",300); // сторож
GetResponse("AT+CWSAP=\"seto44ka\",\"12345678\",9,4",7000); //создаем сеть

GetResponse("AT+CIPMODE=0",300); // сквозной режим передачи данных.
GetResponse("AT+CIPMUX=1",300); // multiple connection.
GetResponse("AT+CIPSERVER=1,88", 300); // запускаем ТСР-сервер на 88-ом порту
GetResponse("AT+CIPSTO=3", 300); // таймаут сервера 3 сек
GetResponse("AT+CIFSR", 300); // узнаём адрес
digitalWrite(ledPin,ledState);
digitalWrite(ledPin12,ledState12);
digitalWrite(ledPin9,ledState9);
analogWrite(ledPin3,ledState3);
analogWrite(ledPin5,ledState5);
analogWrite(ledPin6,ledState6);

}
///////////////////основной цикл, принимает запрос от клиента///////////////////
void loop()
{
// int duration, cm;
/*
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
cm = duration / 58;
// temp=cm;*/


j++;


int ch_id, packet_len;
char *pb;
ESPport.readBytesUntil('\n', buffer, BUFFER_SIZE);
if(strncmp(buffer, "+IPD,", 5)==0)
{
sscanf(buffer+5, "%d,%d", &ch_id, &packet_len);
otvet_klienty(ch_id);
if (packet_len > 0)
{
pb = buffer+5;
while(*pb!=':') pb++;
pb++;





switch (pb[5])
{


case 'a':
{ clearSerialBuffer();

if(ledState == LOW)
{
ledState = HIGH;
vklotkl = "VKL";
}

else
{
ledState = LOW;
vklotkl = "OTKL";
}
digitalWrite(ledPin, ledState);
break;
}

case 'z'://livo
{ clearSerialBuffer();

motor.setSpeed(255);
motor.run(FORWARD);

break;
}
case 'd': //prawo
{ clearSerialBuffer();

motor.setSpeed(255);
motor.run(FORWARD);

break;
}
case 'w'://pered
{ clearSerialBuffer();

motor.setSpeed(255);
motor.run(FORWARD);

break;
}

case 's': //nazat
{ clearSerialBuffer();
motor.setSpeed(255);
motor.run(BACKWARD);

break;
}


case 'q': //stop
{ clearSerialBuffer();
motor.setSpeed(1);
motor.run(RELEASE);

break;
}
case 'b': //zbros
{ clearSerialBuffer();
motor.run(RELEASE);

break;
}
default:
{ otvet_klienty(ch_id);}
// otvet_klienty(ch_id);


}
// otvet_klienty(ch_id);
}
clearBuffer();
}

}
//////////////////////формирование ответа клиенту////////////////////
void otvet_klienty(int ch_id)
{
String Header;
String data;
for (int k=0;k<10;k++)
{ //cm=eho();
cm=j;
data+=String(cm)+", " ; }

Header = "HTTP/1.1 200 OK\r\n";
Header += "Content-Type: text/html\r\n";
Header += "Connection: close\r\n";
String Content;
Content = "<html><body>";
/*Content += "<form action='a' method='GET'>D13 <input type='submit' value='VKL/OTKL'> " + vklotkl + "</form>";
Content += "<form action='b' method='GET'>D12 <input type='submit' value='VKL/OTKL'> " + vklotkl12 + "</form>";
Content += "<form action='c' method='GET'>D9 <input type='submit' value='VKL/OTKL'> " + vklotkl9 + "</form>";
Content += "<form action='w' method='GET'>WW </form>";
Content += "<form action='s' method='GET'>SS </form>";
Content += "<form action='q' method='GET'>QQ </form>"; */
// Content += "<br />Temp: " + String(cm) + " C";
Content += "<br />Temp: " + data + " C";
Content += "</body></html>";
Header += "Content-Length: ";
Header += (int)(Content.length());
Header += "\r\n\r\n";
ESPport.print("AT+CIPSEND="); // ответ клиенту
ESPport.print(ch_id);
ESPport.print(",");
ESPport.println(Header.length()+Content.length());
delay(20);

if(ESPport.find(">"))
{
ESPport.print(Header);
ESPport.print(Content);
// delay(200);
}
}
/////////////////////отправка АТ-команд/////////////////////
String GetResponse(String AT_Command, int wait)
{
String tmpData;
ESPport.println(AT_Command);
delay(wait);
while (ESPport.available() >0 )
{
char c = ESPport.read();
tmpData += c;

if ( tmpData.indexOf(AT_Command) > -1 )
tmpData = "";
else
tmpData.trim();

}
return tmpData;
}
//////////////////////очистка ESPport////////////////////
void clearSerialBuffer(void)
{
while ( ESPport.available() > 0 )
{
ESPport.read();
}
}
////////////////////очистка буфера////////////////////////
void clearBuffer(void) {
for (int i =0;i<BUFFER_SIZE;i++ )
{
buffer=0;
}
}
////////////////////подключение к wifi/////////////////////
boolean connectWiFi(String NetworkSSID,String NetworkPASS)
{
String cmd = "AT+CWJAP=\"";
cmd += NetworkSSID;
cmd += "\",\"";
cmd += NetworkPASS;
cmd += "\"";
ESPport.println(cmd);
delay(6500);
}
int eho(void){
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return duration / 58;
}
В Esp прошивка at024. Приложение для андроида в в виде джойстика написал На данный момент думаю как усовершенствовать Скетч так чтоб посылалась Ат команда с запросом подключен ли кто то, и если клиент был но отключился , принять действия (например машинка остановилась)
Очень интересно, и я премного благодарен за образец работы с платой, еще интересно узнать схему подключения платы к ардуино(самое интересное в какие разьемы идут RX, TX).
И еще одно, преймущество сторожевого режима? ибо прошивка которая уже установлена на первый взгляд отличается от вашей только данной функцией, необходимо ли все таки перепрошивать, или можно просто не включать сторожевой режим.
Еще раз благодарю)
 

maks100

New member
Очень интересно, и я премного благодарен за образец работы с платой, еще интересно узнать схему подключения платы к ардуино(самое интересное в какие разьемы идут RX, TX).
И еще одно, преймущество сторожевого режима? ибо прошивка которая уже установлена на первый взгляд отличается от вашей только данной функцией, необходимо ли все таки перепрошивать, или можно просто не включать сторожевой режим.
Еще раз благодарю)
Залить новую прошивку не помешает (на предыдущей например у меня было все не стабильно).
Cхема такая, только tx-rx поменяны местами и у меня уно. А насчет сторожевого сам не знаю зачем он нужен (просветите кто знает) был в изначальном скетче решил не удалять...
 

LightDiode

New member
Залить новую прошивку не помешает (на предыдущей например у меня было все не стабильно).
Cхема такая, только tx-rx поменяны местами и у меня уно. А насчет сторожевого сам не знаю зачем он нужен (просветите кто знает) был в изначальном скетче решил не удалять...
Еще раз спасибо, возник вопрос)
С прошивкой все не так просто, 0.24 не нашел, поэтому поставил(вернул, т.к. уже ставил) at0.21(т.к. самая популярная, отсюда делаю вывод что стабильная ;D), если можете скиньте прошивку.

Так вот, вопрос
-Как подключаться и передавать данные?
По логике вещей, когда ввожу в браузере(Все делаю с компа) 192.168.4.1, должно формировать страницу, чего не происходит.

Передавать данные(команды) я так понимаю должно таким образом, если через браузер: 192.168.4.1/a или 192.168.4.1/w например?
 

maks100

New member
Еще раз спасибо, возник вопрос)
С прошивкой все не так просто, 0.24 не нашел, поэтому поставил(вернул, т.к. уже ставил) at0.21(т.к. самая популярная, отсюда делаю вывод что стабильная ;D), если можете скиньте прошивку.

Так вот, вопрос
-Как подключаться и передавать данные?
По логике вещей, когда ввожу в браузере(Все делаю с компа) 192.168.4.1, должно формировать страницу, чего не происходит.

Передавать данные(команды) я так понимаю должно таким образом, если через браузер: 192.168.4.1/a или 192.168.4.1/w например?
в моем скетче 192.168.4.1:88/a
 

Вложения

LightDiode

New member
в моем скетче 192.168.4.1:88/a
Вот без понятия что не так делаю. Прошивку установил Вашу, после прошивки меняю местами rx, tx. Сеть вижу, подключится могу. А по адресу не переходит, команды не отправляет.
Пытался даже запустить под полностью вашим скетчем(Заккоментировал только строки с motor) эффект тот же. Кстати еще менял
Код:
void clearBuffer(void) {
for (int i =0;i<BUFFER_SIZE;i++ )
{
buffer=0;
}
}
на
Код:
...
buffer[i]=0;
...
ибо не пропускало.
Уже несколько раз перепрошивал, и делал все с начала.. Не знаю что делать уже(
Может есть у кого-нибудь идеи, советы?:(
 

maks100

New member
Вот без понятия что не так делаю. Прошивку установил Вашу, после прошивки меняю местами rx, tx. Сеть вижу, подключится могу. А по адресу не переходит, команды не отправляет.
Пытался даже запустить под полностью вашим скетчем(Заккоментировал только строки с motor) эффект тот же. Кстати еще менял
Код:
void clearBuffer(void) {
for (int i =0;i<BUFFER_SIZE;i++ )
{
buffer=0;
}
}
на
Код:
...
buffer[i]=0;
...
ибо не пропускало.
Уже несколько раз перепрошивал, и делал все с начала.. Не знаю что делать уже(
Может есть у кого-нибудь идеи, советы?:(
а имя сети такое же как в скетче?
 
Сверху Снизу