Автор Тема: Проблем с код  (Прочетена 11645 пъти)

Dr_Z

  • Новодошъл
  • *****
  • Публикации: 3
    • Профил
    • http://fire.filibe.net
Проблем с код
« -: Юни 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 ще се включва твърде често и за кратки интервали от време.




 Поздрави

sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Проблем с код
« Отговор #1 -: Юни 18, 2013, 10:54:04 pm »
Кой от двата do-while защото и на двата условието е променливата да е по-малка от 5, на по-голяма от някаква константа. След като казваш, че не достига желаната стойност и излиза от цикъла значи условието на цикъла е грешно или операциите в тялото му.
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

Dr_Z

  • Новодошъл
  • *****
  • Публикации: 3
    • Профил
    • http://fire.filibe.net
Проблем с код
« Отговор #2 -: Юни 19, 2013, 11:02:48 am »
Благодаря за отговора
Нека да уточним следното, възможно ли е да се направи така, че влизайки в case 1 (примерно) да цикли там без да изпълнява други проверки и условия. Проблемът е в следното - влиза в case X  изпълнява вярно "do", но се връща в началото и започва проверките преди достигане на зададена стойност "5"


sv_shady

  • Administrator
  • *****
  • Публикации: 636
    • Профил
Проблем с код
« Отговор #3 -: Юни 19, 2013, 12:03:11 pm »
Ако съм те разбрал правилно значи не ти трябва do-while, ами нещо подобно:

case 1:     /* Zapochva pulnene Hidrofor OFF */
     
     delay (100);
     digitalWrite(RELAY_P1_PIN, LOW); /*Pompa ON */
     digitalWrite(RELAY_P2_PIN, LOW); /*Hidrofor OFF*/
     
     while (hWatherCm > 5)
     {
         int uS = sonar.ping_median();
         int hWatherCm = (uS / US_ROUNDTRIP_CM);
     }
     
     Serial.print (hWatherCm);
     delay (100);
                                       
    //delay(DELAY_1);
    break;


Това би трябвало да включи помпата докато водата не се приближи достатъчно до сензора. Не забравяй, че мериш разстояние до водното огледало, а не ниво на водата.
Imagination is the only limit.......

Светлин Пенков
София / Рединг, Великобритания

Dr_Z

  • Новодошъл
  • *****
  • Публикации: 3
    • Профил
    • http://fire.filibe.net
Проблем с код
« Отговор #4 -: Юни 19, 2013, 12:32:39 pm »
Благодаря Светлин,
Точно от това имам нужда помпата да се включи и да работи без прекъсване до достигане на максимално ниво.
Днес по-късно ще направя тестове  и ще пиша.




     Поздрави и успешен ден на всички.

Тестовете проведени работи перфектно !