Задержка ответа Firebase при обработке нескольких местоположений

Сначала я расскажу о своем проекте. Это полноприводный робот, которым можно управлять через интернет. Я использую esp8266 узел микроконтроллера в качестве материнской платы. Для отправки данных через интернет. Я использую База данных 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 для переключения регистра, но безрезультатно. Как только я нажал кнопку, значение в базе данных изменилось. Так что проблем с сетью нет.

Пустой цикл в ардуино выполняется медленно.

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

#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();
    }
  }
}

Вы пишете/читаете несколько полей. Это явно все замедляет.

gre_gor 19.02.2019 01:19

@gre_gor Есть ли способ избавиться от этого? Или есть альтернатива firebase.

Mayoogh Girish 19.02.2019 02:32
1
2
596
0

Другие вопросы по теме