Сначала я расскажу о своем проекте. Это полноприводный робот, которым можно управлять через интернет. Я использую 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 Есть ли способ избавиться от этого? Или есть альтернатива firebase.
Вы пишете/читаете несколько полей. Это явно все замедляет.