// Ein Zeigerinstrument auf einem graphischen Display darstellen
// Hier wurde verwendet:
// Arduino Mega
// Graphikdisplay 12864 B mit SPI Anschluß und 128x64 Bildpunkten
//
// Matthias Busse 29.3.2014 Verson 1.0
// Display Anschluss und Definition
//--------------------------------
// Universal 8bit Graphics Library einbinden
// http://code.google.com/p/u8glib/
// Obere Reihe: SID > D11 CS > D12 SCK > D13
// Untere Reihe GND > GND -------- VCC > 5V
#include "U8glib.h"
U8GLIB_ST7920_128X64_1X u8g(13, 11, 12); // SPI MOSI CS
void setup(void) {
u8g.setColorIndex(1); // Display Farben auf SW einstellen
}
void loop(void) {
float vcc;
// Hier kommt die Messung von VCC.
// Erklärung unter:
// http://nmea.de/schaltung/vcc-messen-beim-arduino.mega.html
vcc = 3.30 / analogRead(14) * 1023;
// Und dann die Ausgabe
u8g.firstPage();
do {
drawZeigerInstrument(12,12,100,50,6,vcc,6);
u8g.setFont(u8g_font_6x13);
u8g.setPrintPos(35,10);
u8g.print("VCC: ");
u8g.setPrintPos(60,10);
u8g.print(vcc,3);
} while( u8g.nextPage() );
delay(1000);
}
void drawZeigerInstrument(int xli, int yob, int bre, int hoe, float ska, float anz, int tei) {
// Analoganzeiger zeichnen
// xli-----bre--.--yob-
// | . |
// hoe . |
// | . |
// ---------o----------
// xli: X linke Begrenzung
// yob: Y obere Begrenzung
// bre: X Breite
// hoe: Y Höhe
// ska: Skala Endausschlag
// anz: Angezeigter Wert
// tei: Teilung der Skala, z.B 10 Teilungen = 11 Striche
//
// Matthias Busse 29.3.2014 Version 1.0
int xcenter, ycenter, radius, xzeiger, yzeiger;
int k, x1, x2, y1, y2;
float teiler, pi=3.1416;
xcenter=xli+(bre/2);
ycenter=yob+hoe-1;
if(ycenter > u8g.getHeight()) ycenter = u8g.getHeight()-2;
radius=bre/2;
if(hoe<radius) radius=hoe;
// Kreisbogen und Zentrumskreis
u8g.drawCircle(xcenter,ycenter,2);
u8g.drawCircle(xcenter,ycenter,radius*0.95,U8G_DRAW_UPPER_LEFT);
u8g.drawCircle(xcenter,ycenter,radius*0.95,U8G_DRAW_UPPER_RIGHT);
// Skalenzahlen
u8g.setFont(u8g_font_5x7);
u8g.setPrintPos(xcenter-(radius*0.8),ycenter-1);
u8g.print("0");
u8g.setPrintPos(xcenter-(u8g.getStrWidth("0.00")/2.0),ycenter-(radius*0.8)+u8g.getFontAscent()+2);
u8g.print(ska/2);
u8g.setPrintPos(xcenter+(radius*0.8)-u8g.getStrWidth("1.00"),ycenter-1);
u8g.print(ska);
// Zeiger
xzeiger= xcenter-(cos(anz/ska*pi)*radius); // x Endposition des Zeigers
yzeiger= ycenter-(sin(anz/ska*pi)*radius); // y Endposition des Zeigers
u8g.drawLine(xcenter, ycenter, xzeiger, yzeiger);
// Skalenstriche
for(k=0; k<=tei; k++) {
teiler=ska/tei*k;
x1=xcenter-(cos(teiler/ska*pi)*radius*0.80);
x2=xcenter-(cos(teiler/ska*pi)*radius*0.92);
y1=ycenter-(sin(teiler/ska*pi)*radius*0.80);
y2=ycenter-(sin(teiler/ska*pi)*radius*0.92);
u8g.drawLine(x1,y1,x2,y2);
}
} // drawZeigerInstrument()
|