> Start > Schaltungen
 
Ein Analoginstrument wird auf ein graphisches Display gezeichnet

Ein Zeigerinstrument soll auf ein graphisches Display gezeichnet werden.

Dazu wurde verwendet:
- Arduino Mega 2560
- Graphic Display 12864 B mit SPI Anschluß und 128x64 Bildpunkten
- Die Arduino Library u8glib

Hier wird die USB Versogungsspannung VCC des Arduino Boards gemessen mit Hilfe der 3,3 V Spannung und dem internen AD Wandler an Pin 14. Dazu ist eine Brücke von 3,3V zu A14 notwendig.

Das Display wird seriell über den SPI Bus und den angebauten Wandler angesprochen.
Die graphische Library u8glib wird eingebunden.

Die fertige Arduino Datei zum Download.

Hier nun der Arduino Programmcode mit Kommentaren:

// 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()

Fragen hierzu kann und werde ich aus Zeitgründen nicht beantworten.
Hilfreiche Links sind: Arduino Homepage, u8glib, VCC messen.

Ein Analoginstrument wird auf ein graphisches Display gezeichnet

letzte Änderung 3.2014