Сначала я опишу свой проект.Это 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();
}
}
}