Frage an die Mathe Cracks unter den Programmierern ..

Guten Abend arduino Kollegen!

ich habe ein Problem.
Folgendes ich arbeite an einem arduino projekt und brauche Hilfe.

Ich habe ein Nokia 5110 Display.
Auf dem möchte ich einen Messwert in 15 Pixel = 100 % darstellen.
Mein eigentlicher Messwert beträgt aber 0 bis 65535 ebenfalls 100% .. von einem BH1750

Hat jemand eine Idee für eine Formel in C++ ?
Bzw. hat jemand eine Idee für die Formel mit logarithm. Darstellung des Messwertes ?

hier sind meine verwendeten Codefragmente:

void lux() {

// uint16_t lux = lichtsensor.GetLightIntensity();               // Liest Lux Wert ein
// bargraph(lux);                                                // Ausgabe des Luxwertes als Grafik

 float lux = lichtsensor.GetLightIntensity();                 // Liest Lux Wert ein
 float prozent = map(lux, 0, 65535, 0, 100);
 bargraph(lux);                                                // Ausgabe des Luxwertes als G

 display.setCursor(5, 39);                                      // Position (x,y)
 display.setTextSize(1);                                        // Textgröße 1
 display.setTextColor(BLACK);                                   // Textfarbe schwarz
 display.print("LUX");                                          // LUX auf Display ausgeben
}

// Zeichnet eine Bargraph Box

void bargraph(int prozent) {
 //prozent = map(prozent, 1, 65535, 1, 100);               // Faktor festsetzen für Lux Meter 0 bis 65535 Lux = 0 bis 100%
 display.drawRect(24, 39, 40, 7, BLACK);                // Rechteck als Rahmen (x1,y1,x2,y2)
 display.fillRect(25, 38, [b]*****[/b] , 6, BLACK);           // Gefülltes Rechteck für Anzeige des Wertes
 display.display();                                     
 // delay(500);                                            // 1/2 Sec. Delay
}

an die stelle mit den ***** kommt die Formel ..

Vielen Dank vorab.

LG Stefan

Hallo zusammen,

mir ist gerade eine weitere möglichket eingefallen.

gibts ein array bei dem eine tabelle wie zb. diese die zahlen 0 bis 15 zurückliefert?

int tabelle[16] = {0, 346, 959, 2012, 7056, 10045, 18224, 28733, 36755, 39667, 42334, 45654, 50556, 52456, 58325, 65536};

eigentlich fällt mir da nur die möglichkeit ein mit

if wert >= tabelle〔0〕 dann luxwert = 1

.
.
.
usw ..

ich probiere es mal damit

Gute N 8 cht !

Stefan

stevie72:
eigentlich fällt mir da nur die möglichkeit ein mit

if wert >= tabelle〔0〕 dann luxwert = 1

Der Bereich 0...65535 stellt einen 16-bit Wert dar.
Du möchtest die Variable auf einen Bereich von 0...15 mappen, was ein 4-bit Wert ist.

Also schiebst Du die Bits im Wert um 12 Bits nach rechts, also 12 Bits fallen raus, 4 bleiben übrig:

  wert= wert>>12;

Fertig.

Hallo Jurs,

erst mal danke für Deinen Vorschlag.
Das umzusetzen fällt mir noch sehr schwer - bin newcommer.
Wie das bitshifting funktioniert ist mir klar nur bei mir hapert es noch etwas am umsetzen in code…
Könntest Du so freundlich sein und mir ein beispiel erstellen um davon zu lernen?

ich habe nachgedacht und dabei ist das rausgekommen …

wenns dann funktionieren würde :frowning:

if (lux >= 240){
 wert = 0
}
if (lux >= 356 ){
 wert = 1;
}
if (lux >= 478){
 wert = 2
}
if (lux >= 567){
 wert = 3
}
if (lux >= 890){
wert = 4
}
if (lux >= 1034){
 wert = 5
}
if (lux >= 2015){
 wert = 6
}
if (lux >= 3255){
 wert = 7
}
if (lux >= 6456){
 wert = 8
}
if (lux >= 8456){
 wert = 9
}
if (lux >= 10500){
 wert = 10
}
if (lux >= 17000){
 wert = 11
}
if (lux >= 25789){
 wert = 12
}
if (lux >= 33698){
 wert = 13
}
if (lux >= 55000){
 wert = 14
}
if (lux >= 65000){
 wert = 15
}

Grüße Stefan

Da stimmt etwas nicht ...

void lux() {
 float lux = lichtsensor.GetLightIntensity();                 // Liest Lux Wert ein
 lux= lux>>12;
 bargraph(lux);                                                // Ausgabe des Luxwertes 
 display.setCursor(5, 39);                                      // Position (x,y)
 display.setTextSize(1);                                        // Textgröße 1
 display.setTextColor(BLACK);                                   // Textfarbe schwarz
 display.print("LUX");                                          // LUX auf Display ausgeben
}

// Zeichnet eine Bargraph Box

void bargraph(int messwert) {
 display.drawRect(24, 39, 40, 7, BLACK);                // Rechteck als Rahmen (x1,y1,x2,y2)
 display.fillRect(24, 39, 0, 24 + lux, BLACK);           // Gefülltes Rechteck für Anzeige des Wertes 
 delay(500);                                            // 1/2 Sec. Pause
}

stevie72:
ich habe nachgedacht und dabei ist das rausgekommen ..

wenns dann funktionieren würde :frowning: ...

Ach so, logarithmische Skaliereung. Da müßte man dann tatsächlich eine Rechnung machen und das Schubsen von einigen Bits reicht dafür nicht. Die Bitschubserei '>>12' skaliert nur linear herunter.

Und Deine "Umrechnung" per Tabelle würde natürlich auch funktionieren, wenn Du wenigstens die korrekte Syntax von Zuweisungen beherrschen würdest. Also dass am Ende eines C-Befehls ein Semikolon gesetzt werden muß, beispielsweise.

Hier Deine Tabelle als Funktion geschrieben und der Bereichsanfangswert etwas korrigiert:

byte wertAusTabelle(unsigned int lux)
{
  byte wert=0;
  if (lux >= 356 ){
    wert = 1;
  }
  if (lux >= 478){
    wert = 2;
  }
  if (lux >= 567){
    wert = 3;
  }
  if (lux >= 890){
    wert = 4;
  }
  if (lux >= 1034){
    wert = 5;
  }
  if (lux >= 2015){
    wert = 6;
  }
  if (lux >= 3255){
    wert = 7;
  }
  if (lux >= 6456){
    wert = 8;
  }
  if (lux >= 8456){
    wert = 9;
  }
  if (lux >= 10500){
    wert = 10;
  }
  if (lux >= 17000){
    wert = 11;
  }
  if (lux >= 25789){
    wert = 12;
  }
  if (lux >= 33698){
    wert = 13;
  }
  if (lux >= 55000){
    wert = 14;
  }
  if (lux >= 65000){
    wert = 15;
  }
  return wert;
}

Wenn man Dir hinter 15 Befehle 15 mal ein Semikolon setzen muss, damit der Code wenigstens kompilierbar wird, scheinst Du Dich bisher nicht mal in die absoluten Anfängergrundlagen eingearbeitet zu haben.

Lerne mal die Basics der Programmiersprache!

Hallo Jurs!

in der tat - simikolons und ich wir sind uns nicht grün .. die vergesse ich öffters...
Ich werde ab jetzt mehr darauf achten ! :fearful:

VERSPOCHEN !

Vielen Vielen Dank für Deine Gedult und Mühe mit mir!
und vor allem Danke für den Code!

Grüße und Gute N 8 cht - Stefan

stevie72:
Hat jemand eine Idee für eine Formel in C++ ?

Soll es denn logarithmisch sein?

Deine Wertetabelle unten läßt etwas anders vermuten:
Zwischenablage02.jpg

Ich habe mir mal erlaubt ein Excel file zu erstellen.

In dem ist deine Kurve einer Exponentiellen gegenübergestellt.
Durch Ändern des Wertes “a” (gelbes Feld) kannst du die Krümmung / Steilheit der Kurve einstellen.

Der Code, der die Kurve dann abbildet, wird automatisch erzeugt, und kann einfach kopiert werden (blaues Feld).

Mappe1.zip (8.33 KB)

@ Gunther!

Vielen vielen Dank für Deine Mühe ! Ich habe Deine Werte als Grundlage verwendet und siehe da - DAS IST ES !

Klappt prima!

Danke schön !

Stefan