zobrazení teploty na LCD s přesností na desetiny °C
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
zobrazení teploty na LCD s přesností na desetiny °C
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
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
Re: zobrazení teploty na LCD s přesností na desetiny °C
Formát výstupu na displej ovlivňuje pouze způsob výpisu. Hoď sem tvůj kód.
Re: zobrazení teploty na LCD s přesností na desetiny °C
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.
}
Re: zobrazení teploty na LCD s přesností na desetiny °C
Na místo
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.
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
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 "---".
Kód: Vybrat vše
lcd.print(sensor_OUT_temperature);
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 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 "---".
Re: zobrazení teploty na LCD s přesností na desetiny °C
Kód: Vybrat vše
Takže místo 22.10°C zobrazit 22.1°C
Kód: Vybrat vše
lcd.print(sensor_OUT_temperature, 1);
Re: zobrazení teploty na LCD s přesností na desetiny °C
Cenda608 píše: ↑10 dub 2021, 12:33.....ta 1 znamená jedno desetinné místo, v jiných knihovnách to funguje, v téhle snad takyKód: Vybrat vše
lcd.print(sensor_OUT_temperature, 1);
Tady to tak nejde.
https://www.arduino.cc/en/Reference/LiquidCrystalPrint
Re: zobrazení teploty na LCD s přesností na desetiny °C
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
Ještě jsem chvíli hledal a je možné že pro arduino to nefunguje, používám ESP32
Re: zobrazení teploty na LCD s přesností na desetiny °C
Asi to chce vyzkoušet, nebyl by to první případ že to funguje jinak než je v dokumentaci
Re: zobrazení teploty na LCD s přesností na desetiny °C
Díky za rady zkusím to upravit a pak dám vědet. Rozhodně jsem netušil, že to bude složité.
Re: zobrazení teploty na LCD s přesností na desetiny °C
Kód: Vybrat vše
lcd.print(senzoryDS.getTempCByIndex(0),1);
Kód: Vybrat vše
lcd.print(senzoryDS.getTempCByIndex(0),0);
Kód: Vybrat vše
lcd.print(senzoryDS.getTempCByIndex(0),2);
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 8 hostů