Drawline allarm mq7 sensor tft display

Hello,
I have a project with an
MQ7 sensor
ARDUINO UNO
TFT ELEGOO 2.8 DISPLAY

I would like to set a drawline as soon as the ppm result exceeds the red line on the display a warning is activated on the dysplay.

Could anyone help me?

the project code:


#include <Elegoo_GFX.h>    // Libreria grafica di base
#include <Elegoo_TFTLCD.h> // Libreria specifica per l'hardware

#define BLACK           0x0000
#define BLUE            0x001F
#define RED             0xF800
#define GREEN           0x07E0
#define CYAN            0x07FF
#define MAGENTA         0xF81F
#define YELLOW          0xFFE0
#define WHITE           0xFFFF
#define LIGHT_GREY      0xBDF7
#define DARK_GREY       0x7BEF
#define ORANGE          0xFBE0
#define BROWN           0x79E0
#define PINK            0xF81F

#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

Elegoo_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

// Global Variables
  int valueBlock[4];
  int posBlock[4];
  int prevPosBlock[4];
  
// Editable Variables
  bool proDebug = 0;                          // TODO - Debug? 0 = No, 1 = Si
  bool displayValues = true;                  // EDIT - Visualizza il valore dei blocchi?
  
  uint16_t graphColor = BLUE;                 // EDIT - Colore preferito del grafico
  uint16_t blockColor = GREEN;                // EDIT - Colore preferito blocchi
  
  String graphName = "Misurazione C0";             // EDIT - Titolo 
  String graphBlock[] = {"PPM", "Pot2"};   // EDIT - Nome  Blocchi
  
  int graphRange = 256;                      // EDIT - Numero massimo possibile di blocchi, ad es. MQ7 R = Da 0 a 1024, ex 1024
  int numberOfBlocks = 1;                     // EDIT - Numero blocchi sul display

// calcolo 
  const int numberOfMarks = (numberOfBlocks * 2); // calcola la quantità di linee che contrassegnano l'asse x
  const int originX = 45; // l'origine del grafico sull'asse x
  const int originY = 200; // the origin of the graph on the y axis
  const int sizeX = 270; // la dimensione del grafico sull'asse x (lunghezza)
  const int sizeY = 150; // la dimensione del grafico sull'asse y (altezza)
  
  int boxSize = (sizeX / numberOfMarks); // calcola la dimensione tra i segni
  int mark[] = {boxSize, (boxSize * 2), (boxSize * 3), (boxSize * 4), (boxSize * 5), (boxSize * 6), (boxSize * 7), (boxSize * 8)}; // calcola la posizione dei segni

  const int minorSizeY = (originY + 10); // calcola l'origine y dei segni
  const int minorSizeX = (originX - 10); // calcola l'origine x dei numeri
  
  int numberSize = (sizeY / 6); // calcola la dimensione tra i numeri
  int number[] = {numberSize, (numberSize * 2), (numberSize * 3), (numberSize * 4), (numberSize * 5), (numberSize * 6)}; // calcola la posizione dei numeri

  int numberValue = (graphRange / 6); // calculates the value per number
  int val[] = {graphRange, (numberValue * 5), (numberValue * 4), (numberValue * 3), (numberValue * 2), numberValue}; // calcola il valore di ogni numero

void drawHome()
{
  tft.fillScreen(BLACK);
  delay(500);
  
  tft.setCursor(10, 45); // calcola il valore di ogni numero
  tft.setTextColor(YELLOW); // imposta il colore del testo
  tft.setTextSize(3); // imposta la dimensione del testo
  tft.println("MQ SENSOR");
  
  tft.setCursor(10, 80);
  tft.setTextColor(CYAN);
  tft.setTextSize(3);
  tft.println("Misurazione C0");

  delay(4000);

  tft.fillScreen(WHITE);
  delay(500);
}

void drawGraph()
{
  // draw title
  tft.setCursor(10, 10);
  tft.setTextColor(BLUE);
  tft.setTextSize(3);
  tft.println(graphName);
  
  // draw outline
  tft.drawLine(originX, originY, (originX + sizeX), originY, graphColor);
  tft.drawLine(originX, originY, originX, (originY - sizeY), graphColor);

  // draw lables
  for(int i = 0; i < numberOfMarks; i++)
  {
    tft.drawLine(mark[i], originY, mark[i], minorSizeY, graphColor);

    
  }

  // draw lable names
  for(int i = 0; i < numberOfMarks; i += 2)
  {
    tft.setCursor((mark[i] + 6), (originY + 10));
    tft.setTextColor(graphColor);
    tft.setTextSize(2);
    tft.println(graphBlock[i / 2]);
  }

  // draw numbers
  for(int i = 0; i < 6; i++)
  {
    tft.drawLine(originX, (originY - number[i]), minorSizeX, (originY - number[i]), graphColor);
  }

  // draw number values
  for(int i = 0; i < 6; i++)
  {
    tft.setCursor((minorSizeX - 30), (number[i] + numberSize));
    tft.setTextColor(graphColor);
    tft.setTextSize(1);
    tft.println(val[i]);
  }
}

void graph()
{
  // get the values of the sensors
  valueBlock[0] = analogRead(A5);
  tft.drawLine (45, 110, 300, 110, RED);
  
  if(proDebug)
  {
    Serial.println(valueBlock[0]);
    Serial.println("");
  }
  
  // map the sensor values to the graph size
  for(int i = 0; i < numberOfBlocks; i++)
  {
    posBlock[i] = map(valueBlock[i], 0, graphRange, originY, (originY - sizeY));
  }

  if(proDebug)
  {
    Serial.println(posBlock[0]);
    Serial.println(posBlock[1]);
    Serial.println("");
  }

  // draw the blocks - draw only if value differs
  for(int i = 0; i < numberOfBlocks; i++)
  {
    if(posBlock[i] > (prevPosBlock[i] + 2) || posBlock[i] < (prevPosBlock[i] - 2))
    {
      prevPosBlock[i] = posBlock[i];
      tft.fillRect((mark[i * 2] + 1), (originY - sizeY), (boxSize - 1), sizeY, WHITE);
      delay(10);
      tft.fillRect((mark[i * 2] + 1), posBlock[i], (boxSize - 1), (originY - posBlock[i]), blockColor);
    }
  }

  // visualizzare i valori dei sensori se la modalità è selezionata
  if(displayValues)
  {
    for(int i = 0; i < numberOfMarks; i += 2)
    {
      tft.setCursor((mark[i] - 45), (originY - 20));
      tft.setTextColor(BLACK, WHITE);
      tft.setTextSize(2);
      tft.println(valueBlock[i / 2]);
    }
  }
}

void setup()
{
  if(proDebug)
  {
    Serial.begin(9600);
    while(!Serial) {};
  }
  
  tft.reset(); // reset the screen
  delay(500);
  uint16_t identifier = tft.readID();
  identifier=0x9341;

  tft.begin(identifier);
  tft.setRotation(1);

  drawHome(); // disegna l'intro - Opzionale
  drawGraph(); // disegna il grafico
}


void loop()
{
  graph(); // rappresenta graficamente i valori sul grafico
  delay(200);
}

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.