|
- /*
- ROUND GAUGE EXAMPLE with ballistic!
- This example show how to create a round gauge that react like the real one with (almost) correct ballistic
- Created by S.U.M.O.T.O.Y - Max MC Costa
- If you modify or get better result please let me know
- */
- #include <SPI.h>
- #include <Adafruit_GFX.h>
- #include <TFT_ILI9163C.h>
-
-
-
- // Color definitions
- #define BLACK 0x0000
- #define BLUE 0x001F
- #define RED 0xF800
- #define GREEN 0x07E0
- #define CYAN 0x07FF
- #define MAGENTA 0xF81F
- #define YELLOW 0xFFE0
- #define WHITE 0xFFFF
-
-
- volatile int16_t curVal1 = 0;
- volatile int16_t oldVal1 = 0;
-
- /*
- Teensy3.x and Arduino's
- You are using 4 wire SPI here, so:
- MOSI: 11//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
- MISO: 12//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
- SCK: 13//Teensy3.x/Arduino UNO (for MEGA/DUE refere to arduino site)
- the rest of pin below:
- */
- #define __CS 10
- #define __DC 9
- /*
- Teensy 3.x can use: 2,6,9,10,15,20,21,22,23
- Arduino's 8 bit: any
- DUE: check arduino site
- If you do not use reset, tie it to +3V3
- */
-
-
- TFT_ILI9163C tft = TFT_ILI9163C(__CS, __DC);
-
-
- void setup() {
- Serial.begin(9600);
- tft.begin();
- drawGauge(63,63,63);
- }
-
- void loop(void) {
- curVal1 = random(1,254);
- if (oldVal1 != curVal1){
- drawNeedle(curVal1,63,63,63,GREEN,BLACK);
- oldVal1 = curVal1;
- }
- }
-
- void drawGauge(uint8_t x,uint8_t y,uint8_t r) {
- tft.drawCircle(x, y, r,WHITE);//draw instrument container
- faceHelper(x,y,r,150,390,1.3);//draw major ticks
- if (r > 15) faceHelper(x,y,r,165,375,1.1);//draw minor ticks
-
- }
-
- void faceHelper(uint8_t x,uint8_t y,uint8_t r,int from,int to,float dev){
- float dsec,fromSecX,fromSecY,toSecX,toSecY;
- int i;
- for (i = from;i <= to;i += 30) {
- dsec = i * (PI / 180);
- fromSecX = cos(dsec) * (r / dev);
- fromSecY = sin(dsec) * (r / dev);
- toSecX = cos(dsec) * r;
- toSecY = sin(dsec) * r;
- tft.drawLine(1 + x + fromSecX,1 + y + fromSecY,1 + x + toSecX,1 + y + toSecY,WHITE);
- }
- }
-
- void drawNeedle(int16_t val,uint8_t x,uint8_t y,uint8_t r,uint16_t color,uint16_t bcolor){
- uint8_t i;
- if (curVal1 > oldVal1){
- for (i = oldVal1; i <= curVal1; i++){
- drawPointerHelper(i-1,63,63,63,bcolor);
- drawPointerHelper(i,63,63,63,color);
- if ((curVal1 - oldVal1) < (128)) delay(1);//ballistic
- }
- }
- else {
- for (i = oldVal1; i >= curVal1; i--){
- drawPointerHelper(i+1,63,63,63,bcolor);
- drawPointerHelper(i,63,63,63,color);
- //ballistic
- if ((oldVal1 - curVal1) >= 128){
- delay(1);
- } else {
- delay(3);
- }
- }
- }
- }
-
- void drawPointerHelper(int16_t val,uint8_t x,uint8_t y,uint8_t r,uint16_t color) {
- float dsec, toSecX, toSecY;
- int16_t minValue = 0;
- int16_t maxValue = 255;
- int fromDegree = 150;//start
- int toDegree = 240;//end
- if (val > maxValue) val = maxValue;
- if (val < minValue) val = minValue;
- dsec = (((float)(uint16_t)(val - minValue) / (float)(uint16_t)(maxValue - minValue) * toDegree) + fromDegree) * (PI / 180);
- toSecX = cos(dsec) * (r / 1.35);
- toSecY = sin(dsec) * (r / 1.35);
- tft.drawLine(x, y, 1 + x + toSecX, 1 + y + toSecY, color);
- tft.fillCircle(x,y,2,color);
- }
-
|