Arduino Uno с датчиком, модулем Bluetooth и tft lcd

В приведенном ниже коде я использую дисплей tftlcd с диагональю 2,4 дюйма, на котором я хочу показать часы в качестве домашней страницы, когда пользователь нажимает на экран tftlcd, появляется экран, который может показать пользователю три параметра, которые касаются датчиков, которые хочет пользователь. использовать. В этом коде три датчика: пульсоксиметр, глюкометр, шагомер. После выбора какой-либо опции (датчика) данные датчика появятся на экране. У меня есть код для всей этой процедуры, который приведен ниже:

//подключаем все библиотеки
#include <Wire.h>
#include <SPFD5408_Adafruit_GFX.h>
#include <SPFD5408_Adafruit_TFTLCD.h>
#include <SPFD5408_TouchScreen.h>
#include "MAX30105.h"
#include "spo2_algorithm.h"

//Кнопки выхода
bool backsensed = false;
bool resetsensed = false;

// Включаем библиотеку Max30102
MAX30105 particleSensor;

// Определяем контакты ЖК-дисплея
#define YP A1  // должен быть аналоговым выводом, используйте "An" обозначение!
#define XM A2  // должен быть аналоговым выводом, используйте "An" обозначение!
#define YM 7   // может быть цифровым выводом
#define XP 6   // может быть цифровым выводом

//шагомер
const int xpin = A3;
const int ypin = A4;
const int zpin = A5;
byte p[8] = {0x1F,
  0x1F,
  0x1F,
  0x1F,
  0x1F,
  0x1F,
  0x1F,
  0x1F
};
float threshold = 100;
float xval[100] = {0};
float yval[100] = {0};
float zval[100] = {0};
float xavg, yavg, zavg;
int steps, flag = 0;
// пульсокси
#define MAX_BRIGHTNESS 255
#if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega168__)
uint16_t irBuffer[100]; //данные инфракрасного светодиодного датчика
uint16_t redBuffer[100];  //данные датчика красного светодиода
#else
uint32_t irBuffer[100]; //данные инфракрасного светодиодного датчика
uint32_t redBuffer[100];  //данные датчика красного светодиода
#endif
int32_t bufferLength; //длина данных
int32_t spo2; //значение SPO2
int8_t validSPO2; //индикатор, показывающий, верен ли расчет SPO2
int32_t heartRate; //значение сердечного ритма
int8_t validHeartRate; //индикатор, показывающий, верен ли расчет сердечного ритма
byte pulseLED = 11; // Должен быть на выводе PWM
byte readLED = 13; //Мигает при каждом чтении данных

// Значения калибровки ЖК-дисплея
#define TS_MINX 100
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940

// Для большей точности давления нам нужно знать сопротивление между X+ и X- Используйте любой мультиметр, чтобы считать его
// Для того, который мы используем, это 300 Ом на пластине X
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

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

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

int BLUE = tft.color565(50, 50, 255);
#define TFT_BLACK   0x0000
#define TFT_DARKBLUE 0x0010
#define VIOLET 0x8888
#define TFT_RED     0xF800
#define TFT_GREEN   0x07E0
#define TFT_CYAN    0x07FF
#define TFT_MAGENTA 0xF81F
#define TFT_YELLOW  0xFFE0
#define TFT_WHITE   0xFFFF
#define TFT_GREY    0x5AEB
#define TFT_BLUE    0x001F
#define GOLD 0xFEA0
#define BROWN 0xA145
#define SILVER 0xC618
#define LIME 0x07E0
#define BLUE  0x001F

//кнопочный экран
int currentpcolour;
int currentpage;
bool running;

//Минимальное и максимальное давление для ощущения прикосновения
#define MINPRESSURE 10
#define MAXPRESSURE 1000

//Часы
float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0;    
float sdeg = 0, mdeg = 0, hdeg = 0;
uint16_t osx = 120, osy = 120, omx = 120, omy = 120, ohx = 120, ohy = 120; 
int16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0, x00 = 0, yy00 = 0;
uint32_t targetTime = 0;                    
uint16_t xpos; 
uint8_t conv2d(const char* p) {
  uint8_t v = 0;
  if ('0' <= *p && *p <= '9')
    v = *p - '0';
  return 10 * v + *++p - '0';
}
uint8_t hh = conv2d(__TIME__), mm = conv2d(__TIME__ + 3), ss = conv2d(__TIME__ + 6); 
boolean initial = 1;
char d;

//для кнопок
void drawHome()
{
  tft.fillScreen(TFT_BLACK);
  tft.drawRoundRect(0, 0, 319, 240, 8, TFT_YELLOW);     //Граница страницы

  tft.fillRoundRect(60, 180, 200, 40, 8, TFT_DARKBLUE);
  tft.drawRoundRect(60, 180, 200, 40, 8, TFT_YELLOW);  // ПЕДО

  tft.fillRoundRect(60, 130, 200, 40, 8, TFT_DARKBLUE);   //глу
  tft.drawRoundRect(60, 130, 200, 40, 8, TFT_YELLOW);

  tft.fillRoundRect(60, 80, 200, 40, 8, TFT_DARKBLUE);
  tft.drawRoundRect(60, 80, 200, 40, 8, TFT_YELLOW); //Пульс окси и частота сердечных сокращений

  tft.setCursor(25, 20);
  tft.setTextSize(3);
  tft.setTextColor(TFT_WHITE);
  tft.print("Welcome Here..");
  tft.setCursor(25, 50);
  tft.setTextSize(2);
  tft.setTextColor(TFT_YELLOW);
  tft.print("Choose Your Sensor");
  tft.setTextColor(TFT_WHITE);
  tft.setCursor(110, 195);
  tft.print("Pedometer");

  tft.setCursor(80, 145);
  tft.print("Glucose Sensor");

  tft.setCursor(80, 95);
  tft.print("Pulse Oximeter");
  // delay(500);

  }

  void setup()
{
  tft.reset();  
  tft.begin(0x9341); 
  tft.setRotation(1);
  currentpage = 0; //страница часов
  tft.setTextColor(TFT_WHITE);// цвет текста
  tft.fillScreen(TFT_BLACK);// цвет фона

  xpos = tft.width() / 2; 
  tft.drawCircle(xpos, 120, 125, TFT_YELLOW);
  tft.fillCircle(xpos, 120, 118, TFT_BLUE); 
  tft.fillCircle(xpos, 120, 110, TFT_BLACK); 
  for (int a=95; a<104; a++){
  tft.drawCircle(xpos, 120, a, TFT_WHITE);}  

 
  for (int i = 0; i < 360; i += 30) {
    sx = cos((i - 90) * 0.0174532925);
    sy = sin((i - 90) * 0.0174532925);
    x0 = sx * 114 + xpos;
    yy0 = sy * 114 + 120;
    x1 = sx * 100 + xpos;
    yy1 = sy * 100 + 120;
    tft.drawLine(x0, yy0, x1, yy1, TFT_YELLOW);
  }
  for (int i = 0; i < 360; i += 6) {
    sx = cos((i - 90) * 0.0174532925);
    sy = sin((i - 90) * 0.0174532925);
    x0 = sx * 102 + xpos;
    yy0 = sy * 102 + 120;
    x00 = sx * 92 + xpos;
    yy00 = sy * 92 + 120;
    // Рисуем минутные маркеры
    tft.drawPixel(x0, yy0, TFT_GREEN); 
    tft.drawLine(x0, yy0, x00, yy00, TFT_BLACK);
    tft.drawLine(x0+1, yy0+1, x00+1, yy00+1, TFT_BLACK);
    // Рисуем точки основного квадранта
    if (i == 0 || i == 180) tft.fillCircle(x0, yy0, 2, TFT_WHITE); 
    if (i == 90 || i == 270) tft.fillCircle(x0, yy0, 2, TFT_WHITE); 
  }
  tft.fillCircle(xpos, 121, 3, TFT_WHITE);
  targetTime = millis() + 1000;
  //событие касания
  tft.setCursor (80, 250);
  tft.setTextSize (1);
  tft.setTextColor(TFT_BLACK);
  tft.println("Touch to proceed");
  waitOneTouch(); // Ожидание касания
  drawHome(); // экран кнопок
}

void loop(){
  if (currentpage == 0){
  if (targetTime < millis()) {             // код часов
    targetTime = millis() + 1000;
    ss++;              
    if (ss == 60) {
      ss = 0;
      mm++;            
      if (mm > 59) {
        mm = 0;
        hh++;          
        if (hh > 23) {
          hh = 0;
        }
      }
    }
    sdeg = ss * 6;                     // 0-59 -> 0-354
    mdeg = mm * 6 + sdeg * 0.01666667; // 0-59 -> 0-360 - включает секунды, но эти приращения не используются
    hdeg = hh * 30 + mdeg * 0.0833333; // 0-11 -> 0-360 - включает минуты и секунды, но эти приращения не используются
    hx = cos((hdeg - 90) * 0.0174532925);
    hy = sin((hdeg - 90) * 0.0174532925);
    mx = cos((mdeg - 90) * 0.0174532925);
    my = sin((mdeg - 90) * 0.0174532925);
    sx = cos((sdeg - 90) * 0.0174532925);
    sy = sin((sdeg - 90) * 0.0174532925);
    if (ss == 0 || initial) {
      initial = 0;
      // Стирать позиции часовой и минутной стрелок каждую минуту
      tft.drawLine(ohx, ohy, xpos, 121, TFT_BLACK);
      ohx = hx * 62 + xpos + 1;
      ohy = hy * 62 + 121;
      tft.drawLine(omx, omy, xpos, 121, TFT_BLACK);
      omx = mx * 84 + xpos;
      omy = my * 84 + 121;
    }
    // Перерисовываем новые положения стрелок, часовая и минутная стрелки здесь не стерты, чтобы избежать мерцания
    tft.drawLine(osx, osy, xpos, 121, TFT_BLACK);
    osx = sx * 90 + xpos + 1;
    osy = sy * 90 + 121;
    tft.drawLine(osx, osy, xpos, 121, TFT_RED);
    tft.drawLine(ohx, ohy, xpos, 121, TFT_CYAN);
    tft.drawLine(omx, omy, xpos, 121, TFT_WHITE);
    tft.drawLine(osx, osy, xpos, 121, TFT_RED);
    tft.fillCircle(xpos, 121, 3, TFT_RED);
    tft.setCursor(xpos-30, 50);
    tft.setTextSize(2);
    tft.print("Glucoxy");
 
  // Рисуем МИНИ-циферблат "SECOND"
  tft.drawCircle(xpos, 155, 20, TFT_YELLOW);
  tft.drawCircle(xpos, 155, 18, TFT_BLUE);
  tft.drawCircle(xpos, 155, 17, TFT_CYAN);
  tft.drawCircle(xpos, 155, 16, TFT_CYAN);
  tft.fillRect(xpos-10, 149,22,15,TFT_BLACK); //стереть
  if(ss<10){tft.setCursor(xpos-10, 149); tft.setTextSize(2);
  tft.print('0'); tft.setCursor(xpos+2, 149);}
  else{
  tft.setCursor(xpos-10, 149);}
  tft.setTextSize(2);
  tft.print(ss);
  // Рисуем МИНИ-циферблат "Минуты"
  tft.drawCircle(xpos+35, 117, 20, TFT_YELLOW);
  tft.drawCircle(xpos+35, 117, 18, TFT_BLUE);
  tft.drawCircle(xpos+35, 117, 17, TFT_CYAN);
  tft.drawCircle(xpos+35, 117, 16, TFT_CYAN);
 tft.fillRect(xpos+25, 111,22,15,TFT_BLACK); //стереть
  if(mm<10){tft.setCursor(xpos+25, 111); tft.setTextSize(2);
  tft.print('0'); tft.setCursor(xpos+37, 111);}
  else{
  tft.setCursor(xpos+25, 111);}
  tft.println(mm);
  // Рисуем МИНИ-циферблат "Час"
  tft.drawCircle(xpos-35, 117, 20, TFT_YELLOW);
  tft.drawCircle(xpos-35, 117, 18, TFT_BLUE);
  tft.drawCircle(xpos-35, 117, 17, TFT_CYAN);
  tft.drawCircle(xpos-35, 117, 16, TFT_CYAN);
  tft.fillRect(xpos-45, 111,22,15,TFT_BLACK); //стереть
  if(hh<10){tft.setCursor(xpos-45, 111); tft.setTextSize(2);
  tft.print('0'); tft.setCursor(xpos-33, 111);}
  else{
  tft.setCursor(xpos-45, 111);}
  tft.setTextSize(2);
  tft.print(hh);
  //tft.setCursor(xpos-65, 111);
  //tft.println(':');
  if (hh>=0 && hh<12) d='A'; else {d='P';}
  tft.drawRoundRect(xpos-14,72,29,21,5,TFT_CYAN);
  tft.fillRect(xpos-11, 75,23,15,TFT_BLACK); //стереть
  tft.setCursor(xpos-11, 75);
  tft.setTextSize(2);
  tft.print(d);
  tft.println('M');
  }
  }
  // домашняя страница
  if (currentpage == 1){
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint();     // Чтение сенсорного экрана
  digitalWrite(13, LOW);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  {if (p.z > 10 && p.z < 1000)
    {
      if (p.x > 736 && p.x < 855 && p.y > 255 && p.y < 725  && p.z > MINPRESSURE && p.z < MAXPRESSURE)
      {
        Serial.println("Pedometer");
        tft.fillRoundRect(60, 180, 200, 40, 8, TFT_WHITE);
        delay(70);
        tft.fillRoundRect(60, 180, 200, 40, 8, TFT_WHITE);
        tft.drawRoundRect(60, 180, 200, 40, 8, TFT_YELLOW);
        tft.setCursor(65, 195);
        tft.println("  Pedometer");
        delay(70);
        currentpage = 2;
        startPedo();
      }
      else if (p.x > 563 && p.x < 683 && p.y > 275 && p.y < 750)
      {
        Serial.println("Glucose Sensor");

        tft.fillRoundRect(60, 130, 200, 40, 8, TFT_WHITE);   //светодиод RGB
        delay(70);
        tft.fillRoundRect(60, 130, 200, 40, 8, TFT_WHITE);   //светодиод RGB
        tft.drawRoundRect(60, 130, 200, 40, 8, TFT_YELLOW);   //светодиод RGB
        tft.setCursor(105, 145);
        tft.print("Glucose Sensor");
        delay(70);
        currentpage = 3;
        startGlu();
      }
      if (p.x > 403 && p.x < 525 && p.y > 271 && p.y < 725)
      {
        Serial.println("Pulse Oximeter");
        currentpage = 4;
        tft.fillRoundRect(60, 80, 200, 40, 8, TFT_WHITE);
        delay(70);
        tft.fillRoundRect(60, 80, 200, 40, 8, TFT_WHITE);
        tft.drawRoundRect(60, 80, 200, 40, 8, TFT_YELLOW);
        tft.setCursor(80, 95);
        tft.print("Pulse Oximeter");
        delay(70);
       // startPulse();

      }
    }
  }
  if (currentpage == 2) //педо
  {
    senseBack();
    if (backsensed)
    {
      currentpage = 1;
      drawHome();
    }
    sensereset();
    calibrate();
  }
  if (currentpage == 3) // глюкоза
  {
     senseBack();
     if (backsensed)
     {
      currentpage = 0;
      drawHome();
     }
    sensereset();
  }

  if (currentpage == 4)  //пульс окси
  {
    senseBack();
     if (backsensed)
     {
      currentpage = 1;
      drawHome();
     }
    sensereset();
    pinMode(pulseLED, OUTPUT);
  pinMode(readLED, OUTPUT);
  if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) // Использовать порт I2C по умолчанию, скорость 400 кГц // Инициализировать датчик
  {
    Serial.println(F("MAX30105 was not found. Please check wiring/power."));
    while (1);
  }
  Serial.println(F("Attach sensor to finger with rubber band. Press any key to start conversion"));
  while (Serial.available() == 0) ; //ждем, пока пользователь не нажмет клавишу
  Serial.read();
  byte ledBrightness = 60; //Опции: от 0=Выкл. до 255=50 мА
  byte sampleAverage = 4; //Опции: 1, 2, 4, 8, 16, 32
  byte ledMode = 2; //Опции: 1 = только красный, 2 = красный + ИК, 3 = красный + ИК + зеленый
  byte sampleRate = 100; //Опции: 50, 100, 200, 400, 800, 1000, 1600, 3200
  int pulseWidth = 411; //Опции: 69, 118, 215, 411
  int adcRange = 4096; //Опции: 2048, 4096, 8192, 16384
  particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Настройте датчик с этими настройками
  startPulse();
  }
}

}
// Ждем одно касание
TSPoint waitOneTouch() { 
  TSPoint p;
  do {
    p= ts.getPoint(); 
    pinMode(XM, OUTPUT); // Контакты снова настраиваются для управления TFT
    pinMode(YP, OUTPUT);
  } while((p.z < MINPRESSURE )|| (p.z > MAXPRESSURE));
  return p;
}
void sensereset()
{
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint();     // Чтение сенсорного экрана
  digitalWrite(13, LOW);
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.x < 199 && p.y < 293 && !running)
    resetsensed = true;
  else
    resetsensed = false;
}
void startPedo()        //---------------------------------функция шагомера----------------------- ---
{
  int acc = 0;
  float totvect[100] = {0};
  float totave[100] = {0};
  float xaccl[100] = {0};
  float yaccl[100] = {0};
  float zaccl[100] = {0};
  for (int a = 0; a < 100; a++)
  {
    xaccl[a] = float(analogRead(xpin) - 345);
    delay(1);
    yaccl[a] = float(analogRead(ypin) - 346);
    delay(1);
    zaccl[a] = float(analogRead(zpin) - 416);
    delay(1);
    totvect[a] = sqrt(((xaccl[a] - xavg) * (xaccl[a] - xavg)) + ((yaccl[a] - yavg) * (yaccl[a] - yavg)) + ((zval[a] - zavg) * (zval[a] - zavg)));
    totave[a] = (totvect[a] + totvect[a - 1]) / 2 ;
    Serial.println("totave[a]");
    Serial.println(totave[a]);
    delay(100);
    if (totave[a] > threshold && flag == 0)
    {
      steps = steps + 1;
      flag = 1;
    }
    else if (totave[a] > threshold && flag == 1)
    {
      // Не считать
    }
    if (totave[a] < threshold   && flag == 1)
    {
      flag = 0;
    }
    if (steps < 0) {
      steps = 0;
    }
    Serial.println('\n');
    Serial.print("steps: ");
    Serial.println(steps);
    delay(1000);
  }
  delay(1000);
  // печать результатов на ЖК-дисплее
  tft.setCursor(130, 145);
  tft.setTextSize(3);
  tft.setTextColor(TFT_WHITE);
  tft.print(steps);

  }
void calibrate()            //<---------------------- функция калибровки------------------ --->
{
  float sum = 0;
  float sum1 = 0;
  float sum2 = 0;
  for (int i = 0; i < 100; i++) {
    xval[i] = float(analogRead(xpin) - 345);
    sum = xval[i] + sum;
  }
  delay(100);
  xavg = sum / 100.0;
  Serial.println(xavg);
  for (int j = 0; j < 100; j++)
  {
    yval[j] = float(analogRead(ypin) - 346);
    sum1 = yval[j] + sum1;
  }
  yavg = sum1 / 100.0;
  Serial.println(yavg);
  delay(100);
  for (int q = 0; q < 100; q++)
  {
    zval[q] = float(analogRead(zpin) - 416);
    sum2 = zval[q] + sum2;
  }
  zavg = sum2 / 100.0;
  delay(100);
  Serial.println(zavg);
}
void senseBack()
{
  digitalWrite(13, HIGH);
  TSPoint p = ts.getPoint();     // Чтение сенсорного экрана
  digitalWrite(13, LOW);

  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);
  if (p.y < 305 && p.x < 285 && p.x > 239 && !running)
  {
    backsensed = true;

  }
  else
    backsensed = false;
}
void startGlu()                 //-------------------------------startGlu------------ -------------
{
  }
void startPulse()             //--------------------------------startpulse----------- ------------
{
  bufferLength = 100; // длина буфера 100 хранит 4 секунды сэмплов, работающих со скоростью 25sps

  //читаем первые 100 выборок и определяем диапазон сигнала
  for (byte i = 0 ; i < bufferLength ; i++)
  {
    while (particleSensor.available() == false) //есть ли у нас новые данные?
      particleSensor.check(); //Проверяем датчик на наличие новых данных
    redBuffer[i] = particleSensor.getRed();
    irBuffer[i] = particleSensor.getIR();
    particleSensor.nextSample(); //Мы закончили с этим образцом, поэтому переходим к следующему образцу
    Serial.print(F("red="));
    Serial.print(redBuffer[i], DEC);
    Serial.print(F(", ir="));
    Serial.println(irBuffer[i], DEC);
  }
  //рассчитать частоту сердечных сокращений и SpO2 после первых 100 образцов (первые 4 секунды образцов)
  maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
  //Постоянно берем образцы с MAX30102. ЧСС и SpO2 рассчитываются каждую 1 секунду
  while (1)
  {
    //сбрасываем первые 25 наборов сэмплов в память и сдвигаем последние 75 наборов сэмплов наверх
    for (byte i = 25; i < 100; i++)
    {
      redBuffer[i - 25] = redBuffer[i];
      irBuffer[i - 25] = irBuffer[i];
    }
    //возьмем 25 наборов образцов перед расчетом частоты сердечных сокращений.
    for (byte i = 75; i < 100; i++)
    {
      while (particleSensor.available() == false) //есть ли у нас новые данные?
        particleSensor.check(); //Проверяем датчик на наличие новых данных
      digitalWrite(readLED, !digitalRead(readLED)); // Мигать встроенным светодиодом при каждом чтении данных
      redBuffer[i] = particleSensor.getRed();
      irBuffer[i] = particleSensor.getIR();
      particleSensor.nextSample(); //Мы закончили с этим образцом, поэтому переходим к следующему образцу
      //отправляем образцы и результат расчета в терминальную программу через UART
      Serial.print(F("red="));
      Serial.print(redBuffer[i], DEC);
      Serial.print(F(", ir="));
      Serial.print(irBuffer[i], DEC);
      Serial.print(F(", HR="));
      Serial.print(heartRate, DEC);
      Serial.print(F(", HRvalid="));
      Serial.print(validHeartRate, DEC);
      Serial.print(F(", SPO2="));
      Serial.print(spo2, DEC);
      Serial.print(F(", SPO2Valid="));
      Serial.println(validSPO2, DEC);
    }

    //После сбора 25 новых образцов пересчитываем HR и SP02
    maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);
    // печать результатов на ЖК-дисплее
    tft.setCursor(130,145);
  tft.setTextSize(3);
  tft.setTextColor(TFT_WHITE);
  tft.print(heartRate);

  }
    
}

Пожалуйста, посмотрите выше код, работает ли он так, как я хочу. Я получаю сообщение об ошибке, когда пытаюсь скомпилировать этот код, который приведен ниже.

Мои вопросы:

  1. правилен ли этот код, если нет, то укажите на мои ошибки.
  2. Решение ошибки показано на изображении.

, 👍2

Обсуждение

пожалуйста, без картинок текста.. не у всех есть возможность просматривать картинки... выкладывайте собственно текст, @jsotola

код правильный? ... если он делает то, что вы ожидаете, то да... иначе нет, @jsotola


3 ответа


1

Arduino Uno не хватает SRAM, текущий Rev3 имеет всего 2 КБ. Вы можете обойти это, используя меньше переменных , используйте #define xpin вместо const intи т. Д. Вот статья о том, как уменьшить использование памяти, попробуйте.
Другой вариант-использовать другой микроконтроллер с большим количеством SRAM, по крайней мере 3KB, как Arduino Mega, ESP32. Но сначала попробуйте оптимизировать свою программу, если у вас все равно нет другой неиспользуемой платы.
ПРАВКА:
Вы также можете взглянуть на заголовочные файлы, если вы можете оптимизировать что-либо там.

,

Хорошо, я пытаюсь сделать этот код оптимизированным., @Namra Noor

@Nimra Я думаю, что вы должны найти правильное количество массивов, сохраняемых в памяти, и правильное количество их, сохраняемых во флэш-памяти, потому что у вас не так много места на флэш-памяти осталось., @Python Schlange


1

Arduino Mega имеет 8192 байта SRAM, которые решат вашу проблему.

Уменьшите использование оперативной памяти (ref)

,

-1

Посмотрите на этот пост, где я реализовал часы с помощью tft-сенсорного экрана с сенсорными полями выбора для установки времени. Я использовал Teensy 3.2, который прекрасно справляется с требованиями к памяти. Из отчета о компиляции

Compiling 'Teensy_LCDClockV4' for 'Teensy 3.2 / 3.1'
Using previously compiled file: C:\Users\Frank\AppData\Local\Temp\VMBuilds\Teensy_LCDClockV4\teensy31\Release\pch\Arduino.h.gch
Program size: 117,320 bytes (used 45% of a 262,144 byte maximum) (4.14 secs)
Minimum Memory Usage: 5936 bytes (9% of a 65536 byte maximum)

Так что у вас могут возникнуть некоторые проблемы с установкой его в обычную плату Arduino

,