Как я могу получить значения без мусора при переводе из Arduino Uno в NodeMCU - PullRequest
0 голосов
/ 17 июня 2019

Я загрузил код firebase в NodeMCU (esp8266) и он полностью функционален.Я связал Arduino Uno с nodemcu, используя контакты Rx, Tx.Когда я получаю значения от датчиков и передаю их в узел MCU.Я получаю половину ненужных значений и половину правильных значений.Длина мусора продолжает меняться, я получаю идеальное значение один раз, в то время как его полно барахло в другой раз.

Я пытался изменить скорость передачи, но это не сработало.Я сталкивался с двумя разными скоростями передачи данных для nodeMCU и arduino.

SoftwareSerial ESP(0,1);
  void setup() {
  ESP.begin(9600);
}
void sendStatus(bool dish, byte gas, int knob, unsigned long alarmIn) {
  DynamicJsonDocument status(50);
  status["K"] = knob;
  status["G"] =  gas;
  status["D"] = dish;
  status["A"] = alarmIn;
  String statusString;
  serializeJson(status, statusString);
  Serial.println(statusString);
  ESP.println(statusString);
}

void readSerial() {
  if (!ESP.available()) return;
  String cmd = "";
  while (ESP.available()) {
    char ch = (char)ESP.read();
    if (ch != 10 && ch != 13) cmd += ch;
    if (ch == '}')
      break;
    delay(1);
 }
while (ESP.available()) {
  ESP.read();
  delay(1);
}                               // for arduino uno

Я ожидал получить полную строку, но я получил последние 50-70% строки, в то время как первая часть получилась в виде ненужных значений.Нужно получить полную строку, которую я могу видеть на серийном мониторе Arduino.

1 Ответ

1 голос
/ 18 июня 2019

Я не вижу серьезных проблем с вашим кодом, но кажется, что у вас есть проблемы с памятью или неисправна последовательная связь, поэтому я дам вам несколько советов, может быть, это может помочь:

Во-первых, в *Функция 1003 * гарантирует, что DynamicJsonDocument status(50); достаточно велико для хранения ваших значений, особенно если вы добавляете большие числа.

Также в соответствии с документами :

Вы можете сохранить JsonDocument в стеке или в куче:

Использование StaticJsonDocument для хранения в стеке (рекомендуется для документов размером менее 1 КБ)

Использование DynamicJsonDocument для хранения вкуча (рекомендуется для документов размером более 1 КБ)

Поэтому я думаю, что использование StaticJsonDocument в качестве глобальной переменной с JsonObject - лучший выбортак как ваш объект Json не слишком большой и имеет статические ключи.

Во-вторых, для readSerial я предлагаю вам использовать более простую функцию, такую ​​как readString вместо чтения байтов с задержкой.

SoftwareSerial ESP(0, 1);
StaticJsonDocument<100> status;
JsonObject object;

void setup()
{
    ESP.begin(9600);
    Serial.begin(9600);
    object = status.to<JsonObject>();
}

void sendStatus(bool dish, byte gas, int knob, unsigned long alarmIn)
{
    object["K"] = knob;
    object["G"] = gas;
    object["D"] = dish;
    object["A"] = alarmIn;
    char statusString[100];
    serializeJson(status, statusString);
    Serial.println(statusString);
    ESP.println(statusString);
}

void readSerial()
{
    String cmd;
    while (ESP.available())
    {
        cmd = ESP.readString();
        Serial.println(cmd);
    }
}

void loop()
{
    sendStatus(...);
    readSerial();
    delay(1000);
}
...