IGLORENZ

Cyd Anzeige

May 12th, 2025
37
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | Software | 0 0
  1. #include <TFT_eSPI.h>
  2. #include <SPI.h>
  3. #include "Adafruit_MAX31855.h"
  4.  
  5. #define MAXDO   35
  6. #define MAXCS   22
  7. #define MAXCLK  27
  8. Adafruit_MAX31855 thermocouple(MAXCLK, MAXCS, MAXDO);
  9.  
  10. TFT_eSPI tft = TFT_eSPI();  // TFT instance
  11.  
  12. #define CENTER_X 160
  13. #define CENTER_Y 120
  14. #define RADIUS 100
  15. #define NEEDLE_LEN 80
  16.  
  17. float angleMin = 180;  // Angle for -20
  18. float angleMax = 0;   // Angle for +80
  19. int valueMin = -20;
  20. int valueMax = 80;
  21.  
  22. int prevX = CENTER_X;
  23. int prevY = CENTER_Y;
  24.  
  25. void setup() {
  26.   thermocouple.begin();
  27.   Serial.begin(115200);
  28.   tft.init();
  29.   tft.setRotation(1);
  30.   tft.fillScreen(TFT_BLACK);
  31.  
  32.   drawGauge();
  33.   updateNeedle(0);
  34.   tft.fillCircle(160, 120, 3, TFT_BLUE);
  35.  
  36. }
  37.  
  38. void loop() {
  39.   float c = thermocouple.readCelsius();
  40.   Serial.print("$");
  41.   Serial.print(c);
  42.   Serial.print(";");
  43.     delay(250);
  44.     float val=c;
  45.     if (val >= valueMin && val <= valueMax) {
  46.       updateNeedle(val);
  47.     }
  48. }
  49.  
  50. void drawGauge() {
  51.   // Draw major and minor ticks
  52.   for (int i = valueMin; i <= valueMax; i++) {
  53.     float angle = map(i, valueMin, valueMax, angleMin, angleMax) * DEG_TO_RAD;
  54.     int xStart = CENTER_X + cos(angle) * (RADIUS - (i % 10 == 0 ? 10 : 5));
  55.     int yStart = CENTER_Y + sin(angle) * (RADIUS - (i % 10 == 0 ? 10 : 5));
  56.     int xEnd = CENTER_X + cos(angle) * RADIUS;
  57.     int yEnd = CENTER_Y + sin(angle) * RADIUS;
  58.  
  59.     tft.drawLine(xStart, yStart, xEnd, yEnd, (i % 10 == 0) ? TFT_BLUE : TFT_GREEN);
  60.  
  61.     if (i % 10 == 0) {
  62.       // Draw label
  63.       int xLabel = CENTER_X + cos(angle) * (RADIUS - 20);
  64.       int yLabel = CENTER_Y + sin(angle) * (RADIUS - 20);
  65.       tft.setTextColor(TFT_WHITE, TFT_BLACK);
  66.       tft.setTextDatum(MC_DATUM);
  67.       tft.drawString(String(i), xLabel, yLabel);
  68.     }
  69.   }
  70. }
  71.  
  72. void updateNeedle(int value) {
  73.   // Erase previous needle
  74.   tft.drawLine(CENTER_X, CENTER_Y, prevX, prevY, TFT_BLACK);
  75.  
  76.   float angle = map(value, valueMin, valueMax, angleMin, angleMax) * DEG_TO_RAD;
  77.   int x = CENTER_X + cos(angle) * NEEDLE_LEN;
  78.   int y = CENTER_Y + sin(angle) * NEEDLE_LEN;
  79.  
  80.   // Draw new needle
  81.   tft.drawLine(CENTER_X, CENTER_Y, x, y, TFT_RED);
  82.  
  83.   // Update label
  84.   tft.fillRect(150, 90, 40, 20, TFT_BLACK);  // Clear previous label
  85.   tft.setTextFont(7);
  86.   tft.setTextColor(TFT_RED, TFT_BLACK);
  87.   tft.setTextSize(1);
  88.   tft.setCursor(130, 40);
  89.   tft.print(String(value) + " C");
  90.  
  91.   // Save previous needle position
  92.   prevX = x;
  93.   prevY = y;
  94. }
Add Comment
Please, Sign In to add comment