Skocz do zawartości

Pomiar prądu + czujnik poziomu cieczy


Pomocna odpowiedź

Próbuję od początku... chcę pominąć użycia przerwań i zamiast tego zastosować pustą pętlę-przykład znalazłem na kursie poziom 1.

Na razie zamiast wysyłania komunikatów stosuję serialPrint i LED- jako kontrolkę. Działanie 1 pływaka jest prawidłowe, przy zmianie stanu wysyłany jest 1 komunikat, jednak przy drugim już to nie działa (na razie tylko LED2 podłączyłem- bez serialPrint). LED2 cały czas się świeci niezależnie od stanu pływaka 2.

Może ktoś na to spojrzeć, gdzie jest błąd?


#define LED1 13
#define plywak1 0
#define LED2 12
#define plywak2 3

void setup() {
  Serial.begin(9600);
  Serial.println("Witaj!");
  pinMode(LED1, OUTPUT);
  pinMode(plywak1, INPUT_PULLUP);
  pinMode(LED2, OUTPUT);
  pinMode(plywak2, INPUT_PULLUP);
}

void loop() {
if (digitalRead(plywak1) == HIGH) {
  digitalWrite(LED1, HIGH); 
  Serial.println("Plywak 1 woda");
        while (digitalRead(plywak1) == HIGH) {
        delay(25); 
    }
} else {
  digitalWrite(LED1, LOW);
  Serial.println("Plywak 1 bez wody");
      while (digitalRead(plywak1) == LOW) {
      delay(25);
  }

  if (digitalRead(plywak2) == HIGH) {
  digitalWrite(LED2, HIGH); 
  } else {
digitalWrite(LED2, LOW);
} 
}
}

 

(edytowany)

A taka pętla loop() nie wystarczy?


void loop() {
  digitalWrite(LED1, digitalRead (plywak1));
  digitalWrite(LED2, digitalRead (plywak2));
}

 

Edytowano przez jand
(edytowany)

Zapalić lub zagasić LED.

O innych rzeczach nie wspominałeś.

Jedną linijkę powyższego można rozwinąć :

int stan = digitalRead (plywak1));
digitalWrite(LED1, stan);

 

Edytowano przez jand
Przed chwilą, Krisk napisał:

To jak by miała wyglądać cała pętla

A po co pętla jak się da bez niej?

Unikaj takiej konstrukcji typu "while (cośtam) delay(ileśtam)" jak ognia. A najlepiej w ogóle zapomnieć o istnieniu while - 99% rzeczy zrobisz bez tego.

Ifem jest nieco trudniej. Poza tym nie chodzi tu o nieskończoną pętlę tylko o sytuację, kiedy program jak głupi na coś czeka i w tym czasie nie może zrobić nic mądrego. Przykład: taka pętla zadziała jak mamy jeden klawisz. Jak mamy dwa... no cóż, może być ała!

 

Tu chodzi o to że możesz powołać timery programowe i w ich funkcjach sprawdzać stan pływaka lub przycisku, nie trzeba do tego przerwań od gpio. Timer wołany co 20ms sprawdza stan pływaków i może na zewnątrz przekazywać ich stan za pomocą zmiennych globalnych. Takie mało eleganckie rozwiązanie zwłaszcza że na pokładzie jest RTOS ale wystarczające dla prostych programów. 

(edytowany)
static int licznik = 0;
If(gpiox == 1)licznik = 0; // przycisk puszczony
if(gpiox == 0 && licznik < 4)licznik++;
If(licznik == 3){
// i tu można uznać że mamy stan stabilny
} 

Taka najprostsza obsługa w timerze programowym

Edytowano przez _LM_

Nie rozumiem, jak to można wykorzystać w moim programie.

Ja potrzebuję po prostu sprawdzać niezależnie od siebie stan 2 włączników, oraz odpowiednio zareagować tylko po zmianie ich stanu.

(edytowany)

Zainteresuj się biblioteką Bounce2 - ona zwraca właśnie zmiany stanu.

Fragment kodu:

void loop()
{
    przycisk1.update();
    przycisk2.update();
    if (przycisk1.fell()) {
        Serial.println("Przycisk 1 nacisniety");
    }
    if (przycisk1.rose()) {
        Serial.println("Przycisk 1 puszczony");
    }
    if (przycisk2.fell()) {
        Serial.println("Przycisk 2 nacisniety");
    }
    if (przycisk2.rose()) {
        Serial.println("Przycisk 2 puszczony");
    }
}

 

Edytowano przez ethanak

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »
×
×
  • Utwórz nowe...