Mi aggancio ai suggerimenti di maurotec e standardoil per chiarirti alcune cose anche io e "riassumerti" come dovrebbe essere il codice.
Prima alcuni piccoli consigli:
int red = 13;
int green = 12;
int blue = 11;
int trigger = 9;
int echo = 8;
I pin sono valori interi tra 0 e, su una UNO, al massimo 13, quindi inutile sprecare spazio con gli "int", basta "byte". Inoltre sono costanti, quindi inutile usare delle variabili, meglio dei simboli (che per convenzione vanno in maiuscolo per distinguerli dalle variabili). Inoltre le configurazioni dei pin in genere io li evidenzio con un prefisso "P_", quindi:
#define P_RED 13
#define P_GREEN 12
#define P_BLUE 11
#define P_TRIG 9
#define P_ECHO 8
e quindi adatta di conseguenza il resto del codice. Ignoro la "int halt;" perché la dichiari ma non l'hai (ancora?) usata, ma se fa quello che immagino, potresti dichiararla "bool".
Quindi passiamo al codice vero e proprio.
Come dice standardoil inutile creare un oggetto ogni volta che devi misurare, crealo una sola volta all'inizio e poi usa sempliemente quello (a parte che sta libreria HCSR04 non mi piace molto, è "logorroica"...;)) per leggere il valore. Stessa cosa per la variabile "distance".
Poi come dice Maurotec per fare il fade devi prevedere "un passo per volta" perché altrimenti il codice resta bloccato su quell'effetto e non passa per la lettura della distanza se non una volta ogn 20 secondi.
Ora quindi il problema è come fare questo, ed in parte te l'ha indicato Maurotec ossia devi sfruttare la loop() e fare "un passo" del fade alternandolo alla lettura della distanza o, meglio, leggere la distanza diciamo 5 volte al secondo (più che sufficiente) e per fare questo usi millis(). Per gestire il fade up/down puoi inglobare tutto nella fadeBlu().
Insomma, vedi come ti ho modificato il codice, provalo e vedi come è stato impostato. Non ti assicuro che non ci siano problemi, visto che non l'ho provato (e non mi piace dare "pappa pronta";)), quindi nel caso devi provare intanto tu a fare debug...
#include <HCSR04.h>
#define P_RED 13
#define P_GREEN 12
#define P_BLUE 11
#define P_TRIG 9
#define P_ECHO 8
//int halt;
UltraSonicDistanceSensor distanceSensor(P_TRIG, P_ECHO);
double distance;
// Per fadeBlu() serve per il valore attuale e per capire la
// direzione del prossimo step
byte fadeVal = 0;
bool fadeUp = true;
// Per usare millis() al posto dei delay()
unsigned long tmrfade = 0;
unsigned long tmrDist = 0;
// Intervalli di tempo per lettura distanza e fade
#define TMR_DIST 200
#define TMR_FADE 40
void setup(){
Serial.begin(9600);
Serial.print("setup...");
pinMode(P_RED, OUTPUT);
pinMode(P_GREEN, OUTPUT);
pinMode(P_BLUE, OUTPUT);
pinMode(P_TRIG, OUTPUT);
pinMode(P_ECHO, INPUT);
Serial.println("OK!");
}
void redLed(){
rgb(255,0,0);
delay(200);
}
void rgb(int r, int g, int b){
analogWrite(P_RED, r);
analogWrite(P_GREEN, g);
analogWrite(P_BLUE, b);
}
void fadeBlu(){
// Controllo i limiti
if ( fadeVal == 255 && fadeUp )
fadeUp = false;
else if ( fedeVal == 0 && !fadeUp )
fadeUp = true;
if ( fadeUp )
++fadeVal;
else
--fadeVal;
rgb(0,0,fadeVal);
}
void human() {
if ( millis()-tmrDist >= TMR_DIST ) {
distTimer = millis();
distance = distanceSensor.measureDistanceCm();
}
// Gestione led in base alla presenza di ostacoli
if (distance<=30) {
redLed();
// resetta il fade
fadeVal = 0;
fadeUp = true;
} else {
if ( millis()-tmrFade >= TMR_FADE )
fadeBlu();
}
}
void loop(){
human();
}