konverze datových typů / komunikace s displayem pomocí SPI

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, ...)
ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od ondraN » 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);  
Naposledy upravil(a) ondraN dne 22 led 2020, 07:38, celkem upraveno 3 x.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od pavel1tu » 22 led 2020, 07:11

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
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

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

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od ondraN » 22 led 2020, 18:23

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);

}

Maxim
Příspěvky: 128
Registrován: 22 led 2019, 20:32
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od Maxim » 22 led 2020, 19:03

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?

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

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od ondraN » 22 led 2020, 20:49

Třeba takhle :mrgreen:

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

}

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od AstroMiK » 22 led 2020, 21:08

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.

Maxim
Příspěvky: 128
Registrován: 22 led 2019, 20:32
Reputation: 0

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od Maxim » 22 led 2020, 21:24

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

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

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od ondraN » 23 led 2020, 06:55

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číš.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od pavel1tu » 23 led 2020, 07:12

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.
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: konverze datových typů / komunikace s displayem pomocí SPI

Příspěvek od pavel1tu » 23 led 2020, 07:47

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/
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

Odpovědět

Kdo je online

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