Go Down

Topic: Progress Bar Problem (Read 3448 times) previous topic - next topic

TSW68

Hallo freunde der Programier Kunst,

Habe eine Progress Bar die Super funktioniert
nur ein Proplem habe Ich. Progress Bar zeigt nur in Prozent an.
Also 0 - 100
Mein Problem ist das ich gerne einen Wert ausgeben möchte der
bis 5000 geht und der dann Prozentual in der Progress Bar angezeigt wirt.

Hier mein Code :

Code: [Select]

#include <Wire.h>
#include <LiquidCrystal_I2C.h>


LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);


  const int LCD_NB_ROWS = 4 ;
  const int LCD_NB_COLUMNS = 20 ;



  byte START_DIV_0_OF_1 [ 8 ] = {
  B01111 ,
  B11000 ,
  B10000 ,
  B10000 ,
  B10000 ,
  B10000 ,
  B11000 ,
  B01111
  };  // Char start 0/1

  byte START_DIV_1_OF_1 [ 8 ] = {
  B01111 ,
  B11000 ,
  B10011 ,
  B10111 ,
  B10111 ,
  B10011 ,
  B11000 ,
  B01111
  };  // Tank beginning 1/1

  byte DIV_0_OF_2 [ 8 ] = {
  B11111 ,
  B00000 ,
  B00000 ,
  B00000 ,
  B00000 ,
  B00000 ,
  B00000 ,
  B11111
  };  // Medium tank 0/2

  byte DIV_1_OF_2 [ 8 ] = {
  B11111 ,
  B00000 ,
  B11000 ,
  B11000 ,
  B11000 ,
  B11000 ,
  B00000 ,
  B11111
  };  // Medium tank 1/2

  byte DIV_2_OF_2 [ 8 ] = {
  B11111 ,
  B00000 ,
  B11011 ,
  B11011 ,
  B11011 ,
  B11011 ,
  B00000 ,
  B11111
  };  // Medium tank 2/2

  byte END_DIV_0_OF_1 [ 8 ] = {
  B11110 ,
  B00011 ,
  B00001 ,
  B00001 ,
  B00001 ,
  B00001 ,
  B00011 ,
  B11110
  };  // late tank 0/1

  byte END_DIV_1_OF_1 [ 8 ] = {
  B11110 ,
  B00011 ,
  B11001 ,
  B11101 ,
  B11101 ,
  B11001 ,
  B00011 ,
  B11110
  };  // Char end 1/1

 void setup_progressbar() {


  lcd.createChar(0, START_DIV_0_OF_1);
  lcd.createChar(1, START_DIV_1_OF_1);
  lcd.createChar(2, DIV_0_OF_2);
  lcd.createChar(3, DIV_1_OF_2);
  lcd.createChar(4, DIV_2_OF_2);
  lcd.createChar(5, END_DIV_0_OF_1);
  lcd.createChar(6, END_DIV_1_OF_1);
}

void draw_progressbar(byte lcdwert) {


  lcd.setCursor(0, 0);
  lcd.print(lcdwert);
  lcd.print(F(" %  "));

  lcd.setCursor(0, 1);


  byte nb_columns = map(lcdwert, 0, 100, 0, LCD_NB_COLUMNS * 2 - 2);
  // Chaque caractére affiche 2 barres verticales, mais le premier et dernier caractére n'en affiche qu'une.


  for (byte i = 0; i < LCD_NB_COLUMNS; ++i) {

    if (i == 0) { // Premiére case
 

      if (nb_columns > 0) {
        lcd.write(1); // Char début 1 / 1
        nb_columns -= 1;
 
      } else {
        lcd.write((byte) 0); // Char début 0 / 1
      }
 
    } else if (i == LCD_NB_COLUMNS -1) { // Derniére case
 

      if (nb_columns > 0) {
        lcd.write(6); // Char fin 1 / 1
 
      } else {
        lcd.write(5); // Char fin 0 / 1
      }
 
    } else { // Autres cases
 

      if (nb_columns >= 2) {
        lcd.write(4); // Char div 2 / 2
        nb_columns -= 2;
 
      } else if (nb_columns == 1) {
        lcd.write(3); // Char div 1 / 2
        nb_columns -= 1;
 
      } else {
        lcd.write(2); // Char div 0 / 2
      }
    }
  }
}



void setup(){


  lcd.begin(LCD_NB_COLUMNS, LCD_NB_ROWS);
  setup_progressbar();
  lcd.clear();
}


void loop(){

  byte lcdwert = 50;


  draw_progressbar(lcdwert);
}


Ich hoffe ihr könnt mir Helfen.

Liebe Grüße tsw68

agmue

5000/50 = 100

lcdwert = wert/50

Was hälst Du davon?
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

TSW68

Funktioniert leider nicht mein wert ändert sich zwischen 0 und 5000

nehme ich jetzt z.B 800 bei deiner rechnung 800/50 = 16 das sind keine Prozent

Rechnen wir mal 800/400 das dind 2 aber nicht 50%





MicroBahner

#3
Jan 30, 2018, 09:52 am Last Edit: Jan 30, 2018, 09:53 am by MicroBahner
nehme ich jetzt z.B 800 bei deiner rechnung 800/50 = 16 das sind keine Prozent

Rechnen wir mal 800/400 das dind 2 aber nicht 50%
???? wie rechnest Du ? 800 sind definitv 16% von 5000.
Was willst Du denn nun anzeigen??
Gruß, Franz-Peter

TSW68

Mein wert ändert sich doch zwischen sagen wir mal 50 und 5000.

ist mein wert 50 = 0%
         wert 5000 = 100 %

Sorry hätte ich sofort schreiben sollen.

MFG


DerLehmi

Am einfachsten wäre hier wohl die Map()-Funktion

agmue

#6
Jan 30, 2018, 10:26 am Last Edit: Jan 30, 2018, 10:47 am by agmue
Das funktioniert:

Code: [Select]
void loop() {
  for (uint16_t zahl = 0; zahl <= 5000; zahl += 10)
  {
    byte lcdwert = zahl / 50;
    draw_progressbar(lcdwert);
    lcd.setCursor(0, 2);
    lcd.print("Wert: ");
    lcd.print(zahl);
    lcd.print("   ");
    delay(100);
  }
}




Am einfachsten wäre hier wohl die Map()-Funktion
Könnte man auch hier ändern:
Code: [Select]
  byte nb_columns = map(lcdwert, 0, 100, 0, LCD_NB_COLUMNS * 2 - 2);
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

SkobyMobil

agmue, mein kleiner Angeber… ;)
wie hast Du denn den perfekten BarGraph auf das DotMatrix bekommen?
Habe ich ja noch nie gesehen, der ist richtig gut.
Zu Fuss, oder mit einer Lib? Ob Du wohl mehr Info dazu verraten möchtest?
Vielen Dank für Deine Mühe.
Gruß und Spaß
Andreas
die zweite Maus bekommt den Speck...

TSW68

Das sieht ja richtig gut aus kann es aber erst später ausprobieren.
Bin davon überzeugt das es funktioniert .
Sage mal vielen Dank für die Hilfe !
Melde mich später noch einmal um zu berichten.

Grüsse tsw68

DerLehmi

Quote
wie hast Du denn den perfekten BarGraph auf das DotMatrix bekommen?
Habe ich ja noch nie gesehen, der ist richtig gut.
Zu Fuss, oder mit einer Lib? Ob Du wohl mehr Info dazu verraten möchtest?
-->Siehe Code im Eingangspost ;)
Lustigerweise hat der Programmierer hier die einzelnen Bestandteile des Graphen als Zeichen generiert, und zeigt diese ne nach Bedarf an, wodurch der Bargraph entsteht.

Klaus_ww

Quote
Lustigerweise hat der Programmierer hier die einzelnen Bestandteile des Graphen als Zeichen generiert, und zeigt diese ne nach Bedarf an, wodurch der Bargraph entsteht.
Naja, anders geht's bei den Dingern ja auch nicht, oder?
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

michael_x

Das wirklich schöne ist das erste und letzte Element mit dem Rand.

dony

#12
Jan 30, 2018, 02:20 pm Last Edit: Jan 30, 2018, 02:23 pm by dony
Hallo,

Der BarGraph ist wirklich Toll! :)
Läuft Super mit der loop von agmue, ich musste allerdings noch ein paar Zeilen verbessern.

Code: [Select]

LiquidCrystal_I2C lcd(0x27, 20, 4);

const int LCD_NB_ROWS = 4 ;  // sollte vor LiquidCrystal
const int LCD_NB_COLUMNS = 20 ;

/* In der Setup  */
lcd.init();
lcd.backlight();
lcd.begin(LCD_NB_COLUMNS, LCD_NB_ROWS);

Vielen Dank!

lg dony
Grüße, Donny

TSW68

Hi,
habe es gerade ausprobiert und bei einem wert von 5000 funktioniert es so wie es soll.
Jetzt nehme ich eine andere Zahl z.B 800 kommt es nicht bis zu 100 %

Möchte jeden wert von 50 bis 5000 eingeben können und nicht nur 5000
also jeden wert bis 100% höchzählen.
 Später kommen noch zwei Push Buttons für hoch runter

SkobyMobil

Hallo,
ohh, lesen hilft.  :-[
Gruß und Dank
Andreas
die zweite Maus bekommt den Speck...

Go Up