Guarda, ad una prima occhiata la prima cosa che devi eliminare sono le tante variabili "String" come ad esempio questa (ma ne hai almeno una quindicina!):
String inputString = "";
Se cerchi nel forum o con Google troverai centinaia di posti dove si spiega perché le "String" non si debbano usare su Arduino (comunque in due parole, anzi sei: "consumano memoria che non viene riutilizzata"). Devi usare le classiche e cosiddette "stringhe C", ad esempio:
char inputString[30];
dove "30" è la dimensione massima prevista per la stringa, più uno (in questo caso quindi la stringa potrà contenere massimo 29 caratteri). Poi per assegnare un valore userai strcpy(), per concatenare strcat(), eccetera. Cerca un qualsiasi reference delle funzioni C/C++ standard, e quelle funzionano quasi tutte anche per Arduino.
Secondo, hai una marea di variabili di tipo "int" che definiscono semplicemente un pin ad esempio:
int Motore1Avanti = 22;
int Motore1Dietro = 23;
int Motore2Avanti = 25;
int Motore2Dietro = 24;
...eccetera
Primo, se sono pin sono valori fissi quindi non serve che siano variabili. Secondo, usare gli "int" (2 byte, da -32768 a 32767) per valori solo positivi e inferiori sicuramente a 100 è inutile.
Quelle righe falle diventare "const byte":
const byte Motore1Avanti = 22;
const byte Motore1Dietro = 23;
const byte Motore2Avanti = 25;
const byte Motore2Dietro = 24;
...eccetera
Discorso analogo per le tante "int" che vedo, da "Luce" a "VelocitaMotore" eccetera: se sai che contegono solo valori tra 0 e 255 massimo, impostale come "byte".
Poi le stringhe costanti ma abbastanza lunghe, ossia messaggi come questo:
Serial.println("begin() failed. check your BMx280 Interface and I2C Address.");
per risparmiare RAM puoi impostarle con la macro "F()" per spostarle in Flash:
Serial.println(F("begin() failed. check your BMx280 Interface and I2C Address."));