Использование DHT11 и EMF — проблема с задержкой

Код работает, но есть задержка при включении и выключении светодиода (физически). Есть ли более эффективный способ написать этот код? Я предполагаю, что это вызвано задержкой чтения DHT11.

~Проблема решена

, 👍-2

Обсуждение

Нет задержки?, @Majenko

есть один, физически, когда светодиод загорается и гаснет., @RobE

Я не знаю, что вы подразумеваете под «физически», но в вашем коде есть задержка. Удалите его, и если вам нужно, чтобы части вашего кода работали медленнее, используйте millis(), чтобы определить, когда они должны работать., @Majenko

Пожалуйста, оставьте исходный вопрос без изменений, чтобы другие могли извлечь пользу из вашего вопроса и его решения., @StarCat


1 ответ


0

Ваш вопрос немного неясен (задержка определяется двумя моментами времени или одним моментом и продолжительностью — вы указываете только один момент).

Читая ваш код, я могу только предположить, что вы имеете в виду, что внешнее событие на inPin отображается с задержкой на светодиоде на pin11. Это должно произойти, когда это внешнее событие генерируется только в начале вашего delay(1000) (и, следовательно, случайным образом задерживается между 0 и 1000 мс).

Вы можете избавиться от задержки в своем цикле, используя немного математики таймера вокруг кода чтения DHT11:

#define DHT11_SAMPLE_DELAY = 1000
uint32_t last_dht11_reading_ms = 0;

void loop() {
  uint32_t current_ms = millis();

  if( current_ms - last_dht11_reading_ms > DHT11_SAMPLE_DELAY ) {

    DHT.read11(dht_apin);
    Serial.println("....your output....");

    last_dht11_reading_ms = current_ms;
  }
  // также удалим задержку(1000) в цикле()
}

Вы получаете текущее время (millis() показывает время безотказной работы с момента загрузки в миллисекундах) и вычитаете время последнего чтения. Если результат превышает пороговое значение (в данном случае: 1000 мс), вы выполняете новое чтение DHT11, устанавливая переменную, содержащую время последнего чтения, на текущее время. Когда loop() возникает снова, пороговое значение не будет достигнуто, поэтому чтение значения DHT11 пропускается до тех пор, пока millis() снова не вернет достаточно большое число.

,

@RobE Если бы вы скопировали мою ошибку в вызове DHT.read11(), тогда я понимаю, почему ... если бы вы этого не сделали, я был бы очень удивлен ^^ (Исправлен ошибочный вызов. Он должен быть та же строка, что и в исходном коде.), @orithena

Обновил код, теперь датчик температуры никогда не читает. Должно быть, я сделал что-то не так. Я обновил код выше в ОП., @RobE

@RobE Приятно видеть, что ваша проблема решена, но не могли бы вы оставить вопрос здесь, чтобы другие могли найти решение? Предполагаемый способ здесь, в Stackoverflow, состоит в том, чтобы все было читабельно, поэтому другим не придется снова задавать тот же вопрос. Вместо того, чтобы удалять вопрос, отметьте ответ как правильный., @orithena