Добавление нулевого заполнения к десятичным значениям

Я хочу добавить ноль перед плавающим числом следующим образом:

010.0

Код, который я использую, выглядит следующим образом:

if(value < 10){
  lcd.print(F("0"));
}

lcd.print(value);

Но когда значение равно ровно 10, оно все равно добавляет ноль:

0010.0

Я попробовал что-то вроде этого, но мне не повезло:

if(value < 10 && value != 10){
  lcd.print(F("0"));
}
  • Как я могу решить эту проблему?

- ПРАВКА:

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x3B, 16, 2);

#define turnOff 3
#define turnOn 2
#define gateStatus 8
#define btn 4

float ADC0, current, ADC1, voltage, ADC2, temp, watt;
int8_t state, btnState, btnPushed, btnToggle, lcdClear;
uint32_t deBounce = 0;

void setup() {
  analogReference(EXTERNAL);
  pinMode(turnOff, OUTPUT);
  pinMode(turnOn, OUTPUT);
  pinMode(gateStatus, INPUT);
  pinMode(btn, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  lcd.begin();
}

void loop() {
  digitalWrite(13, LOW);
  state = digitalRead(gateStatus);
  btnState = digitalRead(btn);

  if (!btnState) {
    if (millis() - deBounce > 200) {
      btnPushed = 1;
      deBounce = millis();
    }
  }
  if (btnPushed && btnState) {
    btnToggle = 1;
  }
  if (btnToggle && state) {
    digitalWrite(turnOn, HIGH);
    delay(5);
    digitalWrite(turnOn, LOW);
    btnToggle = 0;
    btnPushed = 0;
  }
  if (btnToggle && !state) {
    digitalWrite(turnOff, HIGH);
    delay(5);
    digitalWrite(turnOff, LOW);
    btnToggle = 0;
    btnPushed = 0;
  }

  for (int i = 0; i < 500; ++i) {
    ADC0 += analogRead(A0);
  }
  ADC0 /= 500;
  current = ADC0 * (2.5 / 1023.0);
  current = current / 0.211;


  for (int i = 0; i < 500; ++i) {
    ADC1 += analogRead(A1);
  }
  ADC1 /= 500;
  voltage = ADC1 * (2.5 / 1023.0);
  voltage = voltage * 20.2;

  for (int i = 0; i < 100; ++i) {
    ADC2 += analogRead(A2);
  }
  ADC2 /= 100;
  temp = ADC2 * (2.5 / 1023.0);
  temp = temp * 100.5;

  watt = voltage * current;

  lcd.setCursor(0, 0);
  if(voltage < 10){
    lcd.print(F("0"));
  }
  lcd.print(voltage);
  lcd.setCursor(5, 0);
  lcd.print(F(" V"));

  lcd.setCursor(9, 0);
  if(temp < 10){
    lcd.print(F("0"));
  }
  lcd.print(temp, 1);
  lcd.print((char)223);
  lcd.print(F(" C"));

  if (state) {
    lcd.setCursor(0, 1);
    lcd.print(F("   OUTPUT OFF   "));
    lcdClear = 1;
  }

  else {
    if (lcdClear) {
      lcd.clear();
      lcdClear = 0;
    }
    lcd.setCursor(0, 1);
    if (current < 10) {
      lcd.print(F("0"));
    }
    lcd.print(current);
    lcd.setCursor(5, 1);
    lcd.print(F(" A"));

    lcd.setCursor(9, 1);
    if (watt < 10) {
      lcd.print(F("0"));
    }
    if (watt < 100) {
      lcd.print(F("0"));
    }
    lcd.print(watt, 1);
    lcd.setCursor(14, 1);
    lcd.print(F(" W"));
  }
}

, 👍1

Обсуждение

Тогда что-то еще в вашем коде не так. Оператор if проверяет, не является ли "значение" snaller больше 10. Если значение равно ровно 10, оно не будет выполнено. Пожалуйста, покажите минимальный компилируемый пример кода, который показывает вашу проблему. Тогда мы сможем попытаться воспроизвести и решить вашу проблему, @chrisl

@chrisl код был не слишком длинным, поэтому я добавил весь код к вопросу., @ElectronSurf

В настоящее время я не могу попробовать это сам, но вы можете попробовать написать 10.0 (то есть float) вместо "10" (то есть int). А вы пробовали также печатать значения непосредственно на последовательном мониторе для отладки? Или вставлять последовательные отпечатки в операторы if, чтобы проверить, выполняются ли они?, @chrisl

@chrisl Я попробовал это, а также "10.000" и "9.999`. все то же самое! Я не могу печатать на последовательном мониторе, он автономный, без интерфейса USB..., @ElectronSurf


1 ответ


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

2

Это похоже на проблему округления. Если число, которое вы хотите напечатать, находится в пределах открытого интервала (9.95, 10), то значение условия < 10 является истинным, так как число строго меньше 10. Очевидно, что value != 10 также верно. Тем не менее, lcd.print(x, 1) округлит число до ближайшего кратного 0.1, которое в данном случае равно 10.

Я не вижу лучшего решения, чем самому справиться с округлением. Я бы использовал целые числа для сравнения, так как они избегают всех проблем с округлением:

// Выведите float на ЖК-дисплей в формате 2.1 (xx.x), при необходимости дополните его
// нулем. Предположим, что x < 100.
void printPadded(float x)
{
    // Левая панель.
    int i = round(x * 10);
    if (i < 100) lcd.write('0');

    // Выведите округленное значение.
    lcd.print(i * 0.1, 1);
}
,