Форум по Роботика
Контролери => Ардуино (Arduino) => Темата е започната от: Dr_Z в Юни 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 ще се включва твърде често и за кратки интервали от време.
Поздрави
-
Кой от двата do-while защото и на двата условието е променливата да е по-малка от 5, на по-голяма от някаква константа. След като казваш, че не достига желаната стойност и излиза от цикъла значи условието на цикъла е грешно или операциите в тялото му.
-
Благодаря за отговора
Нека да уточним следното, възможно ли е да се направи така, че влизайки в case 1 (примерно) да цикли там без да изпълнява други проверки и условия. Проблемът е в следното - влиза в case X изпълнява вярно "do", но се връща в началото и започва проверките преди достигане на зададена стойност "5"
(http://fire.filibe.net/mirror/Pompa-2.jpg)
-
Ако съм те разбрал правилно значи не ти трябва 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;
Това би трябвало да включи помпата докато водата не се приближи достатъчно до сензора. Не забравяй, че мериш разстояние до водното огледало, а не ниво на водата.
-
Благодаря Светлин,
Точно от това имам нужда помпата да се включи и да работи без прекъсване до достигане на максимално ниво.
Днес по-късно ще направя тестове и ще пиша.
Поздрави и успешен ден на всички.
Тестовете проведени работи перфектно !