Und hier die Lib LCDBar.cpp selbst:
/*
LCDBar.h library for
- showing a bar diagram for positive values, or
- showing a line diagramm for positive and negative values
on a LCD display
Bsp.:
------------------------------------------------
LCDBar Balken; // erzeugt eine Instanz Balken aus der Klasse LCDBar
// Variablendeklarationen für den Anzeigebalken
int Wert = 0; // der anzuzeigende Rohwert
int MaxWert; // der maximal anzuzeigende Wert
In void setup:
Balken.CharacterdefinitionBar(); // für die Anzeige eines Balkendiagrammes für die Anzeige von positiven Werten
In void loop:
Balken.BalkenLinks(Wert, 100, 5, 0); // für die Anzeige eines Balkendiagrammes für die Anzeige von positiven Werten
Balken.StrichZentriert(Wert, 100, 5, 0); für ein zentriertes Liniendiagramm für die Anzeige von positiven UND negativen Werten
*/
#include "Arduino.h"
#include <Wire.h> // Wurde dazugenommen, da dies für das I2C Protokoll benötigt wird
#include "LiquidCrystal_I2C.h"
#include "LCDBar.h"
LiquidCrystal_I2C lcdB(0x27);
// Definition der LCD-Größe, um sie für andere Displays zentral ändern zu können
const int LCDSpaltenzahl = 10;
const int LCDZeilenzahl = 2;
LCDBar::LCDBar()
{
}
void LCDBar::BalkenLinks(int _Wert, int _MaxWert, int _StartPos, int _Zeile)
/*
_Wert: der anzuzeigende Wert zwischen Null und _MaxWert. Werte außerhalb werden nicht angezeigt
_MaxWert: der Skalenendwert, bis zu diesem wird _Wert angezeigt
_StartPos: Die Spalte des LCD Displays, ab der der Balken anfängt. Damit kann vor dem Balken Platz geschaffen werden für Infos wie den direkten Zahlenwert oder der Variablenname
_Zeile: Die Zeile, in der der Balken geschrieben werden soll, also "0" für die erste Zeile, und "1" für die zweite Zeile
*/
{
// Die Routine geht von einem zweizeiligem Display mit je 10 Spalten aus.
// Bei pixelgenauer Auflösung der 5*7 Charakter sind das insgesamt
// 5 * 10 = 50 mögliche Spaltenpositionen
lcdB.begin (LCDSpaltenzahl, LCDZeilenzahl);
int _CPos = _StartPos; // das ist die Cursorposition
// int _WertPos = constrain( map (_Wert, 0, _MaxWert, _StartPos * 5, 50), _StartPos * 5, 50);
int _WertPos = constrain( map (_Wert, 0, _MaxWert, _StartPos * 5, 5*LCDSpaltenzahl), _StartPos * 5, 5*LCDSpaltenzahl);
// schreiben der Zeichen nach rechts ab der Cursorposition
while (_CPos < _WertPos / 5)
{
lcdB.setCursor(_CPos, _Zeile);
lcdB.write(4); //voll ausgefülltes Rechteck
_CPos++;
}
// Feinberechnung und Anzeige der Einzelpixelspalten:
lcdB.setCursor(_CPos, _Zeile);
lcdB.write(_WertPos % 5);
_CPos++;
// jetzt bis zum Ende (Spalte 10 bei 2*10 Display) mit Leerzeichen auffüllen
while (_CPos < 10)
// while (_CPos < LCDSpaltenzahl)
{
lcdB.setCursor(_CPos, _Zeile);
lcdB.write(32);
_CPos++;
}
}
void LCDBar::StrichZentriert(int _Wert, int _MaxWert, int _StartPos, int _Zeile)
/*
_Wert: der anzuzeigende Wert zwischen Null und _MaxWert. Werte außerhalb werden nicht angezeigt
_MaxWert: der Skalenendwert, bis zu diesem wird _Wert angezeigt
_StartPos: Die Spalte des LCD Displays, ab der der Balken anfängt. Damit kann vor dem Balken Platz geschaffen werden für Infos wie den direkten Zahlenwert oder der Variablenname
_Zeile: Die Zeile, in der der Balken geschrieben werden soll, also "0" für die erste Zeile, und "1" für die zweite Zeile
*/
{
int _CPos = _StartPos; // das ist die Cursorposition
// Die Routine geht von einem zweizeiligem Display mit je 10 Spalten aus.
// Bei pixelgenauer AUflösung der 5*7 Charakter sind das insgesamt
// 5 * 10 = 50 mögliche Spaltenpositionen
int _WertPos = constrain( map (_Wert, 0, _MaxWert, 5*(_StartPos / 2)+5*LCDSpaltenzahl/2, 5*LCDSpaltenzahl), _StartPos * 5, 5*LCDSpaltenzahl);
// Löschen der Zeichen bis vor dem Strich
while (_CPos < _WertPos / 5)
{
lcdB.setCursor(_CPos, _Zeile);
lcdB.write(32);
_CPos++;
}
// Feinberechnung und Anzeige der Einzelpixelspalten:
lcdB.setCursor(_CPos, _Zeile);
lcdB.write(_WertPos % 5);
_CPos++;
// jetzt bis zum Ende (Spalte 15) mit Leerzeichen auffüllen
while (_CPos < LCDSpaltenzahl)
{
lcdB.setCursor(_CPos, _Zeile);
lcdB.write(32);
_CPos++;
}
// Dann den Nullstrich ziehen
if (_Wert > 0)
{ // Der Nullstrich wird im Zeichen links von der wahren Mitte generiert, da sonst weitere Sonderzeichen zu definieren wären
lcdB.setCursor(_StartPos / 2 + 7, _Zeile);
lcdB.write(4);
}
else
{ // Der Nullstrich wird im Zeichen rechts von der wahren Mitte generiert, da sonst weitere Sonderzeichen zu definieren wären
lcdB.setCursor(_StartPos / 2 + 8, _Zeile);
lcdB.write(byte(0));
}
// Wenn außerhalb des Anzeigebereichs dann Anzeigen der Pfeile
if (_Wert > _MaxWert)
{
lcdB.setCursor(LCDSpaltenzahl-1,_Zeile);
lcdB.write(6);
}
if (_Wert < - _MaxWert)
{
lcdB.setCursor(_StartPos,_Zeile);
lcdB.write(5);
}
}
void LCDBar::CharacterdefinitionBar()
{
// kreieren der Sonderzeichen für den Balken
byte links[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
byte linksMitte[8] = {
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
B11000,
};
byte Mitte[8] = {
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
B11100,
};
byte Mitterechts[8] = {
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
B11110,
};
byte rechts[8] = {
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
B11111,
};
// Zuordnung der 5 selbstdefinierten Zeichen zu den insgesamt
// 8 möglichen Sonderzeichen des LCD Displays
lcdB.createChar(0, links);
lcdB.createChar(1, linksMitte);
lcdB.createChar(2, Mitte);
lcdB.createChar(3, Mitterechts);
lcdB.createChar(4, rechts);
}
void LCDBar::CharacterdefinitionLine()
{
// kreieren der Sonderzeichen für den Strich
byte links[8] = {
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
B10000,
};
byte linksMitte[8] = {
B01000,
B01000,
B01000,
B01000,
B01000,
B01000,
B01000,
};
byte Mitte[8] = {
B00100,
B00100,
B00100,
B00100,
B00100,
B00100,
B00100,
};
byte Mitterechts[8] = {
B00010,
B00010,
B00010,
B00010,
B00010,
B00010,
B00010,
};
byte rechts[8] = {
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
B00001,
};
byte Pfeillinks[8] = {
B00000,
B00100,
B01100,
B11111,
B01100,
B00100,
B00000,
};
byte Pfeilrechts[8] = {
B00000,
B00100,
B00110,
B11111,
B00110,
B00100,
B00000,
};
// Zuordnung der 5 selbstdefinierten Zeichen zu den insgesamt
// 8 möglichen Sonderzeichen des LCD Displays
lcdB.createChar(0, links);
lcdB.createChar(1, linksMitte);
lcdB.createChar(2, Mitte);
lcdB.createChar(3, Mitterechts);
lcdB.createChar(4, rechts);
lcdB.createChar(5, Pfeillinks);
lcdB.createChar(6, Pfeilrechts);
}