Skocz do zawartości

Błąd wyswietlania i pomiaru przeplywu YF-S402 i wyswietlacz 2x16 i2C


Pomocna odpowiedź

@farmaceuta przecież to napisał... wykrycie jakichśtam przerw w czymśtam.

@kamkaminek tu aż się prosi o wywalenie tych pętli razem z delajami i zaimplementowanie prostej maszyny stanów - będzie mniej problemów przy późniejszej rozbudowie programu.

Link do komentarza
Share on other sites

@farmaceuta nie zapisuje tego samego, zapisuje stan z bramki ir co 500ms, tam jest delay. Zrobiłem to po to aby jakiś jeden niski sygnał wśród wysokich nie wyłączył mi wszystkiego i na odwrót (jeden stan wysoki) ponieważ myślę że materiał który ma zasłaniać czujkę może czasami przepuścić jakąś wiązkę światła. Dlatego napisałem sb takie potwierdzenie, czyli jeśli 4 razy z rzędu ( w tym przypadku wpisany delay(500), czyli w ciągu 2 sekund) stan będzie ten sam dopiero zmieni się wykonywana pętla

Link do komentarza
Share on other sites

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

Produkcja i montaż PCB - wybierz sprawdzone PCBWay!
   • Darmowe płytki dla studentów i projektów non-profit
   • Tylko 5$ za 10 prototypów PCB w 24 godziny
   • Usługa projektowania PCB na zlecenie
   • Montaż PCB od 30$ + bezpłatna dostawa i szablony
   • Darmowe narzędzie do podglądu plików Gerber
Zobacz również » Film z fabryki PCBWay

10 minut temu, farmaceuta napisał:

to zrób to inaczej...

Na przykład:

int counter = 0;
for (int i=0; i<4; i++) {
  if (digitalRead(cośtam)) counter++;
  delay(500);
}

I wtedy mamy jeśli counter >= 3 to znaczy jest, a jak nie to nie ma.

Coś w tym stylu zanim kolega się naumie maszyny stanów, bo wtedy to już żadnej pętli w ptogramie nie będzie.

Link do komentarza
Share on other sites

@ethanak Obydwa ify sie wykonuja, najpierw ten ktory sprawdza czy mniejsze od 1, pozniej ten ktory sprawdza czy wiekszy od 3. Sprobuje jeszcze z milis(), tylko musze chwile pomyslec bo jeszcze tego nie uzywalem,

Link do komentarza
Share on other sites

Jesli nie ogarne z milis, dam zwyczajnie petle while zamiast if, bede musial wtedy dac sprawdzenie tablicy w kazdej z nich, no i zabezpieczyc sie przed wariantem w ktorym nie wszystkie wartosci w petli sa takie same

Link do komentarza
Share on other sites

@ethanak Dobra, jestem debilem. wystarczylo dac warunek ktory sprawdza if (stanir<1) pod tym ktory sprawdza (stanir>=3). Ale i tak jak wczesniej odpowiednie przekazniki sie wlaczaja, tylko tez wylaczaja sie na czas trwania petli

Link do komentarza
Share on other sites

Zrobilem takie cos z milis(), nwm czy dobrze, ale przekazniki nadal mi klikaja, wartosc jakby sie kasuje po skonczeniu programu. Jak wyrzucilem Delay z petli, tez klikal tylko z wieksza czestotliwoscia 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define bramkair 7
#define przekaznik1 3
#define przekaznik2 4
#define indukcyjny 5
#define przekaznikpompka 6
int irtab[]{ 0, 0, 0, 0 };
int sensorState = 0, lastState = 0;
int stanIR = 0;
bool indukcjastan = 1;
int przekaznik11 = 0;
int przekaznik22 = 0;
int i=0;
LiquidCrystal_I2C lcd(0x27, 20, 4);

volatile float NbTopsFan;
float Calc;
int hallsensor = 2;
float kopia_Calc;
uint32_t last;

void rpm() {
  NbTopsFan++;
}

void setup() {
  //Sterowanie przekaznikami, zaworami ->
  pinMode(bramkair, INPUT);
  digitalWrite(bramkair, HIGH);
  pinMode(przekaznik1, OUTPUT);
  pinMode(przekaznik2, OUTPUT);

  pinMode(indukcyjny, INPUT);
  digitalWrite(indukcyjny, LOW);
  pinMode(przekaznikpompka, OUTPUT);
  //Przeplywka i wyswietlacz ->
  lcd.begin(16, 2);
  lcd.init();
  lcd.backlight();
  lcd.home();
  lcd.print("Przeplyw");

  pinMode(hallsensor, INPUT);
  //attachInterrupt(0, rpm, RISING);

  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:


  indukcjastan = digitalRead(indukcyjny);

  while (indukcjastan == 0) {
    digitalWrite(przekaznik2, HIGH);
    digitalWrite(przekaznik1, HIGH);
    digitalWrite(przekaznikpompka, HIGH);
    indukcjastan = digitalRead(indukcyjny);
  }


  while (indukcjastan == 1) {
    digitalWrite(przekaznikpompka, LOW);

    indukcjastan = digitalRead(indukcyjny);

if (millis() - last > 250UL) {

      sensorState = digitalRead(bramkair);
      irtab[i] = sensorState;
      i++;
      last = millis();

}
  Serial.println(irtab[0]);
  Serial.println(irtab[1]);
  Serial.println(irtab[2]);
  Serial.println(irtab[3]);




    if (irtab[0] == 0 && irtab[1] == 0 && irtab[2] == 0 && irtab[3] == 0) {
      digitalWrite(przekaznik1, LOW);
     przekaznik11 = LOW;
      delay(200);
      digitalWrite(przekaznik2, HIGH);
      przekaznik22 = HIGH;
      //stanIR = HIGH;
      Serial.println("Broken");
    }

      /*if (millis() - last > 1000UL) {
  Calc = (NbTopsFan / 26.1);
  Serial.println(Calc);  
  Serial.print(" L/min\r\n");

  if (Calc != kopia_Calc) {
  lcd.setCursor(0, 1);
  lcd.print(Calc);  
  lcd.print(" L/Min");
  }
    NbTopsFan = 0;  
    kopia_Calc = Calc;
    last = millis(); 
 }*/
    

    if (irtab[0] == 1 && irtab[1] == 1 && irtab[2] == 1 && irtab[3] == 1) {
      digitalWrite(przekaznik2, LOW);
      przekaznik22 = LOW;
      delay(200);
      digitalWrite(przekaznik1, HIGH);
      przekaznik11 = HIGH;

    }
    else
    {
     digitalWrite(przekaznik2, przekaznik22);
    digitalWrite(przekaznik1, przekaznik11);
    }
    if(i>3)
    i=0;

  }




  Serial.println(irtab[0]);
  Serial.println(irtab[1]);
  Serial.println(irtab[2]);
  Serial.println(irtab[3]);
  Serial.println(stanIR);
  Serial.println(indukcjastan);
}

 

Link do komentarza
Share on other sites

@ethanak Pisze spostrzezenia, sprawdzalem czy to on nie jest winny. Utworzylem nowy sketch, w ktorym napisalem tylko obsluge przekaznikow kozystajac z ir. Program dzialal jak trzeba, do momentu w ktorym dodalem ten warunek w petli z IR: indukcjastan = digitalRead(indukcyjny);

Wygląda na to jakby sie zerowala po kazdorazowym wykonaniu petli

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

#define bramkair 7
#define przekaznik1 3
#define przekaznik2 4
#define indukcyjny 5
#define przekaznikpompka 6

int irtab[]{ 0, 0, 0, 0 };
int sensorState=0;
bool indukcjastan = 1;


void setup() {
  // put your setup code here, to run once:

pinMode(bramkair, INPUT);
  digitalWrite(bramkair, HIGH);
  pinMode(przekaznik1, OUTPUT);
  pinMode(przekaznik2, OUTPUT);
  pinMode(indukcyjny, INPUT);
  digitalWrite(indukcyjny, LOW);
  pinMode(przekaznikpompka, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:

indukcjastan = digitalRead(indukcyjny);

  while (indukcjastan == 0) {
    digitalWrite(przekaznik2, HIGH);
    digitalWrite(przekaznik1, HIGH);
    digitalWrite(przekaznikpompka, HIGH);
    indukcjastan = digitalRead(indukcyjny);
  }

while (indukcjastan == 1) {
 indukcjastan = digitalRead(indukcyjny);
    digitalWrite(przekaznikpompka, LOW);

for (int i=0;i<=3;i++)
  {
    sensorState = digitalRead(bramkair);
    irtab[i]= sensorState;
    delay(250);
  }

 if (irtab[0] == 0 && irtab[1] == 0 && irtab[2] == 0 && irtab[3] == 0)
 {
  digitalWrite(przekaznik1, LOW);
  delay(200);
  digitalWrite(przekaznik2, HIGH);
  Serial.println("Broken");
 }

 if (irtab[0] == 1 && irtab[1] == 1 && irtab[2] == 1 && irtab[3] == 1)
  {
     digitalWrite(przekaznik2, LOW);
     delay(200);
     digitalWrite(przekaznik1, HIGH);
      Serial.println("Unbroken");
  }
}
}

 

Link do komentarza
Share on other sites

@kamkaminek jeśli nastąpiła zmiana stanu (brakło siana) to ustawiasz flagę i zaczynasz odliczać czas, cały czas sprawdzając czy siano się nie pojawiło...jeśli tak to kasujesz flagę i przestajesz odliczać, jeśli zaś siano się nie pojawiło to po ustalonym czasie zmieniasz stanna przekaźnikach 

Link do komentarza
Share on other sites

@farmaceuta Tak, to by bylo prostsze, ale ja chce potwierdzenia w postaci przynajmniej trzech impulsow sprawdzonych w ciagu np. 1,5sekundy czy przez ten czas tego siana tam nie bylo, dopiero ustawiam flage, dlatego caly czas jest tam ta tablica. Moge to zrobic jak kolega wyzej napisal, dodajac np wartosc 1 do jakiejs zmiennej i wystawiac flage w momencie kiedy po 3 sprawdzeniach co 500ms wartosc urosla do 3, ale jak to zrobilem nie naprawilo to dzialania mojego programu. Jak narazie widze ze problem jest z czujnikiem indukcyjnym ktory nwm dlaczego po wykonaniu petli zalapuje na chwile wartosc 0, na zalaczonym screenie jest sprawdzany co 500ms, taka wartosc zeby zobaczyc wgl przez ile czasu utrzymuje mu sie ciulowaty stan. Nie wiem czy nie poleglem na polaczeniu, czy nie powinienem dac jakiegos rezystora miedzy sygnalem

1070822901_Serialprintproblemarduino.thumb.png.199a53d6f9632259d78483ddd7d286bb.png

Link do komentarza
Share on other sites

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...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.