Датчик температуры и влажности DHT11 Код

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

После определения переменной температуры и влажности и присвоения Measurement_timestamp функции millis() цикл if сначала проверяет, соответствует ли значение millis - Measurement_timestamp < 3000 unsigned long (что для меня не имеет смысла), а затем, если чтение прочитано, оно = true?

Это правильно?

Код:

static bool measure_environment( float *temperature, float *humidity )
{
  static unsigned long measurement_timestamp = millis( );

  /* Measure once every four seconds. */
  if( millis( ) - measurement_timestamp > 3000ul )
  {
    if( dht_sensor.measure( temperature, humidity ) == true )
    {
      measurement_timestamp = millis( );
      return( true );
    }
  }

  return( false );
}

, 👍1

Обсуждение

Пожалуйста, отправьте код в виде текста, а не в виде изображения (и, конечно, не в виде скриншота, сделанного с помощью мобильного телефона), @PMF

Приносим извинения, думал, что изображения были приемлемы на сайте, @Tom

код в изображении не может быть скопирован и протестирован ... также некоторые люди здесь не могут просматривать изображения, @jsotola

Это имеет смысл, извините, @Tom


1 ответ


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

0

Мне этот код понятен.

Комментарий "/* Измерять один раз каждые четыре секунды. */" неточно. Он будет измерять, когда время, прошедшее с момента последнего измерения, превышает 3 секунды.

Из-за "static unsigned long Measurement_timestamp = millis());", Measurement_timestamp НЕ будет инициализироваться значением millis() при каждом вызове функции – он будет инициализирован только один раз за все время выполнения. В противном случае это никогда не приведет к измерению, поскольку "if(millis() - Measurement_timestamp > 3000ul)" никогда не будет правдой.

Первый вызов задает для Measurement_timestamp= значение millis() [текущее значение таймера], и функция возвращает значение "false"

При вызове через 3,001 сек. "if(millis() - Measurement_timestamp > 3000ul)" true - измерение выполнено, "measurement_timestamp" обновляется до текущего значения millis(), и функция возвращает значение "true".

Возвращает "false" в течение следующих 3 секунд, а затем "true" и так далее.

см. https://stackoverflow.com/questions/5033627/ статическая-переменная-внутри-функции-в-c

и Как обработать ролловер millis()?

Надеюсь, это поможет.

,

Привет, спасибо, что прояснил ситуацию - значит, я был неправ. Подскажите, пожалуйста, что означает 3000 мкл?, @Tom

@Tom 3000ul - это буквальная константа, и у них есть типы переменных, как и у других переменных. В этом случае константа 3000 обозначается как тип unsigned long [ul], как это уместно, см. https://cplusplus.com/doc/tutorial/constants/ Проще говоря, millis() измеряет в миллисекундах и разница между последней меткой времени и текущим счетчиком millis() составляет> 3000 миллисекунд (3 секунды), идите и делайте свое дело :), @DrG