Ho dato una piccola sistemata al tuo codice :
#include <Keypad.h> //LIBRERIA TASTIERINI 4X3
const byte ROWS = 4; //four rows
const byte COLS = 4; //four columns
//definisci i simboli dei tasti tastierino
char hexaKeys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //connessione dei pin RIGHE del tastierino
byte colPins[COLS] = {9, 8, 7, 6}; //connessione dei pin COLONNE del tastierino
//Inizializza l' istanza class NewKeypad
Keypad customKeypad = Keypad( makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);
byte digitalpin[] = {30,31,32,33,34,35,36,37,38,39,40,41};
byte lastStatus[] = {HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH,HIGH};
byte flag;
byte i;
byte buttonStatus;
long previousMillis = 0, interval = 4000;
//------------LM 35
float temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8;
float tempPin1 = 0;
float tempPin2 = 1;
float tempPin3 = 2;
float tempPin4 = 3;
float tempPin5 = 4;
float tempPin6 = 5;
float tempPin7 = 6;
float tempPin8 = 7;
void setup() {
Serial.begin(115200);
pinMode(RELE1, OUTPUT);
pinMode(RELE2, OUTPUT);
pinMode(RELE3, OUTPUT);
pinMode(RELE4, OUTPUT);
for(i = 0; i < sizeof(digitalpin); i++) //Setta a pullup tutti gli ingressi digitali attraverso il ciclo for
{
pinMode(digitalpin[i], INPUT_PULLUP);
}
}
void loop (){
//---------------------------------------------------
TASTIERINO(); // è il nome della funzione che invia i valori dei pulsanti tastierini (pin 2 --> pin 8)
USCITE(); // è il nome della funzione che invia i valori dei pulsanti tastierini (pin 2 --> pin 8)
INGRESSI_DIGITALI(); // è il nome della funzione che invia i valori dei pulsanti tastierini (pin A12 --> pin A15)
TEMPERATURE_LM35(); // è il nome della funzione che invia i valori delle sonde LM35 (pin A0 --> pin A7)
SERIALE(); // è il nome della funzione che invia i valori degli ingressi diditali (pin 30 --> pin 42)
//---------------------------------------------------
}
const short RELE1 = 42;
const short RELE2 = 43;
const short RELE3 = 44;
const short RELE4 = 45;
//---------------------------------------------------
void SERIALE() {
if (Serial.available()) {
byte command = Serial.read(); //leggo il primo byte
switch (command) {
case '_' : // RICEZIONE COMANDO PER L' INVIO STATO TUTTI INGRESSI DIGITALI
Serial.print("D");
for (i = 0; i < sizeof(digitalpin); i++) Serial.print(!lastStatus[i]); // notare che ora stampa lo stato NEGATO così HIGH 0 LOW 1
Serial.print("F");
break;
}
}
}
////////////////////////////////// TASTIERINO NUMERICO ////////////////////////////////
void TASTIERINO() {
char customKey = customKeypad.getKey();
if (customKey){
Serial.print("K");
Serial.print(customKey);
Serial.print("F");
}
}
//-----------------------------------------------------------------
void INGRESSI_DIGITALI() {
flag = false;
for (i = 0; i < sizeof(digitalpin); i++) {
buttonStatus = digitalRead(digitalpin[i]);
if (lastStatus[i] != buttonStatus) {
delay(60);
buttonStatus = digitalRead(digitalpin[i]);
if (lastStatus[i] != buttonStatus) {
lastStatus[i] = buttonStatus;
flag = true;
}
}
}
if (flag) {
Serial.print("D");
for (i = 0; i < sizeof(digitalpin); i++) Serial.print(!lastStatus[i]); // notare che ora stampa lo stato NEGATO così HIGH 0 LOW 1
Serial.print("F");
}
}
//-----------------------------------------------------------------
void TEMPERATURE_LM35() {
{
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval)
{
previousMillis = currentMillis; // qui dentro esegui ogni tot di tempo impostato da interval
temp1 = analogRead(tempPin1);
temp2 = analogRead(tempPin2);
temp3 = analogRead(tempPin3) ;
temp4 = analogRead(tempPin4);
temp5 = analogRead(tempPin5);
temp6 = analogRead(tempPin6);
temp7 = analogRead(tempPin7);
temp8 = analogRead(tempPin8);
temp1 = temp1 * 0.48828125 ;
temp2 = temp2 * 0.48828125;
temp3 = temp3 * 0.48828125;
temp4 = temp4 * 0.48828125;
temp5 = temp5 * 0.48828125;
temp6 = temp6 * 0.48828125;
temp7 = temp7 * 0.48828125;
temp8 = temp8 * 0.48828125;
Serial.print("T");
Serial.print(",");
Serial.print(temp1);
Serial.print(",");
Serial.print(temp2);
Serial.print(",");
Serial.print(temp3);
Serial.print(",");
Serial.print(temp4);
Serial.print(",");
Serial.print(temp5);
Serial.print(",");
Serial.print(temp6);
Serial.print(",");
Serial.print(temp7);
Serial.print(",");
Serial.print(temp8);
Serial.print("F");
} // delay(1000);
}
}
//-----------------------------------------------------------------
void USCITE() {
if (Serial.available())
{
switch (Serial.read()) {
case '+':
digitalWrite (RELE1, HIGH);
break;
case '-':
digitalWrite (RELE1, LOW);
break;
case 'B':
digitalWrite (RELE2, HIGH);
break;
case 'b':
digitalWrite (RELE2, LOW);
break;
case 'C':
digitalWrite (RELE3, HIGH);
break;
case 'c':
digitalWrite (RELE3, LOW);
break;
Serial.flush();
}
}
}
... come noterai ho dovuto commentare nella setup() i pinMode() visto che RELE1, RELE2, RELE3 e RELE4 ... non li hai definiti e chiaramente il compilatore da errore. A te definirli.
Il problema che riscontri sulla lettura dalla seriale è dovuto al fatto che ... nel loop() tu richiami due routines che ENTRAMBE leggono la seriale (funzione SERIALE e funzione USCITE) ed entrambe quindi tolgono il carattere che leggono dal buffer in ingresso. Se un certo carattere che tu digiti è letto prima dall'una che dall'altra ... chiaramente succedono cose diverse ...
Devi unificare la lettura della seriale e l'interpretazione dei comandi o non ne esci ... 
Guglielmo