#c #embedded #stm32
#c #встроенный #stm32
Вопрос:
Таким образом, я могу прочитать значение АЦП для температуры, а также отправить строку, когда она достигла слишком горячего значения. Но моя проблема в том, что он отправляет строку много раз. Я пытаюсь отправить только один раз. Я пытался исправить это, используя задержку, но она работает недостаточно хорошо.
if ( LM35_ADC_Value == 580 )
{
USART_puts(USART2,"VERY_HOTn");
delay(1680000000000);
}
Комментарии:
1. Похоже, вам нужно изменить свою реализацию с модели без состояния на модель с сохранением состояния. Например, сохраните предыдущее
LM35_ADC_Value
значение и распечатайте строку, только если оно увеличилось до 580 с ранее более низкого значения.2. Кажется маловероятным, что
delay
оно принимает auint64_t
, поэтому, возможно, начните с двойной проверки предупреждений вашего компилятора.3. Кроме того, как вы фильтруете показания АЦП?
Ответ №1:
Вам нужно реализовать состояние с возможным гистерезисом, что-то вроде этого:
bool veryhotsent = false;
...
if ( veryhotsent )
{
if ( LM35_ADC_Value < 578 ) // change that value to whatever is suitable
veryhotsent = false; // for your application
}
else if ( LM35_ADC_Value >= 580 ) // use >=, otherwise you might miss the raise
{
USART_puts(USART2,"VERY_HOTn");
veryhotsent = true;
}
- Как только температура поднимается выше 580, вы отправляете сообщение.
- Получатель сообщения не будет отправлен, если температура не снизится до 578 и снова не повысится до более чем 580.
Также очень важно использовать >= 580
вместо == 580
, иначе сообщение не будет отправлено, если температура повысится, скажем, с 579 до 581 между двумя измерениями, что может быть абсолютно фатальным в зависимости от вашего приложения.