// Programm für Arduino Giga mit Bildschirm // Giga_008_Poti_Scala // LED_PR1 = D51/PE5, LED_PR2 = D40/PE6, PR1 = A11/PA0_C, PR2 = A10/PA1_C #include #include #include "Fonts/FreeMonoBold18pt7b.h" GigaDisplay_GFX display; // create the object #include #define PR1 A11 #define PR2 A10 #define LED_PR1 51 #define LED_PR2 40 #define DRE_A 35 #define DRE_B 36 #define DRE_KN 34 #define GIGA_RED 86 #define GIGA_GREEN 87 #define GIGA_BLUE 88 // Einstellungen für Scala und Rahmen #define SCALAEIN 0 // 1 = Scala eingeschaltet (Scala selbst, ohne Rahmen) #define RAHMENEIN 1 // 1 = Rahmen eingeschaltet #define MITME 2 // 1 = mittlere Marker eigene Größe, 0 = mittlere Marker allgemeine Größe #define MITMETL 3 // 1 = mittlere Marker oben/links mit einer ungeraden Anzahl von Marker (und zwei Marker mit einer geraden Anzahl) eingeschaltet #define MITMETR 4 // 1 = mittlere Marker unten/rechts mit einer ungeraden Anzahl von Marker (und zwei Marker mit einer geraden Anzahl) eingeschaltet #define METLINKS 5 // 1 = alle Marker (außer mittleren) oben/links eingeschaltet #define METRECHTS 6 // 1 = alle Marker (außer mittleren) unten/rechts eingeschaltet #define ZIFLINKS 7 // 1 = Zeichen oben/links eingeschaltet #define ZIFRECHTS 8 // 1 = Zeichen unten/rechts eingeschaltet #define ZIFPOS 9 // 0 = Zeichenlage entsprechend Marker, 1 = Zeichenlage zwischen Marker #define NULLUO 10 // 0 = Null unten/links, 1 = Null oben/rechts #define VERTHOR 11 // 0 = vertikale Skala, 1 = horizontale Skala #define GRUND 12 // leere Teil der Farbskala hat die Farbe 0 = Grundfarbe, 1 = Hintergrundfarbe #define GRADIENT 13 // wirkende Teil der Skala: 0 = Scalafarbe, 1 = Gradient von Scalafarbeanf zu Scalafarbe // Muster /* ((0<<15) // aus technischen Grund, unwirksam |(1<mode |= mode; } void reset_scala_mode(scaladata *userscala, uint16_t mode){ userscala->mode &= ~(mode); } void ust_scala_mode(scaladata *userscala, uint16_t mode){ userscala->mode = mode; } uint16_t get_scala_mode(scaladata *userscala, uint16_t mode){ return userscala->mode & mode; } // Hilfsfunktion // Rahmen zeichnen. einaus: wenn 0, Hintergrundfarbe benutzen (Rahmen vom Bildschirm löschen) void scala_rahmen(scaladata *userscala, uint8_t einaus){ uint16_t mode = userscala->mode; // xo,yo,xu-xo+1,yu-yo+1,rahmendicke = dicke,rahmenfarbe = farbe if((mode & (1<rahmendicke; if(rdicke < 1){ return; } int16_t xo = userscala->xo; int16_t xu = userscala->xu; int16_t yo = userscala->yo; int16_t yu = userscala->yu; uint16_t farbe = userscala->hintergrundfarbe; if(einaus) farbe = userscala->rahmenfarbe; if(rdicke < 2){ // wenn 1 Pixel display.drawRect(xo,yo,xu-xo+1,yu-yo+1,farbe); }else{ // wenn mehr als 1 Pixel int16_t breite = xu-xo+1; int16_t hoehe = yu-yo+1; display.fillRect(xo,yo,rdicke,hoehe,farbe); // links display.fillRect(xo+breite-rdicke,yo,rdicke,hoehe,farbe); // rechts display.fillRect(xo+rdicke,yo,breite-rdicke*2,rdicke,farbe); // obere display.fillRect(xo+rdicke,yo+hoehe-rdicke,breite-rdicke*2,rdicke,farbe); // untere } } // Hilfsfunktion // Marker in der Mitte zeichnen einaus: wenn 0, Hintergrundfarbe benutzen (Marker vom Bildschirm löschen) void scala_m_metka(scaladata *userscala, uint8_t einaus){ uint16_t mode = userscala->mode; // wenn mittlere Marker von keiner Seite eingeschaltet, aus if(((mode & (1<hintergrundfarbe; if(einaus) farbe = userscala->rahmenfarbe; int16_t xo = userscala->xo; int16_t xu = userscala->xu; int16_t yo = userscala->yo; int16_t yu = userscala->yu; int16_t rdicke = userscala->rahmendicke; uint8_t mzahl = userscala->mzahl; int16_t m_metka; int16_t m_mdicke; if(mode & (1<m_metka; m_mdicke = userscala->m_mdicke; }else{ m_metka = userscala->metka; m_mdicke = userscala->mdicke; } if(mode & (1<mode; // wenn Marker weder linls noch rechts eingeschaltet, aus if(((mode & (1<hintergrundfarbe; if(einaus) farbe = userscala->rahmenfarbe; int16_t xo = userscala->xo; int16_t xu = userscala->xu; int16_t yo = userscala->yo; int16_t yu = userscala->yu; int16_t rdicke = userscala->rahmendicke; uint8_t mzahl = userscala->mzahl; int16_t metka = userscala->metka; int16_t mdicke = userscala->mdicke; int16_t innenscala = (yu - yo) - 2 * rdicke; // Höhe (Länge) der Skala ohne Rahmen, vertikale Scala if(mode & (1<xo+mdicke;i-=diff){ display.fillRect(i,ymo,mdicke,metka,farbe); } } if(mode & (1<xo+mdicke;i-=diff){ display.fillRect(i,yu,mdicke,metka,farbe); } } }else{ // Bei einer geraden Anzahl von Marker von der Mitte nach oben und unten, erste Marker überspringen if(mode & (1<xo+mdicke;i-=diff){ display.fillRect(i,ymo,mdicke,metka,farbe); } } if(mode & (1<xo+mdicke;i-=diff){ display.fillRect(i,yu,mdicke,metka,farbe); } } } }else{ // vertikal int16_t mitte = (yo + yu - mdicke) / 2; int16_t xmo = xo - metka; int16_t diff = (yu-yo-2*rdicke)/(mzahl - 1); // Scala zwischen Marker if(mzahl % 2){ // Bei einer ungeraden Anzahl von Marker von der Mitte nach oben und unten if(mode & (1<yo+mdicke;i-=diff){ display.fillRect(xmo,i,metka,mdicke,farbe); } } if(mode & (1<yo+mdicke;i-=diff){ display.fillRect(xu,i,metka,mdicke,farbe); } } }else{ // Bei einer geraden Anzahl von Marker von der Mitte nach oben und unten, erste Marker überspringen if(mode & (1<yo+mdicke;i-=diff){ display.fillRect(xmo,i,metka,mdicke,farbe); } } if(mode & (1<yo+mdicke;i-=diff){ display.fillRect(xu,i,metka,mdicke,farbe); } } } } } // Hilfsfunktion // Scalenziffer zeichnen einaus: wenn 0, Hintergrundfarbe benutzen (Marker vom Bildschirm löschen) void scala_ziffer(scaladata *userscala, uint8_t einaus){ uint16_t mode = userscala->mode; // wenn weder rechte noch linke Marker eingeschaltet, aus if(((mode & (1<hintergrundfarbe; if(einaus) farbe = userscala->zifferfarbe; uint16_t hintergrundfarbe = userscala->hintergrundfarbe; int16_t xo = userscala->xo; int16_t xu = userscala->xu; int16_t yo = userscala->yo; int16_t yu = userscala->yu; int16_t rdicke = userscala->rahmendicke; uint8_t mzahl = userscala->mzahl; int16_t breite = xu - xo + 1; int16_t hoehe = yu - yo + 1; int16_t zifscala_xl = userscala->zifscala_xl; // horizontale (vertikale) Einzug von den Rahmen links (oben) int16_t zifscala_yl = userscala->zifscala_yl; // vertikale (horizontale) Korrektur anhand der Skalenmarkierungen links (oben) int16_t zifscala_xr = userscala->zifscala_xr; // horizontaler (vertikaler) Einzug vom Rahmen für die Maßstabsangaben rechts (unten) int16_t zifscala_yr = userscala->zifscala_yr; // vertikale (horizontale) Korrektur anhand der Skalenmarkierungen rechts (unten) display.setFont(NULL); display.setTextSize(2); //adjust text size display.setTextColor(farbe,hintergrundfarbe); if(mode & (1<anfzif; //for(int16_t xd = metxo; xd < xu-rdicke; xd+diff){ for(int16_t i=0;i= 0)) display.print(" "); display.println(zifnum); } if(mode & (1<= 0)) display.print(" "); display.println(zifnum); } metxo -= diff; if(metxo < xo+rdicke) break; zifnum += userscala->difzif; } }else{ // vertikal int16_t mitte = (yo + yu) / 2; // Scalamitte nach Höhe int16_t diff = (yu-yo-2*rdicke)/(mzahl - 1); // zwischen Marker int16_t metyo = mitte - diff/2 - diff * ((mzahl / 2) - 1); // y-Position des linken Markers if(mzahl % 2) metyo = mitte - diff * (mzahl / 2); // wenn die Anzahl des Markers ungerade ist if(mode & (1<anfzif; //for(int16_t yd = metyo; yd < yu-rdicke; yd+diff){ for(int16_t i=0;i= 0)) display.print(" "); display.println(zifnum); } if(mode & (1<= 0)) display.print(" "); display.println(zifnum); } metyo += diff; if(metyo > yu-rdicke) break; zifnum += userscala->difzif; } } } // Hilfsfunktion // Gradientscala zeichnen void scala_gradient(scaladata *userscala, uint16_t xx){ int16_t af = userscala->scalafarbeanf; // Anfangsfarbe der Scala int16_t ef = userscala->scalafarbe; // Endfarbe der Scala uint16_t mode = userscala->mode; int16_t xo = userscala->xo; int16_t xu = userscala->xu; int16_t yo = userscala->yo; int16_t yu = userscala->yu; int16_t rdicke = userscala->rahmendicke; int16_t innenscala = (yu - yo) - 2 * rdicke; // Höhe (Länge) der Skala ohne Rahmen, vertikale Scala if(mode & (1<vollscala)*innenscala); // Höhe (Länge) des wirksamen Teils der Skala (ohne Rahmen) int16_t leer = innenscala - saule; // Höhe (Länge) des leeren Teils der Skala (ohne Rahmen) // Farben entpacken int16_t fru = (int16_t)((af & 0xf800)>>1); // Anfangsfarbe Rot int16_t fgu = (int16_t)((af & 0x07e0)<<4); // Anfangsfarbe Grün int16_t fbu = (int16_t)((af & 0x001f)<<10); // Anfangsfarbe Blau int16_t fro = (int16_t)((ef & 0xf800)>>1); // Endfarbe Rot int16_t fgo = (int16_t)((ef & 0x07e0)<<4); // Endfarbe Grün int16_t fbo = (int16_t)((ef & 0x001f)<<10); // Endfarbe Blau int16_t frd = (fro - fru)/(int16_t)innenscala; // Gradient Rot int16_t fgd = (fgo - fgu)/(int16_t)innenscala; // Gradient Grün int16_t fbd = (fbo - fbu)/(int16_t)innenscala; // Gradient Blau if(mode & (1<>9),(uint8_t)(fgu>>9),(uint8_t)(fbu>>9))); fru += frd; fgu += fgd; fbu += fbd; } }else{ // Null links for(int16_t i=0;i>9),(uint8_t)(fgu>>9),(uint8_t)(fbu>>9))); fru += frd; fgu += fgd; fbu += fbd; } } }else{ // Vertikal if(mode & (1<>9),(uint8_t)(fgu>>9),(uint8_t)(fbu>>9))); fru += frd; fgu += fgd; fbu += fbd; } }else{ // Null unten if(saule == 0) return; for(int16_t i=0;i>9),(uint8_t)(fgu>>9),(uint8_t)(fbu>>9))); fru += frd; fgu += fgd; fbu += fbd; } } } } void scala_inhalt(scaladata *userscala, uint16_t xx){ uint16_t mode = userscala->mode; int16_t xo = userscala->xo; int16_t yo = userscala->yo; int16_t xu = userscala->xu; int16_t yu = userscala->yu; int16_t rdicke = userscala->rahmendicke; int16_t breite = userscala->xu-userscala->xo+1; int16_t hoehe = userscala->yu-userscala->yo+1; uint16_t scalafarbe = userscala->scalafarbe; uint16_t hintergrundfarbe = userscala->hintergrundfarbe; uint16_t grundfarbe = userscala->grundfarbe; if(mode & (1<hintergrundfarbe; int16_t innenscala = (yu - yo) - 2 * rdicke;; // Höhe (Länge) der Skala ohne Rahmen, vertikale Scala if(mode & (1<vollscala)*innenscala); // Höhe (Länge) des wirkenden Teils der Skala (ohne Rahmen) int16_t leer = innenscala - saule; // Höhe (Länge) des leeren Teils der Scala (ohne Rahmen) int16_t xoram = xo+rdicke; int16_t yoram = yo+rdicke; int16_t brram = breite-2*rdicke; int16_t horam = hoehe-2*rdicke; if(mode & (1< 10){ zaehler = 0; display.setFont(&FreeMonoBold18pt7b); display.setTextSize(2); //adjust text size display.setTextColor(GELB,BLAU); display.fillRect(0,290,180,80,BLAU); display.setCursor(0,350); //x,y probel10b(WERT_L); display.println(WERT_L); display.setTextColor(WASSER,BLAU); display.fillRect(0,390,180,80,BLAU); display.setCursor(0,450); //x,y probel10b(WERT_R);; display.println(WERT_R); display.setTextColor(OLIVE,SCHWARZ); display.fillRect(0,190,180,80,SCHWARZ); display.setCursor(0,250); //x,y display.println(dauer); Serial.print(scala_linke.mode); Serial.print(" "); Serial.print(scala_rechte.mode); Serial.print(" "); Serial.println(scala_unten.mode); } delay(20); }