In my experience String is a RAM eater. This has ceased to be a problem since I started using strings instead of Strings.
That confused me, too, at first.
String is the Arduino-only library that simplifies character strings for new users.
When we say 'string', we mean C++ character strings.
Here is an explanation of what Strings do to RAM.
May I suggest that your loop() function is a mess.
It is a good practice to not do everything in the loop() function. Break it into a number of functions that you call from loop. In the long run it makes your code easier to read, modify or organize. (Especially if you need to revisit the sketch a year later).
Instead of
void loop(){
if(test)
{
do lot's of stuff
}
if(test2)
{
do lot's of other stuff
}
}
many dozens of times,
put the 'do stuff' code into separate functions:
void loop(){
if(test) do lot's of stuff;
if(test2) do lot's of other stuff
}