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
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

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

Inlägg av lillahuset »

Kom igen nu Henry, vad har dina givare för noggrannhet? Elva decimaler? Glöm det. En vanlig float eller bättre en skalad int32_t eller uint32_t räcker för 99,99% av alla verkliga problem. Det handlar bara om att plocka upp huvudet från under armen och tänka till vid inmatning av mätvärden.

En vanlig simpel float har en mantissa med 23 bit vilket motsvarar ca åtta miljoner olika värden, dvs drygt sex siffror.
En double har en mantissa med 52 bit vilket blir ca fyra tusen miljoner miljoner olika värden, dvs ungefär sexton siffror.

Har du nu en ynklig PIC eller AVR är det relativt obegåvat att använda double om man inte måste. Jag jobbar bara med ARM nuförtiden och använder ogärna double även om det är relativt effektivt, relativt jämfört med PIC och AVR alltså.

Om man ska få till en väl fungerande lösning måste man försöka förstå problemet först. En givare har ganska sällan bättre noggrannhet än 0,1% vilket ger att en 16 bits integer är rätt lagom för att spara värdet.
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 »

Det har inte med precisionen på sensorn som så att göra utan värdet i sig, även om precisionen är på några % så vill jag ju oavsett ha med alla siffror.

Sensorn kan visa ned till 1.00E-8 som lägst, detta omvandlat till float blir ju 10 siffror varav 9 decimaler, används mindre än denna mängd försvinner ju själva värdet och det blir bara nollor, eller har jag missat något?

Vad jag förstått (kanske felaktigt?) så gick det inte att jämföra en String med precision utan man omvandlar den till en float och alltså ett rent numeriskt värde vilket ju då går med enkelhet att jämföra.

Upp i tryck är det få decimaler då det inte går högre än atmosfärstryck, men nedåt går det bra mycket lägre så värdet motsvarar just 10 siffror som mest i tryck, eller är det något jag missar?

Hade det gått att med precision jämföra en String innehållande tex 5.29E-7 rakt av med en liknande String/float/int whatever så är jag mer än idel öra då jag kommit förbi problemet med för få decimaler. 7 siffror motsvarar 1.00E-5 och det vet jag absolut att jag kommer att komma förbi.


Har du nu en ynklig PIC eller AVR är det relativt obegåvat att använda double om man inte måste.

Tja inte fasen vet jag. :) Du glömmer kanske att jag är en purfärsk nybörjare så det är mycket än som jag varken kan eller vet så tex allt vad eventuella exempel heter får gärna visas så enkelt som möjligt så jag kan koppla.

Även om jag lärt mig en hel del i denna tråd som jag inte hade den blekaste om för bara en vecka sedan, och som hjälpt mig väldigt mycket, så skall det förstås alltid uppkomma problem på vägen som jag tyvärr inte alltid kan lösa själv men där denna tråd varit till mycket stor hjälp, så det tackar jag er alla för.
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 »

Flyttal i µC är aldrig exakt rätt! Det är utgångsläget.
Ska man jämföra två värden för likhet ska man kolla om de är inom x.xx av varandra.

Jag har skrivit hur du kan göra, det är bara att ta det till dig och jobba.
Användarvisningsbild
hawkan
Inlägg: 2586
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 »

Går framåt ser jag, bra det.
Men jag får säga att du har inte riktigt koll på hur en float fungerar det märker jag.
Bästa vore väl om du googlar på "floating point" som det heter egentligen.
Och på svenska flyttal (flyt-tal) för att visa på att dess unika egenskap.
Nämligen att en float har ca 7 siffrors precision men att exponentdelen gör att
dessa sju siffror kan vara var som helst inom spannet 1e+38 till 1e-38 och lika mycket
med negativa tal.

Att du får strängen "2.01E-1" att bli 2.009999E-1 har att göra med hur tal representeras med bittar och ofta blir inte ett tal exakt representerat (menar EXAKT-EXAKT, på 8-e decimalen) som man tror. Det är därför kommentaren att du aldrig ska jämföra två flyttal med == kom upp tidigt i tråden. Det bara är såhär och nåt man får leva med.

Float kommer att fungera jättebra för dej. Det har 7 siffrors precision, din data har 3 som i "2.01" och
en float täcker området 10^38 till 10^-38, du behöver mellan 1000 - 10^-8, En int å andra sidan klarat inte detta. Float är idealiskt för detta.
Mr Andersson
Inlägg: 1394
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

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

Inlägg av Mr Andersson »

Henry skrev:Sensorn kan visa ned till 1.00E-8 som lägst, detta omvandlat till float blir ju 10 siffror varav 9 decimaler, används mindre än denna mängd försvinner ju själva värdet och det blir bara nollor, eller har jag missat något?
Det du missat är att hur float och double lagras i minnet och hur det visas när du skriver ut det som en sträng är två helt skilda saker.
1) Skriver du ut 1e-8 med för få decimaler kommer det att visa 0. Du tappar precision vid konvertering till sträng.
2) Flyttal lagras binärt men du skriver ut det decimalt. Du tappar precision vid konvertering till bas 10.

Testa att jämföra t.ex. 1.01e-8 < 1.02e-8 i kod och du kommer se att det fungerar alldeles utmärkt även om båda påstås vara 0 vid utskrift.
1e-8f representeras i IEEE-754 som \(\frac{11258999}{8388608} \cdot 2^{-27}\) vilket är ungefär 9.99...e-9.

Flyttal är approximeringar av decimaltal och det finns sällan exakta konverteringar mellan bas-10 <=> bas-2 och därför kan du få "konstiga" resultat vid jämförelse med == och != som nämnt tidigare. Däremot fungerar det alltid som förväntat att jämföra större än /mindre än.
Användarvisningsbild
lillahuset
Gått bort
Inlägg: 13969
Blev medlem: 3 juli 2008, 08:13:14
Ort: Norrköping

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

Inlägg av lillahuset »

Vad är det för sensor du har egentligen? Har den ett mätområde från ett ner till 10^-8?
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 »

Nästan, inte från 1 utan från 1000 ned ned till 10E-8, finns även mätare som klarar ned till 10E-12 men inte lika högt. Jag hade förstås givetvis inte skrivit värden i tråden som den inte kunnat mäta, vakuummätare har ett stort område.

Det är en kombinerad mätare som har både grovvakuummätare och högvakuummätare integrerat i samma hölje och med sömlös övergång mellan sensorerna/värdet, lite därför den har så brett område. Den heter KJLC 927B och här finns lite info om någon ev skulle vara intresserad:

https://www.mksinst.com/product/product ... uctID=1216

Men jag får säga att du har inte riktigt koll på hur en float fungerar det märker jag.
Trodde att systemet omvandlade värdet till en float med enbart de decimaler som det omfattade i förhållande till inlagt värde så att säga och att det jag såg på displayen var exakt det som sparades i en float men som sagt så är ju så inte fallet. Då vet jag detta och tack för denna info, då är jag lugn igen. :)


Mr Andersson: Jag får ena värdet representerat som String från sensorn i form av "data" men detta är ju ren text och det går ju inte att jämföra med ett numreriskt värde i form av en float som jag förstått och kompilatorn hade inte heller tillåtit mig att i ren text skriva tex 1.01e-8 < 1.02e-8 utan att först definiera båda som floats då den förstås inte denna text som String och sedan hänvisa dessa till tex "inmatat värde" och då en princip kod som;

If

"data från sensor" < "inmatat värde"

then

vad som

Som funkat.

Men missar jag något även här är jag idel öra än en gång.


Jag har dock denna del nu klar och fungerande för mig med floats, jämförelse och allt detta, bara det med att displayen visade lite annat som jag hakade upp mig på men det var ju inget att bry sig om.

Jag vet nu att denna del, som jag ser det, kommer att fungera som tänkt och har värdet från sensorn redo att kunna plockas ut när jag vill vilket är så jag ville ha denna del.

Värdet jag sedan då matar in med knapparna omvandlas jag sedan även det till en float och kan då jämföras rakt av med värdet från sensorn, är så jag tänkt mig i alla fall borde fungerat.
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 ser nu ovan del som klar, det som då "bara" är kvar inmatningen med knapparna och hela det köret så jag har baserat saker som sagt i tråden med egna idéer så jag själv fattar hur det skulle kunna byggas upp rent funktionsmässigt, om detta nu skulle kunna fungera som tänkt vls:


Jag tar en array och sätter den till 4, ja vad det kan kallas, steg där jag sedan på något vis använder en knapp för att hoppa fram genom var och en av delarna och enbart i en riktning för programenkelhetens skull (glöm inte att jag fortfarande är mer än nybörjare).

Varje del i arrayn är sedan kopplad till en int, om detta nu går inte hunnit titta igenom så noga än angående arrays.

Gör sedan en enkel räknare som kan räkna upp (och ev ner, men än mer kod och det lär bli avancerat nog ändå) från 0 - 9 med en eller två knappar. D

Dessa siffror/inmatning matas antingen till alla ints samtidigt men där sekvenseringen bara låter siffror skrivas i den int som är vald, eller så styr sekvenseringen bara inmatningen av siffrorna enbart till var och en åt gången, får se vad som är enklast eller ens möjligt längre fram.

När alla siffror är inmatade trycker jag en sista gång på samma knapp eller en annan knapp för att bekräfta och då läses värdet i alla delar i arrayn av på något vis och läggs ihop som en string på någon höger i något och sedan omvandlas till en float för att sedan kunna jämföras rakt av med datan från sensorn. Eller så läses detta av kontinuerligt hela tiden efter att man satt igång allt så det gått att ändra vakuum nivån när som, vet inte hur jag gjort.

Debounce från knapparna går att få till mjukvarumässigt ja, men tänkt att använda gummimembran så det ser lite snyggare ut och således då också slipper implementera debounce.

Det var teorin, är detta möjligtvis tankemässigt kodmässigt funktionellt som sådant?
Användarvisningsbild
hawkan
Inlägg: 2586
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 »

I princip så ska det väl fungera. Det är mycket pill-programmering, index upp och index ner och ++, jag hatar sånt men det måste såklart göras.

Du skulle kunna dela upp det i två steg.

T ex börja med att få logiken rätt med knapparna, så att det fungerar precis som du tänkt med att välja siffra och öka/minska och starta. Strunta i att ta hand om värden nu, det tar du sen när detta funkar bombsäkert. Tänk också på att detta ska ske inne i loop() och får inte stanna upp. Jag menar regleringen av trycket ska väl funka även om användaren går ifrån i tio minuter medans han håller på och ändrar värde.

När knapplogiken fungerar ska det inte vara några större problem att öka/minska värden vid knapptryckningar.
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 »

Det var bra och höra att teorin som så skulle kunna funka.

När nivån matas in första gången skall inte systemet starta förrän sista inmatningssiffran och en knapp trycks in för bekräftelse oavsett hur lång tid detta skulle ta och då jämförs värdet från sensorn med inmatat värde och startar igång pump och allt.

Så som jag tänkt bygga upp det så skall det inte spela någon roll om man väntar med att skriva in alla siffror i början eller när det sedan är igång då ingen väntetid eller dylikt kommer att vara involverad mer än pga en själv mha knapptryckningen, allt går sedan i realtid så att säga när det är i gång och inmatat värde jämförs hela tiden 5 ggr i sekunden med värdet från sensorn.

Nej, öka och minska ett värde i en int med en tryckknapp som så är inga problem, har sett sett diverse exempel med knappar involverat på nätet dock inget som jag vill ha det men har idéer om hur det skall göras så det ser jag inte som några problem.

Att få en array att stega upp och ev ned genom de tillkopplade int:en som så med en eller två knappar skall jag nog också få ihop. "Bara" att ändra om lite i de exempel som finns med for loopar man sett med arrays och så att säga trycka in en knapptrycknings kod till detta istället och pilla lite.

Hur jag sedan skall få de inmatade värdena i de enskilda int:en och läsas av som ett likadant värde som det jag får från sensorn står det dock still med just nu men det får jag bråka med när det är dags med det och således inte nu och förmodligen inte heller en bra tid framåt då tyvärr annat börjar bli mer prioriterat nu.
Skriv svar