Ардуино вопрос округления

Я сделал простой термостат для управления нагревателем на 12 В. Диапазон температур может быть от 0 F до примерно 190 F. По какой-то причине, когда отображаемая температура на моем ЖК-дисплее меняется с 99 до 100, все в порядке, но если она возвращается со 100 до 99, значение заканчивается на 990. Я думаю это как-то связано с округлением в моем расчете температуры термистора. Есть предположения? Код размещен ниже.

 /*
    The circuit:
 * 5V to Arduino 5V pin
 * GND to Arduino GND pin
 * CLK to Analog #5
 * DAT to Analog #4
 * BUTTON to Analog #2
 * Thermistor to Analog #3
 * Heater to digital #7
*/

// include the library code:
#include <Wire.h>
#include <LiquidCrystal.h>
#include "OneButton.h"
#include <EEPROM.h>

LiquidCrystal lcd(0);
int heater = 7;       // heater is connected to pin 2
OneButton button(A2, true);
float settemp;
unsigned long currentTime;
unsigned long loopTime;

void setup()
{
  currentTime = millis();
  loopTime = currentTime;
  EEPROM.read (1); // make the eeprom or atmega328 memory address 1
  Serial.begin(9600);
  // link the doubleclick function to be called on a doubleclick event.   
  button.attachDoubleClick(doubleclick);
  button.attachClick(click);
  pinMode(heater, OUTPUT);                       // Set the Heater Valve pin as output
  lcd.begin(16,2);
  delay(1000);
  lcd.setBacklight(HIGH);
  delay(1000);
  lcd.setCursor(0,0);
    lcd.print("  D.W. VEGGIE");
  lcd.setCursor(0,1);
    lcd.print(" BURNER SYSTEMS");
  delay(4000);
  lcd.clear();
  delay(1000);
  lcd.setCursor(0,0);
    lcd.print("  CENTRITHERM");
  lcd.setCursor(0,1);
    lcd.print("     V1.0");  
  delay(4000);
  lcd.clear();
  delay(1000);
  lcd.setCursor(0,0);
    lcd.print("SET TEMP     F   ");
  lcd.setCursor(0,1);
    lcd.print("OIL TEMP     F   ");  
}

double Thermister2(int RawADC) {
  double Temp2;
  Temp2 = log(((10240000/RawADC) - 10000));
  Temp2 = 1 / (0.001129148 + (0.000234125 * Temp2) + (0.0000000876741 * Temp2 * Temp2 * Temp2));
  Temp2 = Temp2 - 273.15;           // Convert Kelvin to Celcius
  Temp2 = (Temp2 * 1.8) + 32;    // Convert to F
  Temp2 = round(Temp2);
  return Temp2;
}

void loop()
{
  currentTime = millis();
  settemp = EEPROM.read(1); // read the settemp on the eeprom
  button.tick();
  if(currentTime >= (loopTime + 500)){ 
    double Temp2 = Thermister2(analogRead(1));   // read Thermistor
    if (Temp2 < settemp) digitalWrite(heater, HIGH);      // turn heater on 
        else if (Temp2 >= settemp) digitalWrite(heater, LOW);  // turn heater off 
    lcd.setCursor(9,1);
    lcd.print(Temp2,0);
    loopTime = currentTime;
  }
  lcd.setCursor(9,0);
    lcd.print(settemp,0);
  EEPROM.write (1,settemp);  
  delay(10);
}

// this function will be called when the button was pressed 2 times in a short timeframe.
void doubleclick() {
   settemp --  // remove one to the settemp, the settemp is the ideal temperature for you
   ;
} // doubleclick

// this function will be called when the button was pressed 1 time in a short timeframe.
void click() {
  (settemp ++);  // add one to the settemp, the settemp is the ideal temperature for you
} // click
// End

Ответы (3)

Нет, проблема в том, что вы не стерли «0» в конце «100». Выведите достаточно пробелов после текущего значения, чтобы убрать предыдущее значение.

Спасибо. Все, что я сделал, это добавил еще один файл lcd.print(" "); на линии после установленной температуры. Спасибо
Забавно, что это случилось и со мной, когда я впервые начал использовать ЖК-экраны, поэтому я сразу понял, в чем проблема. Я был так озадачен тем, почему мой счетчик шел от 0 -> 255, а затем, когда он считал в обратном направлении, когда он был ниже 100, он начинался с 990 и опускался на 10 секунд!

Дело не в округлении, а в способе отображения символов на ЖК-дисплее. Когда вы отображаете 100, вы отображаете три символа на своем дисплее, а когда он падает до 99, вы отображаете только 2 символа, но дисплей сдвигает его вправо, оставляя 0 из 100 по-прежнему отображаемым.

Не уверен в точном решении, но попробуйте поэкспериментировать с lcd.setCursor(9,1); и lcd.setCursor(9,0); функции.

Или вызовите функцию lcd.clear(); функция где-то в вашем цикле void();

Кроме того, запись в EEPROM изнашивает его.

Лучше использовать переменную в стеке или куче.

Еще один совет: единственный способ отлаживать Arduino — это Serial.println(), это утомительно, но подтвердит то, что они сказали.