Последовательный монитор ESP8266 выплевывает мусор

Я пытаюсь настроить метеостанцию, и мне нужен только анемометр. Этот код работает нормально (насколько я знаю).

// Определения выводов
const int reedSwitchPin = 2;

// Переменные
volatile unsigned long lastRotationTime = 0;
volatile float windSpeed = 0.0;
const float windSpeedFactor = 2.4; // Коэффициент для преобразования времени вращения в скорость ветра

void setup() {
  pinMode(reedSwitchPin, INPUT_PULLUP);
  // AttachInterrupt(digitalPinToInterrupt(reedSwitchPin), handleRotation, FALLING);
  Serial.begin(9600);
  Serial.println("hello world!");
}

void loop() {
  // Проверка работоспособности геркона
  int reedState = digitalRead(reedSwitchPin);
  if (reedState == HIGH) {
    Serial.println("Reed switch triggered!");
  }

  // Рассчитываем скорость ветра на основе времени между вращениями
  unsigned long elapsedTime = micros() - lastRotationTime;
  if (elapsedTime > 0) {
   windSpeed = windSpeedFactor / (float)elapsedTime;
  }

  Serial.print("Wind Speed: ");
  Serial.print(windSpeed);
  Serial.println(" m/s");

  delay(1000); // Задержка на 1 секунду перед повторным измерением
}

void handleRotation() {
  // Записываем время последнего вращения
  lastRotationTime = micros();

}

Но когда я раскомментирую следующую строку: attachInterrupt(digitalPinToInterrupt(reedSwitchPin), handleRotation, FALLING);

он печатает мусорные символы на последовательном мониторе. Вот полный код:

    // Определения выводов
const int reedSwitchPin = 2;

// Переменные
volatile unsigned long lastRotationTime = 0;
volatile float windSpeed = 0.0;
const float windSpeedFactor = 2.4; // Коэффициент для преобразования времени вращения в скорость ветра

void setup() {
  pinMode(reedSwitchPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(reedSwitchPin), handleRotation, FALLING);
  Serial.begin(9600);
  Serial.println("hello world!");
}

void loop() {
  // Проверка работоспособности геркона
  int reedState = digitalRead(reedSwitchPin);
  if (reedState == HIGH) {
    Serial.println("Reed switch triggered!");
  }

  // Рассчитываем скорость ветра на основе времени между вращениями
  unsigned long elapsedTime = micros() - lastRotationTime;
  if (elapsedTime > 0) {
   windSpeed = windSpeedFactor / (float)elapsedTime;
  }

  Serial.print("Wind Speed: ");
  Serial.print(windSpeed);
  Serial.println(" m/s");

  delay(1000); // Задержка на 1 секунду перед повторным измерением
}

void handleRotation() {
  // Записываем время последнего вращения
  lastRotationTime = micros();
}

, 👍0

Обсуждение

Под мусором вы имеете в виду, что даже если анемометр остановлен, вы изначально получаете показания с высокой скоростью на последовательном мониторе, которые постоянно уменьшаются с каждой секундой?, @6v6gt

под мусором я имею в виду случайные символы, не имеющие смысла, @Iliketurtles

Одна картинка стоит тысячи слов. Добавьте один к своему вопросу. Если esp8266 постоянно дает сбой, он может писать на консоль со скоростью, отличной от выбранной вами. Попробуйте изменить это значение на 115200 или 74880 в Serial.begin() и консоли, чтобы увидеть читаемый вывод., @6v6gt

Что произойдет, если вы удалите что-нибудь еще, кроме анемометра (оборудование и исходный код)? Что говорит последовательное окно, когда вы меняете скорость передачи данных, как предложено? Пожалуйста, [отредактируйте] свой вопрос и добавьте эту важную информацию., @the busybee

ранее я пробовал каждую скорость передачи данных, что дало мне кое-что, но не то, что я хотел, кроме того, я не знаю, что вы имеете в виду под удалением анемометра, а также является ли эта проблема между последовательным монитором или оборудованием, потому что, если это является последовательным монитором, я могу пропустить эту часть и попытаться разместить ее прямо на веб-сайте. И последнее: я действительно не знаю, какую картинку вы хотите видеть, @Iliketurtles

Картинка, о которой я говорил, в идеале должна представлять собой дамп изображения/экрана, показывающий последовательный монитор, пока он отображает эти «мусорные символы», или, если вы нашли скорость передачи данных, которая отображает более понятный текст, вместо этого., @6v6gt


1 ответ


-1

Пин 2, то есть gpio2 (D4), не подходит для этого приложения esp8266, поскольку этот контакт должен быть на высоком уровне во время загрузки, и ваш анемометр может находиться в любом состоянии. Попробуйте вместо этого сказать, что контакт 4 — это gpio4 (D2), или выполните поиск по запросу «лучшие контакты для использования — esp8266»;

Сбой во время загрузки может привести к записи символов на последовательный монитор со скоростью 115200 или 74880 бод.

,

Кто бы ни проголосовал против, пожалуйста, добавьте комментарий, почему., @the busybee

Не я проголосовал против, а просто сказал, что, по моему мнению, я использую D2, а не D4, по крайней мере, с точки зрения аппаратного обеспечения. стоит ли мне попробовать использовать D4, потому что раньше я использовал D2 ?, @Iliketurtles

@Iliketurtles Кажется, у вас возникли трудности с двумя разными системами нумерации контактов, используемыми на nodeMcu. Найдите схему распиновки nodeMcu, чтобы увидеть преобразование между контактами GPIO и «D». В данном случае const int reedSwitchPin = 2; 2 — это вывод GPIO. На плате nodeMcu он обозначен D4. Попробуйте предложение, которое я дал в своем ответе., @6v6gt

о, так что я должен сказать в коде использовать const int reedSwitchPin = 4;, @Iliketurtles

@Iliketurtles Да. const int reedSwitchPin = 4; правильно. Затем вы подключаете анемометр к контакту с маркировкой «D2» на плате nodeMcu. Если у вас есть что-то еще, подключенное к другим контактам вашего nodeMcu, например, светодиод, временно отключите их. Если у вас все еще есть проблемы, выберите скорость передачи данных, которая дает наиболее понятный вывод на последовательной консоли, и добавьте этот вывод к исходному вопросу., @6v6gt

У меня возникла небольшая проблема: я как бы припаял контакты на место, включая аналоговый контакт (A0 (опять же из маркировки контактов на плате)), а также его контакты GND и +5 В. У меня также возникает проблема: раскрывающийся список портов неактивен., @Iliketurtles

@Iliketurtles Становится явно хуже. То, что вы сейчас описываете, — это либо проблема с установкой IDE, либо с функциональностью USB вашего NodeMCU. Должно быть, раньше вам было лучше видеть «мусорных» персонажей, о которых вы сообщили изначально. Может быть, открыть новую тему исключительно по этой последней проблеме., @6v6gt