Firebase задержка в ответе при обработке нескольких мест - PullRequest
0 голосов
/ 18 февраля 2019

Сначала я опишу свой проект.Это 4WD робот, которым можно управлять через интернет.Я использую esp8266 NodeMCU в качестве материнской платы.Для отправки данных через интернет.Я использую базу данных Firebase в реальном времени. Приложение для Android имеет следующие функции.Он может управлять движениями робота с 2 различными скоростями. Он будет отображать показания в режиме реального времени 2 датчиков (DHT11 и MQ2) и управлять 5 сервоприводами, подключенными к nodemcu (используя панель поиска для управления каждым сервоприводом). Все работает индивидуально.Например, когда я тестировал только с моторами, все работало нормально (когда я менял направление из приложения, был быстрый ответ).Точно так же был быстрый ответ от сервоприводов, также когда проверялось отдельно .

Когда я загрузил полный эскиз (с двигателями, 5 сервоприводом, 2 датчиками), я получил задержанный ответ от двигателей исервоприводы.Например: когда робот движется в прямом направлении и нажата кнопка обратного направления, роботу потребуется около 2 секунд, чтобы изменить свое направление.Даже если его 2 секунды становится слишком сложным при управлении им.

Это тестовый код, который дает быстрый ответ

#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#define FIREBASE_HOST "xxx-xxx.firebaseio.com"                  //Your Firebase Project URL goes here without "http:" , "\" and "/"
#define FIREBASE_AUTH "xxxxx"       //Your Firebase Database Secret goes here
#define WIFI_SSID "xxx"                                             //your WiFi SSID for which yout NodeMCU connects
#define WIFI_PASSWORD "xxx"    
int value = 0;

void setup() {
  Serial.begin(9600);

  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
   Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);
  Firebase.set("S1", 0);

}

void loop() {
  value = Firebase.getInt("S1");
  if (value == 1) 
    Serial.println("Both Forward slow");

  else if(value == 2) 
    Serial.println("Both Forward fast");

  else if(value == 3)
    Serial.println("Both backward  slow");

  else if(value == 4) 
    Serial.println("Both backward  fast");
}

Я даже пытался изменить лестницу if else наслучай переключения, положительного результата нет.Как только я нажал кнопку, значение в базе данных изменилось.Таким образом, с сетью проблем нет.

Цикл void в arduino выполняется медленно.

Вот полный код

#include <Servo.h> 
#include "DHT.h"       
#include <ESP8266WiFi.h>
#include <FirebaseArduino.h>
#define FIREBASE_HOST "xxx-xxx.firebaseio.com"                  //Your Firebase Project URL goes here without "http:" , "\" and "/"
#define FIREBASE_AUTH "xxxx"       //Your Firebase Database Secret goes here
#define WIFI_SSID "xxx"                                             //your WiFi SSID for which yout NodeMCU connects
#define WIFI_PASSWORD "xxx"

#define DHTTYPE DHT11   // DHT 11
#define dht_dpin D7      // Connect Sensor to D3 pin
#define mq2_pin A0

Servo myservo1;
Servo myservo2;
Servo myservo3;
Servo myservo4;
Servo myservo5;

#define ENA D5
#define ENB D6
int fast = 1023;
int slow = 511;

DHT dht(dht_dpin, DHTTYPE);
int S1 = 0;
int speed_value;
int temp_value;
int smoke_value;
int humidity_value;
String servo1_value, servo2_value, servo3_value, servo4_value, servo5_value;

int servo1;
int servo2;
int servo3;
int servo4;
int servo5;


void setup() {

  Serial.begin(9600);
  myservo1.attach(D0);
  myservo2.attach(D8);
  myservo3.attach(3);
  myservo4.attach(1);
  myservo5.attach(10);
  pinMode(A0, INPUT);
  pinMode(D1, OUTPUT);
  pinMode(D2, OUTPUT);
  pinMode(D3, OUTPUT);
  pinMode(D4, OUTPUT);
  pinMode(D5, OUTPUT);
  pinMode(D6, OUTPUT);
  pinMode(D7, INPUT);

  dht.begin();


  WiFi.begin(WIFI_SSID, WIFI_PASSWORD);
  Serial.print("connecting");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.println();
  Serial.print("connected: ");
  Serial.println(WiFi.localIP());
  Firebase.begin(FIREBASE_HOST, FIREBASE_AUTH);

}

void loop() {

  humidity_value = dht.readHumidity();
  temp_value = dht.readTemperature();
  smoke_value = analogRead(A0);

  S1 = Firebase.getInt("S1");
  speed_value = Firebase.getInt("Speed");
  Firebase.setInt("Temperature", temp_value);
  Firebase.setInt("Humidity",humidity_value);

  if(smoke_value > 500)
    Firebase.setString("Smoke","True");
  else
      Firebase.setString("Smoke","False");

  servo1_value = Firebase.getString("Servo1");
  servo2_value = Firebase.getString("Servo2");
  servo3_value = Firebase.getString("Servo3");
  servo4_value = Firebase.getString("Servo4");
  servo5_value = Firebase.getString("Servo5");


  myservo1.write(servo1_value.toInt());
  myservo2.write(servo2_value.toInt());
  myservo3.write(servo3_value.toInt());
  myservo4.write(servo4_value.toInt());
  myservo5.write(servo5_value.toInt());

  Serial.print(servo1_value.toInt());
  Serial.print("\t");
  Serial.print(servo2_value.toInt());
  Serial.print("\t");
  Serial.print(servo3_value.toInt());
  Serial.print("\t");
  Serial.print(servo4_value.toInt());
  Serial.print("\t");
  Serial.print(servo5_value.toInt());
  Serial.println();


  if (speed_value == 1) {
    if (S1 == 0) {
      stop_();
    }
    else if (S1 == 1) {
      forward_slow();
    }
    else if (S1 == 2) {
      backward_slow();
    }
    else if (S1 == 3) {
      left_slow();
    }
    else if (S1 == 4) {
      right_slow();
    }
  }
  else if (speed_value == 2) {
    if (S1 == 0) {
      stop_();
    }
    else if (S1 == 1) {
      forward_fast();
    }
    else if (S1 == 2) {
      backward_fast();
    }
    else if (S1 == 3) {
      left_fast();
    }
    else if (S1 == 4) {
      right_fast();
    }
  }
}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...