Ställa in tal display med knappar och jämföra detta med Rx

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Henry »

Icecap skrev:Om xxx,xxxE-9 är lägsta värde kan man enkelt beskriva det som xxxxxx.
Yyy,yyyE-6 blir då yyyyyy000.

Dessa värden kan enkelt jämföras.
Förstår hur du menar som så men kommatecknet är inga problem, utan jag får inte ihop hur det skall representeras och kunna jämföras med när det är en negativ och positivt enskild komponent involverad, som skillnaden mellan x.xxE-3 och x.xxE3?

Max tryck är siffermässigt 9.99E9, max vakuum är 9.99-E9. Det är detta minustecken som jag nu inte får ihop hur jag skall kunna representera det så att hela talet, eller vad man nu gör, kan jämföras.

Enbart positiva eller enbart negativa del-värden är jag med på, men hur representeras hela värdet när det är en exponent som kan vara både positiv och negativ? Alltså hur man skall representera hela värdet som ett enda oavsett om det är en negativt eller positiv del i det som x.xxE-5 och x.xxE5?

hawkan skrev:Om du bara ska använda givarens värde för att sätta på eller av en pump vid ett visst värde fungerar det bra med float eller double. Man är inte intresserad av om de två talen är samma, bara om det är mer eller mindre än det givna värdet.

Får säga att lägga exponenten sist i en String som jag gjorde tidigare var en rätt dålig idé. Jämförelser blir inte lätt. Glöm det, det var ett exempel.
Float eller double, ok, skall kollas upp.

Tog en koll på String och jämföra och nej det var ju inte så enkelt som jag hade hoppats på, arbetade lite annorlunda än jag trodde annars hade det varit en smal sak.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Icecap »

Om din upplösning är 0,01E-5 (1E-7) blir 1,00E-5 lik med 100 och 9,99E5 blir 999000000000000.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Henry »

Ok du menar så då hänger jag med, men då måste jag även ha något som omvandlar det till detta så att säga och ju enklare desto bättre så jag fattar sedan att få ihop någon funktionabel kod, men bra tips.


Edit:

Floating point constants can also be expressed in a variety of scientific notation. 'E' and 'e' are both accepted as valid exponent indicators.

Precis vad jag var ute efter, trodde inte float gjorde just detta, vilket ju i princip redan sagts med rek av användandet av float.

Så då borde det i princip bara vara att jämföra de mot varandra men så står ju även detta:

Floating point numbers are not exact, and may yield strange results when compared.

Skall förstås kollas upp med lite test, men nu är det natt.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Icecap »

Att omvandla text till värde är rimligt enkelt.
* Ta en variabeln som kan hålla det värde som mest kan ingå.
* Nolla denna variabel.
* För varje tal-tecken i texten utför:
Variabeln *= 10;
Variabeln += Tecknet - '0';

I ditt fall får du ta hand om kommat eller om det alltid kommer efter första siffra kan du hoppa över det och kompensera lite i mjukvaran.

Sedan når rutinen till 'E' och där kollas om det är ett '-' bakom.
Sedan omvandlas exponenten på samma sätt som tidigare och man kan så enkelt räkna ut hur många gångar man ska multiplicera med 10 för att det ska bli rätt.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Jan Almqvist »

Eller, lite enklare, använd sscanf().
Senast redigerad av Jan Almqvist 4 juli 2017, 12:18:34, redigerad totalt 1 gång.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av hawkan »

Kan du lita på att formatet alltid är "@254ACK6.48E-7;FF" ? kan det möjligen stå "@254ACK6.5E-7;FF" dvs olika antal tecken för talet?

Har visat i tidgare inlägg hur du kan isolera talet av intresse tidigare. Finns flera varianter. Icecap beskriver en.
Här är två andra varianter.

Kod: Markera allt

float tryck;
tryck = atof("6.48E-7");
sscanf("6.48E-7", "%f", &tryck);
Nu får du koda upp en variant och se vad du tycker.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Henry »

Kan du lita på att formatet alltid är "@254ACK6.48E-7;FF" ? kan det möjligen stå "@254ACK6.5E-7;FF" dvs olika antal tecken för talet?

Man kan sätta antal decimaler i mätvärdet med ett kommando till sensorn så de är alltid de samma.

Har nu även lusläst manualen till sensorn och det verkar absolut som om minustecknet efter "E" byts ut mot ett plus istället, så allt efter "E" flyttas tex inte ett steg till vänster eller så.



Det jag först var ute efter (en sak i taget) var hur jag på något vis kunde spara värdet från sensorn för att sedan, helst rakt av, kunna jämföra det värdet med ett likadant inmatat värde med knappar.

Float funkar så som jag testat det i nedan kod, så tack för det.

Den enda kod jag haft tid att sätt ihop, och som jag förstår vls, är denna enkla för hårdtest av lite olika värden på float så att det verkligen fungerade som jag hoppades på att jämföra med varandra så att det tex hanterade exponenten rätt osv, tror väl inte precis jag behöver kommentera koden men gör lite ändå så ingen blir fly förbannad att det saknas kommentarer, vad vet jag:

Kod: Markera allt

#include <LiquidCrystal.h>

LiquidCrystal lcd(40, 42, 28, 26, 24, 22);

float i = 1.23E-9;
float j = 1.23E-1;
float k = 1.23E6;
float l = 1.23E0;
float m = 0.01E1;
float n = 0.01E-1;


void setup() {

  lcd.begin(20, 4);
  lcd.clear();
  delay(300);
  
  if (m > n)

    lcd.print("JA");

  else {

    lcd.print("NEJ");

  }
}

Det funkade utmärkt förutom vissa få värden runt 0 som tex att 0.01E1 inte var större än 1.23E0? Tror dock inte det första värdet ens visas av sensorn eller om det ens visas 0 där så kan hända det inte spelar någon roll, får kollas upp, kommer inte ihåg hur det visas vid exponent överslagen.

Men de normala värdena fungerade precis som jag hoppades på att jämföra med varandra som förväntat så då var väl den delen klar så att säga. Då tar jag bara värdet från sensorn, sparar det som float och sedan använda det rakt av för att jämföra det med det likadana (ja med en hel del kod emellan förstås) inmatade värdet och utan någon svår avancerad kod att få ihop för jämförelsen.

Precis vad jag behövde, men har ni ev några invändningar mot detta tanksätt med enbart denna del och undrar hur fasen jag tänker för "så går absolut inte att göra pga bla bla bla" så är jag förstås mer än idel öra.


Det enda som då nu är kvar är att få runt huvudet för knapptryckningen för inmatat värde och jag får då gå igenom i detalj allt ni sagt för detta för det är något helt annat för mig och som jag förstått det rent allmänt.


Sätta ihop en kod för helheten blir först när jag kopplat och sammanfogat alla delar i huvudet och det gör jag nog tyvärr inte på en dag eller två då jag ju som sagt är mer än nybörjare inom detta och håller även på med annat men har ändå en del idéer så en del börjar kopplas så smått bland sågspånen men långt ifrån allt.

Men tips om tex float, kodexempel och dylikt m.m hjälper mycket för det är sådana här delar jag inte vet finns eller skall sättas ihop men kan kolla upp när det nämns och kan användas för det jag behöver göra så tack för alla era tips så här länge!
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av hawkan »

Ja tror inte en sekund på att jämförelse mellan två flyttal går fel, det måste vara något annat.

Jag tror du gör rätt i ditt läge. Testa av del för del hur det fungerar och sedan pussla ihop.

Får väl vara lite mer explicit så här är lite kod du kan leka med för att få tag i trycket från sensorn. Lite varianter. Lek och lär.

Kod: Markera allt

void setup() {
  // put your setup code here, to run once:
Serial.begin(9600);

float tr = atof("1.23E-3");
float tr2 = atof("4.56E+2");

Serial.println(tr,8);
Serial.println(tr2,8);

String str("@254ACK6.48E-7;FF");
String str2 = str.substring(7,14);
Serial.println(str2);

float tr3 = str2.toFloat();
Serial.println(tr3,9);

String str3("@254ACK6.48E-7;FF");
String str4 = str3.substring(7,14);
Serial.println(str4);

float tr4 = str4.toFloat();
Serial.println(tr4,9);

String str5("@254ACK6.48E+7;FF");
int semicolonplats = str5.indexOf(';');
Serial.print("Semikolon på plats ");
Serial.println(semicolonplats);
String str6 = str5.substring(7,semicolonplats);
Serial.println(str6);

float tr5 = str6.toFloat();
Serial.println(tr5,9);
}

void loop() {
  // put your main code here, to run repeatedly: 
  // En gång räcker, så kul är det inte.
}
Senast redigerad av hawkan 4 juli 2017, 19:53:00, redigerad totalt 1 gång.
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Jan Almqvist »

0.01E1 är väl inte större än 1.23E0?
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Henry »

Givetvis är det ju mindre du har helt rätt, tänkte helt fel med exponenten men feltänkt hade det blivit fel ändå men det kopplade jag inte. :)


hawkan: alltså trycket från sensorn har jag ju? Jag får tag på det med koden i första inlägget på första sidan, eller misstolkar jag dig kanske?

Tack för koden, kul att den räknar ut det av sig själv så att säga och får nu även se grejer som hette atof, tofloat osv vilket är nytt så får kollas upp, kul, och även förstå och få ihop någon liknande du skrev.

Tänkte dock innan jag gick igenom den koden något enkelt principiellt i stil med detta:

Kod: Markera allt


Float = inmatat_värde

Float = sensor

sensor = Serial.readString();



If (sensor > inmatat_värde)

{
    öppna ventil för kraftigare vakuum
 }

else

  stäng ventil


Grundprincipen hade väl fungerat?


Det är sedan mycket mer än dessa saker som jag skall implementera i det hela som bimetall temp sensorer och dylikt och ev någon vanlig för tempvisning av grejer, men allt detta vet jag hur även om jag inte gjort det förr.

Har jag dock sedan även klart inmatningen av värdet medelst knappar till en liknande float eller nåt så blir resten en rätt enkel sak för mig.
Senast redigerad av Henry 4 juli 2017, 21:35:45, redigerad totalt 1 gång.
Användarvisningsbild
hawkan
Inlägg: 2585
Blev medlem: 14 augusti 2011, 10:27:40

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av hawkan »

Ja du har ju värdet som en String på sidan 1, alltså som de tecknen som sensorn svarar med.
Men du vill ha den som en "float", inte som en samling tecken.

Kod: Markera allt

    value = Serial.readString();
ger värdet i en String. Därför har jag använt String i exemplen jag skrev.

Med det är hela svaret från sensorn du har där. För att visa på LCD pekar du ut tecknen på position 7-13

Kod: Markera allt

    for (int mod = 7; mod < 14; mod++) {  //Skriver enbart ut värdet tex 6.48E-7 på displayen
      lcd.write(value[mod]);
Om du kollar på mina exempel så börjar jag med en hel String, dvs Stringen "value" i din kod.
Jag klipper ut bara den delen av svaret där trycket står, position 7 till 13.
Och av dessa tecknen skapas en "float" variabel.

Edit: Och nu läste jag koden ovan,. Du har precis samma problematik här blandar du ihop det. Se ovan. Se vad som står i detta inlägg. Se mina exempel.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Henry »

Ok har nu lite tid över att bråka med detta skit igen. Har mha dina eminenta kodexempel fått ihop detta som test för att se hur det beter sig så jag vet att det absolut blir rätt, och det var tur visade det sig.

Kod: Markera allt

#include <LiquidCrystal.h>

LiquidCrystal lcd(40, 42, 28, 26, 24, 22);

String data;

void setup() {

  lcd.begin(20, 4);
  Serial.begin(9600);
}


void loop() {

  while (Serial.available() == 0) {
  }
  
  lcd.clear();
  data = Serial.readString();

  lcd.setCursor(0, 0);
  String str4 = data.substring(7, 14);
  lcd.print(str4);

  lcd.setCursor(0, 1);
  float tr4 = str4.toFloat();
  lcd.print(tr4, 8);

}
Det hände något konstigt när jag prövade bla @254ACK2.01E-1;FF.

Då jag fick 0.20099999!

Testade följande:

2.01E-3 = 0.00201000
2.01E-2 = 0.02010000
2.01E-1 = 0.20099999
2.01E+0 =2.00999999
2.01E+1=20.0100000

Testade även lite snabbt @254ACK3.01E-1;FF och jo, 0.30099999.

Vad händer?
Användarvisningsbild
Jan Almqvist
Inlägg: 1580
Blev medlem: 1 oktober 2013, 20:48:26
Ort: Orust

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Jan Almqvist »

För många decimaler? Alla tal kan inte anges exakt och ett 32-bitars flyttal fungerar bäst med max c:a 7 siffror.
Användarvisningsbild
Henry
Inlägg: 23588
Blev medlem: 20 april 2005, 02:52:47
Ort: Lund

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Henry »

Japp det verkade vara orsaken, får inte samma om jag minskar antalet decimaler så det blir sammanlagt 7 siffror.

Det väldigt stora problemet med detta är dock att jag måste ha minst 9 decimaler för att få in området som jag kommer att kunna komma ner till, tom 11 om jag skall kunna ta hela sensorns mätområde.

Är detta möjligt att ändå, på ett enkelt vis så jag kopplar, få till på något vis?

Läste lite om "double" som jag har för mig kunde användas till denna typ av problem? Men vettefasen om det var någon vidare fördel med det då som det stod precisionen inte blev bättre på något vis eller hur det nu fungerade, använder för övrigt ett ATMega 2560 kort.
Användarvisningsbild
Icecap
Inlägg: 26106
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: Ställa in tal display med knappar och jämföra detta med

Inlägg av Icecap »

Beroende på kompilern kan double vara identisk med float.

Jag testade på den µC jag lekar med och där kan man - vid att ange att den ska använda C11 - få en double till att faktisk vara en double. Men det är kompilerberoende.
Skriv svar