Arduino + ESP8266

Adeni
Offline
Зарегистрирован: 26.01.2014

ESP-07 на АТ прошивке подключен к ардуино через SoftwareSerial. С телефона через UDP отправляю команд, которые обрабатываю в ардуино. Вылезла непонятная проблема. После заливки скетча все работает как надо, данные ходят в обе стороны. Но стоит отключить ардуино от компьютера и подключить только внешнее питание, скетч висит. Опытным путем определил что висит на куске кода, принимающем и обрабатывающем входящие данные. Вот этот кусок кода:

  if ( espSerial.available()){
    while ( espSerial.available()){
      buff[i++] = espSerial.read();
      text2 = String(buff);
      text = text2.substring(text2.indexOf(":")+1,text2.indexOf("#"));
    } 
    command = text.substring(0,1);
    Data = text.substring(2,6);
    dat = atoi(text.substring(2,6).c_str());
  }

Если поменять этот код на: 

 if ( espSerial.available()){
    while ( espSerial.available()){
      Serial.write( espSerial.read() );
    } 

 }

То программа тоже не зависет. Подскажите, куда копать? Возможно такое поведение из-за использования SofwareSeral?

Radjah
Offline
Зарегистрирован: 06.08.2014

espSerial.available() > 0

Метод возвращает количество байт в буфере.

Adeni
Offline
Зарегистрирован: 26.01.2014
if ( espSerial.available() > 0){
  while ( espSerial.available()){
    buff[i++] = espSerial.read();
    text2 = String(buff);
    text = text2.substring(text2.indexOf(":")+1,text2.indexOf("#"));
  } 
  command = text.substring(0,1);
  Data = text.substring(2,6);
  dat = atoi(text.substring(2,6).c_str());
}

Указывал и так, эффекта 0.

Переключил на железный Seral1, проблема осталась, и теперь программа висит в любом случае ....

Radjah
Offline
Зарегистрирован: 06.08.2014

Строка 02.

И buff с помощью 0x00 терминируется?

Adeni
Offline
Зарегистрирован: 26.01.2014

Не совсем понял вопроса ..

Adeni
Offline
Зарегистрирован: 26.01.2014

Немного изменил скетч, но проблема по прежнему осталась

  char buff[100];
  int i = 0;
  if ( Serial1.available() > 0){
    while ( Serial1.available() && i< 99 ){
      buff[i++] = Serial1.read();
      text2 = String(buff);//.substring(String(buff).indexOf(":")+1,String(buff).indexOf("#"));
      text = text2.substring(text2.indexOf(":")+1,text2.indexOf("#"));
    } 

 

Radjah
Offline
Зарегистрирован: 06.08.2014
Alexino
Offline
Зарегистрирован: 29.12.2015

Причём тут скетчи, строки, куски кода, ... ? Автор, включите логическое мышление.

Вы меняете питание - начинается лажа. Очевидно же - проблема с питанием.

Adeni
Offline
Зарегистрирован: 26.01.2014

Radjah был прав, я не закрывал массив buff, подправил код, и все заработало. А питание тут ни при чем.

if ( espSerial.available() > 0){
    while ( espSerial.available()){
      buff[i++] = espSerial.read();
    }
    buff[i++] = '\0';
  }

 

urydep
Offline
Зарегистрирован: 14.04.2015

Здравствуйте. Я новичок в программировании, прошу помощи в переделке кода. Нашёл код, который является посредником между ардуино и esp8266. Данные отправляются через uart на mqtt брокер и принимаются от него. Как мне переделать код так, чтобы данные отправлялись с bmp180 и htu21 или посоветуйте похожий скетч. Заранее благодарен.

#include <SoftwareSerial.h>
// software serial #1: RX = digital pin 4, TX = digital pin 5
SoftwareSerial portOne(4, 5);
String command;  
String temp1,temp2; 
char inByte;    
int pin;  
int data;   
int place = 0; 
unsigned long timeToCheckPins;
#define DELAY_TO_NEXT_CHECK_PINS 10000
int pinMassive[4] [2];
int nextPin = 0;  
void setup(){
  Serial.begin(9600);
  portOne.begin(9600);
  delay(3000);
  pinMode(13, OUTPUT);
  digitalWrite(13,0);
  timeToCheckPins = millis()+ DELAY_TO_NEXT_CHECK_PINS;
    pinMassive[0][0]=9;
    pinMassive[1][0]=13;
    pinMassive[2][0]=14;
    pinMassive[3][0]=15;
}
void loop(){
  if (portOne.available() > 0){
    inByte = portOne.read();
    if ((inByte >= 48 && inByte <=58) || inByte ==46 ) 
    command.concat(inByte); 
    }
  }
  if  (inByte == 0x0A || inByte == 0x0D) { 
    inByte = 0; // Обнуляем
    Serial.println(command);
    }
    place = command.indexOf(":");
  if (place == 1 || place == 2) { 
    temp1 = command.substring(0,place); 
    temp2 = command.substring(place+1); 
    pin = temp1.toInt(); 
    data = temp2.toInt();

    if ( pin == 9) { 
        analogWrite(pin,data);
        pinMassive[0][1]=data;
    }
    else if ( pin == 13) { 
        digitalWrite(pin,data);
        pinMassive[1][1]=data;
    }
    place = 0;
  }
  command = "";
  }
  if(millis() > timeToCheckPins) {  
    timeToCheckPins = millis()+ DELAY_TO_NEXT_CHECK_PINS;
    pinMassive[2][1] = analogRead(A0); 
    pinMassive[3][1] = analogRead(A1); 
    String toUART = (String) pinMassive[nextPin][0]; 
    toUART += ":";
    toUART += (String) pinMassive[nextPin][1];
    portOne.println(toUART);
    Serial.println(toUART);
    nextPin++; 
    if (nextPin >=4) {
      nextPin = 0;
    }
  }
}