Последовательный монитор 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();
}
@Iliketurtles, 👍0
Обсуждение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
- esp_now.h: нет такого файла или каталога
- NodeMCU второй HARDWARE последовательный TX в качестве порта отладки
- NodeMCU 1.0 автоматически сбрасывается через некоторое время
- Отправка данных из одного узла NodeMCU в другой узел NodeMCU с использованием последовательной связи
- Последовательный ввод NodeMCU V3 приводит к фатальному исключению 9 (LoadStoreAlignmentCause)
- Программирование NodeMCU без USB-порта
- Как заставить 5-вольтовое реле работать с NodeMCU
- ESP8266 не подключается к Wi-Fi
Под мусором вы имеете в виду, что даже если анемометр остановлен, вы изначально получаете показания с высокой скоростью на последовательном мониторе, которые постоянно уменьшаются с каждой секундой?, @6v6gt
под мусором я имею в виду случайные символы, не имеющие смысла, @Iliketurtles
Одна картинка стоит тысячи слов. Добавьте один к своему вопросу. Если esp8266 постоянно дает сбой, он может писать на консоль со скоростью, отличной от выбранной вами. Попробуйте изменить это значение на 115200 или 74880 в Serial.begin() и консоли, чтобы увидеть читаемый вывод., @6v6gt
Что произойдет, если вы удалите что-нибудь еще, кроме анемометра (оборудование и исходный код)? Что говорит последовательное окно, когда вы меняете скорость передачи данных, как предложено? Пожалуйста, [отредактируйте] свой вопрос и добавьте эту важную информацию., @the busybee
ранее я пробовал каждую скорость передачи данных, что дало мне кое-что, но не то, что я хотел, кроме того, я не знаю, что вы имеете в виду под удалением анемометра, а также является ли эта проблема между последовательным монитором или оборудованием, потому что, если это является последовательным монитором, я могу пропустить эту часть и попытаться разместить ее прямо на веб-сайте. И последнее: я действительно не знаю, какую картинку вы хотите видеть, @Iliketurtles
Картинка, о которой я говорил, в идеале должна представлять собой дамп изображения/экрана, показывающий последовательный монитор, пока он отображает эти «мусорные символы», или, если вы нашли скорость передачи данных, которая отображает более понятный текст, вместо этого., @6v6gt