Stránka 3 z 6
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 22 led 2020, 07:10
od ondraN
Co třeba to dát do dvou byte, pak můžeš mít hodnoty od -127,99 o 127,99
Nezkoušel jsem to, takže si nejsem moc jistý, jak dopadne to přetypování floatu na byte, ale dá se to udělat i jinak, kdyby to nefungovalo. Princip je snad jasný.
Kód: Vybrat vše
byte Cele=0, Destinne=0;
float Temp=25.87;
if(Temp<0){ // pro zaporne nastavime nejvissi bit jako signum
Cele=128;
Temp=Temp*(-1);
}
Cele=Cele+(byte)Temp;
Temp=Temp-((byte)Temp); //v Temp zbyde jen desetinna cast;
Temp=Temp*100;
Desetinne=(byte)Temp; //ted jsou v Desetinne desetiny a setiny
//prevod zpet
Temp=(float)Desetinne/100;
Temp=Temp+(float)(Cele&127);
if(Cele>127) Temp=Temp*(-1);
//tisk
if(Cele>127) {
Serial.print(''-'');
Serial.print(Cele-128);
}else{
Serial.print(Cele);
}
Serial.print(".");
if(Destinne<10) Serial.print("0");
Serial.print(Desetinne);
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 22 led 2020, 07:11
od pavel1tu
Tak to sorry, mne to na DUE chodí a nic jiného na služebky nevozím.
Je zajímavé, že ten odkaz na ty stránky co jsem dával - moje angličtina není moc dobrá, asi tam i píše že na Arduinech to ne vždy chodí
osobně bych prostě ten float nepoužil - vůbec při měření teploty
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 22 led 2020, 18:23
od ondraN
Tady je celý kód převodu, už vyzkoušený. Díky nedostatečné přesnosti floatu se někdy výsledné číslo liší o +/- setinu.
Pokud si uděláš z proměnných Cele a Desetinne strukturu a pole, nebo jenom dvě pole, zabere ti uložení 256 teplot jen 512byte, jako kdyby to byl int.
Kód: Vybrat vše
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
void loop() {
// put your main code here, to run repeatedly:
byte Cele=0, Desetinne=0;
float Temp=-125.98;
if(Temp<0){ // pro zaporne nastavime nejvissi bit jako signum
Cele=128;
Temp=Temp*(-1);
}
Cele=Cele+byte(Temp);
Temp=Temp-byte(Temp); //v Temp zbyde jen desetinna cast;
Temp=byte(Temp*100);
Desetinne=byte(Temp); //ted jsou v Desetinne desetiny a setiny
//prevod zpet
Temp=float(Desetinne)/100;
Temp=Temp+float(Cele&127);
if(Cele>127) Temp=Temp*(-1);
Serial.println(Temp);
//tisk
if(Cele>127) {
Serial.print('-');
Serial.print(Cele-128);
}else{
Serial.print(Cele);
}
Serial.print('.');
if(Desetinne<10) Serial.print('0');
Serial.println(Desetinne);
delay(5000);
}
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 22 led 2020, 19:03
od Maxim
ondraN píše: ↑22 led 2020, 07:10
Co třeba to dát do dvou byte, pak můžeš mít hodnoty od -127,99 o 127,99
Nezkoušel jsem to, takže si nejsem moc jistý, jak dopadne to přetypování floatu na byte, ale dá se to udělat i jinak, kdyby to nefungovalo. Princip je snad jasný.
Kód: Vybrat vše
byte Cele=0, Destinne=0;
float Temp=25.87;
if(Temp<0){ // pro zaporne nastavime nejvissi bit jako signum
Cele=128;
Temp=Temp*(-1);
}
Cele=Cele+(byte)Temp;
Temp=Temp-((byte)Temp); //v Temp zbyde jen desetinna cast;
Temp=Temp*100;
Desetinne=(byte)Temp; //ted jsou v Desetinne desetiny a setiny
//prevod zpet
Temp=(float)Desetinne/100;
Temp=Temp+(float)(Cele&127);
if(Cele>127) Temp=Temp*(-1);
//tisk
if(Cele>127) {
Serial.print(''-'');
Serial.print(Cele-128);
}else{
Serial.print(Cele);
}
Serial.print(".");
if(Destinne<10) Serial.print("0");
Serial.print(Desetinne);
to funguje... a je to jednoduché.. akorát trochu bojuju jak to uložit do pole a číst z pole.. poradíš mi s tím?
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 22 led 2020, 20:49
od ondraN
Třeba takhle
Kód: Vybrat vše
void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}
byte Cele[256],Desetinne[256];
float Temp;
int Index=0;
void loop() {
// put your main code here, to run repeatedly:
for(Index=0;Index<256;Index++){ //naplnis celou tabulku od 0 do 255, tedy 256 hodnot
Cele[Index]=0, Desetinne[Index]=0;
float Temp=-125.07; //Tady si zmeris teplotu a das do Temp, ja zde jen neco dosadim
if(Temp<0){ // pro zaporne nastavime nejvissi bit jako signum
Cele[Index]=128;
Temp=Temp*(-1);
}
Cele[Index]=Cele[Index]+byte(Temp);
Temp=Temp-byte(Temp); //v Temp zbyde jen desetinna cast;
Temp=byte(Temp*100);
Desetinne[Index]=byte(Temp); //ted jsou v Desetinne desetiny a setiny
//prevod zpet
Temp=float(Desetinne[Index])/100;
Temp=Temp+float(Cele[Index]&127);
if(Cele[Index]>127) Temp=Temp*(-1);
Serial.println(Temp);
//tisk
if(Cele[Index]>127) {
Serial.print('-');
Serial.print(Cele[Index]-128);
}else{
Serial.print(Cele[Index]);
}
Serial.print('.');
if(Desetinne[Index]<10) Serial.print('0');
Serial.println(Desetinne[Index]);
}
delay(1000);// Tady tabulku zpracujes
}
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 22 led 2020, 21:08
od AstroMiK
A neni to nějak moc složitý?
Nestačilo by na převod z float do pole znaků použít tohle:
Kód: Vybrat vše
float teplota = -125.67;
char poleznaku[20];
dtostrf(teplota,10,3,poleznaku);
Serial.print("Teplota jako pole znaku: "); // Teplota jako pole znaku: -125.670
Serial.println(poleznaku);
Pro převod z float do int bych asi jen vynásobil to float číslo *100.0, takže by se pak dala do int uložit teplota v rozsahu -327,67 až +327,68°C
s rozlišením na setiny °C. (V tom integeru by to bylo samozřejmě bez desetinné tečky).
Kód: Vybrat vše
int tepint = teplota * 100.0;
Serial.print("teplota jako int = ");
Serial.println(tepint); // teplota jako int = -12567
A je to okamžitě ve dvou bajtech.
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 22 led 2020, 21:24
od Maxim
tu funkci dtostrf jsem tam měl původně taky, ale není standardní a zdálo se mi, že se mi kvůli ní arduino sekalo, když jsem ji použil asi 15x na převedení floatů na text, ale je možné, že to bylo něčím jiným.. můžu to také ještě zkusit.
každopádně díky všem za rady
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 23 led 2020, 06:55
od ondraN
To sekání při použití dtostrf() může být způsobené nedostatkem paměti v zásobníku a její fragmentací v čase. Prostě to stokrát funguje a po stoprvé se to zatne. Obvzláště, když jsou použity objektové knihovny pro práci s periferiemi, není dobré mít zásobník malý.
Každopádně ty převody do dvou byte a zpět je velmi žádoucí napsat jako funkce a pak se i používání zjednodušší. To už ale zkus sám, tím se to nejlépe naučíš.
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 23 led 2020, 07:12
od pavel1tu
JJ, já děkuji (začleněno do sbírky funkcí) - SUPER.
Já jen podotknu, dost věcí je lepší psát jako funkce, třeba i vyčítání hodnot z nějakého čidla + následné zpracování,
když to pak chceš použít příště, lépe se to vypreparuje z programu.
Re: konverze datových typů / komunikace s displayem pomocí SPI
Napsal: 23 led 2020, 07:47
od pavel1tu
Já se ještě optám, asi blbě ... to vše kvůli rovnání textu na displeji 20x4 ? Já už tento displej nepoužívám (mám 16x2 asi 10ks kdyby někdo z okolí Trutnova chtěl).
Já to řešil sice asi brutálně, ale pro mne jednodušeji - měření teplot i zobrazení času:
- převedl jsem zobrazovanou hodnotu na char[] požadované délky - teplotu i se znakem teploměru a st.C na konci (viz. tvorba vlastních zanků), čas do formátu hod:min
- zjistil jsem si délku tohoto pole znaků (sizeof(char_var))
- podle délky jsem upravil pozici X
- pak jsem pro jistotu přepsal dané místo prázdnými znaky
- pak jsem tam zobrazil požadovanou hodnotu
- toto vše probíhalo ve funkci automaticky, jen se zavolala, v paměti jen místo pro jeden char_tmp[]
na toto jsem si vytvořil funkce:
- ZobrazCas(poziceX, poziceY, CasH, CasM)
- ZobrazTeplotu(poziceX, poziceY, teplota)
a nikde jsem nemusel nic takto složitě přechrochtávat ... možná to jde jednodušeji, ale prostě já
Já nejsem dobrý programátor a nesnáším, když kod (i když jej okopíruji od někoho) který používám - nechápu.
Co se týče proměnných a práci s pamětí je dost článků, tak alespoň jeden
https://www.arduinotech.cz/inpage/ardui ... i-podruhe/