Покажи участието

От тук може да видиш всички публикации на този потребител.


Теми - Dr_Z

Страници: [1]
1
Ардуино (Arduino) / Проблем с код
« -: Юни 18, 2013, 09:24:32 pm »
здравейте,
от няколко дни се занимавам с Ардуино 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 ще се включва твърде често и за кратки интервали от време.




 Поздрави

Страници: [1]