Нечетные символы в последовательном мониторе

Недавно я работал над веб-сайтом, который принимает данные от Arduino, например, о температуре и влажности. Но есть фатальная проблема, с которой я столкнулся, последовательный монитор выдает какой-то мусор с некоторыми фактическими показаниями. Есть ли способ устранить это?

 ╰─λ cat /dev/ttyACM0
T0°C
Humidity: 39.00%
00%
Temperature: 32.70°C
Humidity: 39.00%
Temperature: 32.70°C
Humidity: 39.00%
Temperature: 32.70°C
Humidity: 39.00%
00%
Temperature: 32.70°C
Humidity: 39.00%
Temperature: 32.70°C
Humidity: 39.00%
Temperature: 32.70°C
Humidity: 39.00%
idit9.00Tempure:70°Humi: 39
emperatu32.7
Huty: 0%
idit9.00Tempure:70°umidity.00%Tratu32.7
idit9.00Tempture.70�Humi: 39
empere: 0°Cmidi39.0
atur°C
Hum9.00

код-

#include <Adafruit_Sensor.h>
#include <DHT.h>
#include <DHT_U.h>

#define DHTPIN 4

#define DHTTYPE    DHT11
DHT_Unified dht(DHTPIN, DHTTYPE);

uint32_t delayMS;

void setup() {
  Serial.begin(9600);
  sensor_t sensor;
  dht.begin();
  delayMS = sensor.min_delay / 1000;
}

void loop() {
  delay(delayMS);
  sensors_event_t event;
  dht.temperature().getEvent(&event);
  if (isnan(event.temperature)) {
    Serial.println(F("Error reading temperature!"));
  }
  else {
    Serial.print(F("Temperature: "));
    Serial.print(event.temperature);
    Serial.println(F("°C"));
  }
  dht.humidity().getEvent(&event);
  if (isnan(event.relative_humidity)) {
    Serial.println(F("Error reading humidity!"));
  }
  else {
    Serial.print(F("Humidity: "));
    Serial.print(event.relative_humidity);
    Serial.println(F("%"));
  }
}

плата - Arduino Uno (R3)

, 👍1

Обсуждение

Добро пожаловать в Ардуино:SE. Не видя вашего кода и настройки оборудования, мы не сможем ответить на ваш вопрос., @sempaiscuba

@sempaiscuba спасибо, что поправили меня. Я отредактировал его сейчас, дайте мне знать, если есть какие-то дальнейшие исправления., @sierra madre

Я бы напечатал что-то уникальное в setup(), из которого в выходном листинге будет видно, что он запускается только один раз., @timemage

Каково фактическое значение delayMS? Вычисление выглядит подозрительно, так как sensor не инициализирован. Значение должно быть около 2500 мс., @PMF

@PMF Он говорит, что это 2000 мс, @sierra madre

В вашей системе установлен ModemManager? Не могли бы вы проверить, что никто больше не возится с последовательным портом? Вот так: sudo fuser -v /dev/ttyACM0., @Edgar Bonet

Очевидно, датчикам DHT11 требуется не менее 2 секунд, чтобы сделать новое показание. Рассмотрите возможность ожидания чуть более 2 секунд в цикле. Лично я не смог заставить DHTxx работать надежно и переключился, кажется, на si7021., @st2000


1 ответ


Лучший ответ:

0

Как было отмечено в комментариях, вы пытаетесь считывать показания датчика со слишком высокой скоростью.

Попробуйте изменить эту строку:

delayMS = sensor.min_delay / 1000;

к:

delayMS = sensor.min_delay = 1000;

или:

delayMS = sensor.min_delay = 3000;

Это будет считывать данные с датчика медленнее, и вы получите четкие выходные данные.

,