zobrazení teploty na LCD s přesností na desetiny °C

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
nosac
Příspěvky: 11
Registrován: 06 lis 2019, 10:31
Reputation: 0

zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od nosac » 09 dub 2021, 16:40

Prosím o radu.
Načítám teploty z čidel DS18B20 přes Onewire a odesílám na displej 16x2. Vzhledem k tomu, že na displeji potřebuji volné pozice pro zobrazení dalších info, pomohlo by mě, kdyby se teplota zobrazovala s přesností na desetiny. Takže místo 22.10°C zobrazit 22.1°C
Nevím jak to ovlivnit, Uvažoval jsem, jestli je to dané knihovnou pro čidla DallasTemperature nebo příkazem v programu:
sensor1.setResolution(10);
Když je v závorce 10 - mění se po 0,25 °C
Když je v závorce 12 - mění se po 0,01 °C
Když je v závorce 1 - mění se po 0,5 °C
Já bych, ale potřeboval změnu po 0,1°C

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od ondraN » 09 dub 2021, 19:37

Formát výstupu na displej ovlivňuje pouze způsob výpisu. Hoď sem tvůj kód.

nosac
Příspěvky: 11
Registrován: 06 lis 2019, 10:31
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od nosac » 09 dub 2021, 20:36

Kód: Vybrat vše



#include <OneWire.h>                 // knihovna ONEWIRE pro využití ONEWIRE sběrnice
#include <DallasTemperature.h>       // knihovna pro teplotní čidla DS18B20
#define ONE_WIRE_BUS 4               // definovaný PIN č.4 jako sběrnice pro ONEWIRE zařízení TU ZBIERAME UDAJE z čidel

#include <LiquidCrystal_I2C.h>       // knihovna pro LCD displej 1602 cez I2C

OneWire oneWire(ONE_WIRE_BUS);       // ONEWIRE ČÍTAŤ IBA NA PORTE DEFINOVANOM VYSSIE

DallasTemperature sensor1(&oneWire); // PRIRADENIE SENZOROV DALLAS DS18B20 NA ONEWIRE ZBERNICU

LiquidCrystal_I2C lcd(0x27,16,2);    // I2C addresa 0x27, 16 znaků a 2 riadky

const int VENTILATOR = 10;           // výstup pro relé VENTILATOR, 

unsigned long interval = 1800000;    // interval pro délku sepnutí a následného vypnutí VENTILATORu bude pak 30min t.j 1 800 000
unsigned long previousMillis = 0;    // referenční čas

const float onTemp = 4.0;            // dolní hranice teploty pod kterou nevětrat kvůli zamrznutí
const float offTemp = 15.0;          // horní hranice pro vypnutí větrání, už nemá cenu

int stavVENT = 0;                    // výchozí stav virtuální proměnné stavu

void setup(void)
{ 
 Serial.begin(9600);                 // spuštění sériové linky v rychlosti 9600
                                     // spustit knihovnu
 sensor1.begin();                    // START SENZOROV POD ONEWIRE (DALLASTEMPERATURE)
 sensor1.setResolution(10);          // (pokud bude 1 tak  0,5 °C, pokud bude 10,tak bude 0,25°C, pokud bude 12 tak bude na stotiny °C)

 lcd.init();                         // inicializace lcd
 lcd.backlight();                    // příkaz k trvalému zapnutí podsvícení displeje 
  
 pinMode(VENTILATOR, OUTPUT);        // nastav pin VENTILATOR jako výstup
 
 digitalWrite(VENTILATOR, HIGH);     // nastav VENTILATOR ve výchozím stavu STOP
}


void loop(void)
{
 unsigned long currentMillis = millis();                        // načti aktuálni stav MILLIS.   

 sensor1.requestTemperatures();                                 // načíst teploty senzorů
 float sensor_INT_temperature = sensor1.getTempCByIndex(0);     // teplotu senzoru 0 ulož do proměnné "sensor_INT_temperature"
 float sensor_OUT_temperature = sensor1.getTempCByIndex(1);     // teplotu senzoru 1 ulož do proměnné "sensor_OUT_temperature"

 
 //odsud příkazy pro seriovou linku programu arduino IDE------------------------------------------------------------------------------
 Serial.print("Teplota cidla INT: ");                           // 1.řádek napiš text "Teplota cidla INT: "
  Serial.print(sensor1.getTempCByIndex(0));                     // napiš hodnotu teploty prvního čidla
  Serial.println(" °C ");                                       // napiš text "°C" a udělej enter na další řádek
  delay(100);                                                   // pauza 0,1 sek
  
  Serial.print("Teplota cidla OUT: ");                          // 2.řádek napiš text "Teplota cidla INT: "
  Serial.print(sensor1.getTempCByIndex(1));                     // napiš hodnotu teploty druhého čidla
  Serial.println(" °C ");                                       // napiš text "°C" a udělej enter na další řádek
  delay(100);                                                   // pauza 0,1 sek pro přehlednější výpis

  Serial.print("stav VENTILATOR:  ");                           // 3.řádek, napiš text VENTILATOR
  Serial.println(stavVENT);                                     // napiš hodnotu proměnné stavVENT (0,1 nebo 2) a udělej enter na další řádek
  Serial.print("previousMillis: ");                             // 4.řádek napiš text "previousMillis"
  Serial.println(previousMillis);                               // napiš hodnotu proměnné previousMilis a udělej enter na další řádek
  Serial.print("currentMillis: ");                              // 5.řádek napiš text "currentMillis"
  Serial.println(currentMillis);                                // napiš hodnotu proměnné currentMilis a udělej enter na další řádek

// odsud příkazy pro LCD displej-------------------------------------------------------------------------------------------------------  
  lcd.clear();                                                  // před dalším načtením se nejdřív vymaže celej displej
  lcd.setCursor(0, 0);                                          // nastav kurzor na 1.pozici, 1.řádek
  lcd.print("OUT ");                                            // napiš tam text OUT
  lcd.print(sensor_OUT_temperature);                            // napiš hodnotu teploty ze senzoru
  lcd.print((char)223);                                         // napiš znak ° v tabulce je to pod číslem DECimálního kodu 223 
  lcd.print("C   ");                                            // napiš tam text C
  lcd.setCursor(0, 1);                                          // nastav kurzor na 1.pozici, 2.řádek
  lcd.print("IN  ");                                            // napiš tam text IN
  lcd.print(sensor_INT_temperature);                            // napiš hodnotu teploty ze senzoru
  lcd.print((char)223);                                         // napiš znak ° v tabulce je to pod číslem DECimálního kodu 223 
  lcd.print("C ");

  
  delay(1000);

  // odsud příkazy řízení ventilátoru na výstupu D10----------------------------------------------------------------------------------- 
        
  if(sensor_INT_temperature >= sensor_OUT_temperature+0.00001 and sensor_OUT_temperature < offTemp and sensor_INT_temperature > onTemp and stavVENT == 0)    // nevím proč ale bez toho +0.00001 to nefungovalo. 
    {
    previousMillis = currentMillis;         // ulož stav millis
    digitalWrite(VENTILATOR, LOW);          // zapni ventilator
    stavVENT = 1;                           // nastav proměnou stavVENT na 1
    }
    else if(stavVENT == 1 and (currentMillis - previousMillis > interval))
    {
     previousMillis = currentMillis;
     digitalWrite(VENTILATOR, HIGH);
     stavVENT = 2;
    }
    else if(stavVENT == 2 and (currentMillis - previousMillis > interval))
    {
    stavVENT = 0;
    }
   

 lcd.setCursor(12, 1);                       // nastav kurzor na 13.pozici, 2.řádek aby se při nižšší teplotě než 10°C nezústával posledný znak napsaný, pokud nemažu displej
  if(stavVENT == 0) lcd.print ("CEKA");
  if(stavVENT == 1) lcd.print ("JEDE");
  if(stavVENT == 2) lcd.print ("STOP");

    
  delay(1000);    // čekej 1 sekundu než znovu zmeří teplotu.
  
}

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od ondraN » 10 dub 2021, 07:22

Na místo

Kód: Vybrat vše

 lcd.print(sensor_OUT_temperature); 
musíš dát výpis po částech nebo použít funkci sprintf. Ta je ale dost velká, takže bude lepší výpis po částech.

Kód: Vybrat vše

 lcd.print(int(sensor_OUT_temperature)); //vypise celou cast teploty
 lcd.print('.'); //desetinny oddelovac
 lcd.print(int(sensor_OUT_temperature*10)%10); //vypise desetiny
 
V prvním řádku přetypuješ float na int, takže se zbavýš desetinné části. Funguje to jen do hodnoty +/-32767, ale předpokládám, že teplota bude v tom rozsahu :mrgreen:
V posledním přetypuješ teplotu násobenou deseti na int (tady už je max. rozsah jen +/-3267) a vypíšeš zbytek po celočíselném dělení (modulo) deseti. Třeba pro 15.12369 to je int(151.2369)=151 a 151%10=1
Je taky dobré ošetřit situaci, kdy z čidla přečteš nějakou blbost. Pokud bude třeba hodnotata v rozsahu -20..+50 tak ji normálně vypíšeš, Jinak vypíšeš třeba nápis "Out" nebo "---".

Cenda608
Příspěvky: 16
Registrován: 21 úno 2018, 11:16
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od Cenda608 » 10 dub 2021, 12:33

Kód: Vybrat vše

Takže místo 22.10°C zobrazit 22.1°C
nestačilo by

Kód: Vybrat vše

lcd.print(sensor_OUT_temperature, 1);
ta 1 znamená jedno desetinné místo, v jiných knihovnách to funguje, v téhle snad taky

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od ondraN » 10 dub 2021, 12:37

Cenda608 píše:
10 dub 2021, 12:33
.....

Kód: Vybrat vše

lcd.print(sensor_OUT_temperature, 1);
ta 1 znamená jedno desetinné místo, v jiných knihovnách to funguje, v téhle snad taky


Tady to tak nejde.
https://www.arduino.cc/en/Reference/LiquidCrystalPrint

Cenda608
Příspěvky: 16
Registrován: 21 úno 2018, 11:16
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od Cenda608 » 10 dub 2021, 12:44

asi jiná verze https://forum.arduino.cc/index.php?topic=464029.0

Ještě jsem chvíli hledal a je možné že pro arduino to nefunguje, používám ESP32

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od ondraN » 10 dub 2021, 13:53

Asi to chce vyzkoušet, nebyl by to první případ že to funguje jinak než je v dokumentaci :mrgreen:

nosac
Příspěvky: 11
Registrován: 06 lis 2019, 10:31
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od nosac » 10 dub 2021, 21:36

Díky za rady zkusím to upravit a pak dám vědet. Rozhodně jsem netušil, že to bude složité.

Kony
Příspěvky: 382
Registrován: 09 dub 2020, 11:43
Reputation: 0

Re: zobrazení teploty na LCD s přesností na desetiny °C

Příspěvek od Kony » 10 dub 2021, 22:04

Kód: Vybrat vše

lcd.print(senzoryDS.getTempCByIndex(0),1);
na jedno desetinné místo

Kód: Vybrat vše

lcd.print(senzoryDS.getTempCByIndex(0),0);
na celé číslo

Kód: Vybrat vše

lcd.print(senzoryDS.getTempCByIndex(0),2);
na dvě desetinná místa

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 16 hostů