здравейте,
от няколко дни се занимавам с Ардуино 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 ще се включва твърде често и за кратки интервали от време.
Поздрави