здравейте, 
от няколко дни се занимавам с Ардуино Uno. Реших да направя контролер за автоматично пълнене на воден резервоар   
с обем 1000 литра. С ултразвуков датчик (SRF05) измервам "ниво" или разстоянието м/у капака на съда и водното огледало. Следя 3 нива :
 Ниво 1 - max запълване 
 Ниво 2 - ~50 % от общия обем
 Ниво 3 - оставащи ~15 % от общия обем 
Една помпа /P1/  пълни резервоара и втора/P2/ източва вода от него.
М/у нива 1 и 2  P1 -OFF P2-ON
При достигане на ниво 2 P1-ON P2-ON
При ниво 3       P1-ON P2-OFF
 Имам проблем в кода или по-точно в "do while" променливата не достига желана стойност и просто излиза  от цикъла. 
 
#include <NewPing.h>
#define MAX_DISTANCE 95 
#define RELAY_P1_PIN 2 // Pompa
#define RELAY_P2_PIN 3 //Hidrofor
#define TRIGGER_PIN 13
#define ECHO_PIN 12
NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); 
#define H_TANK 90.0 /* cm */
#define ALARM_OFF 75 /* cm */
#define OFF_VEVEL_FULL 5 /* cm */
#define ON_LEVEL_50 50 /*cm*/
#define DELAY_0 6000 /* ms;  */
#define DELAY_1 5000 /* ms */
#define DELAY_2 2000 /* ms */
 
 
void setup() {
  pinMode(RELAY_P1_PIN, OUTPUT);
  pinMode(RELAY_P2_PIN, OUTPUT);
 
  
  Serial.begin(9600);
}
 
void loop() {
  int uS = sonar.ping_median(); 
  int hWatherCm = (uS / US_ROUNDTRIP_CM);
  delay(80);
  
   Serial.print("Control Ping: ");
   Serial.print(hWatherCm); 
   Serial.println("cm");
  
    
    if (check_alarm(hWatherCm) >= 5) 
     hWatherCm = (uS / US_ROUNDTRIP_CM);
   
   switch (check_alarm(hWatherCm)) {
  case 1:     /* Zapochva pulnene Hidrofor OFF */
     
     do     {delay (100);
            digitalWrite(RELAY_P1_PIN, LOW); /*Pompa ON */
            digitalWrite(RELAY_P2_PIN, LOW); /*Hidrofor OFF*/
            int uS = sonar.ping_median(); 
            int hWatherCm = (uS / US_ROUNDTRIP_CM);
            delay (100);
     }
            while (hWatherCm < 5) ;{
              Serial.print (hWatherCm);
          
           delay (100); }
          
          
                               
    //delay(DELAY_1);
    break;
 
  case 2:     
     do {
     delay (100);
            digitalWrite(RELAY_P1_PIN, LOW); /*Pompa ON*/
            digitalWrite(RELAY_P2_PIN, HIGH); /*Hidrofor ON*/
            Serial.print("opa opa");
            int uS = sonar.ping_median(); 
            int hWatherCm = (uS / US_ROUNDTRIP_CM);
            delay (100);}
            
            while (hWatherCm < 5);{
            Serial.print (hWatherCm);
             
             delay(100);}
         
         
            
  //  delay(DELAY_2);
    break;
 
  case 0: // no alarm
           Serial.println("case 0");
          digitalWrite(RELAY_P1_PIN, HIGH);
          digitalWrite(RELAY_P2_PIN, HIGH);
       // Serial.print(uS / US_ROUNDTRIP_CM);
          delay(DELAY_0);    
          
  }
}
  
 
int check_alarm(int hWatherCm) {
  delay(60);
 
 
  if (hWatherCm > ON_LEVEL_50) {
     if (hWatherCm >= ALARM_OFF) 
       return 1;
     else
       return 2;
  }
  return 0;
}
 
     Прегледах количество примери, но нещо ми убягва. При този цикъл на работа няма начин да се достигне 100% запълване на резервоара и съответно P1 ще се включва твърде често и за кратки интервали от време. 
 Поздрави