Inkrementacja zmiennej

Masz problem, z którym nie możesz sobie poradzić? Pisz śmiało!
stiven
Złota rączka
Posty: 1629
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Inkrementacja zmiennej

Post autor: stiven » 20 sty 2020, 14:19

hazi18 pisze:
19 sty 2020, 21:59
Hej, "przepływ wody" testuję poprzez dmuchanie w czujnik :) narazie tylko tak sprawdzam czy jak leci i dojdzie do wartości czy program się zatrzyma.
Próbowałem Twój kod ( po zmianie wartości 2.25 na 1.65) nadal nie blokuje programu po osiągnięciu wartości podaje w if.
I nie wiem czemu miałem głupie błędy, że nie zadeklarowano zmiennych i musiałem je zadeklarować

Kod: Zaznacz cały

int flowPin;
float flowRate;
int count;
Chyba źle skopiowałeś kod, deklaracje tych zmiennych są w pierwszych trzech linijkach.
hazi18 pisze:
19 sty 2020, 21:59
co miałby oznaczać?

Kod: Zaznacz cały

 flowRate = (count/11); 
Przy Twoim czujniku jest podane
Przelicznik impulsowy F=11*Q Q=[L/m] F=[Hz]

Przy czujniku, do którego podałem wcześniej link, jest podane
Flow rate pulse characteristics: Frequency (Hz) = 7.5 * Flow rate (L/min)

I w programie potem zliczona ilość impulsów jest dzielona (nie mnożona) przez tę wartość 7.5. W Twoim przypadku analogicznie by było to 11. Skoro u Ciebie wyszła nawet wartość 73 litry, dzieląc to przez 2.5, żeby uzyskać wartość bez mnożenia, które było w programie, to i tak otrzymana wartość będzie za duża, poza zakresem czujnika. Czyli wynikałoby, że rzeczywiście ta wartość zliczonych impulsów powinna być podzielona przez jakąś wartość a nie mnożona. Ale to i tak nie może mieć wpływu na to, czy program się zatrzyma, czy nie.

Nie napisałeś czy masz coś połączone do pinu 3 od przycisku.
Wgraj taki program i pokaż co się pojawi na serialu przy testowaniu.

Kod: Zaznacz cały

int flowPin = 2;    //This is the input pin on the Arduino
double flowRate;    //This is the value we intend to calculate. 
volatile int count; //This integer needs to be set as volatile to ensure it updates correctly during the interrupt process.  
int przycisk = 3; 
unsigned long currentTime;
unsigned long cloopTime;
double razem = 0;
double razem_litrow = 0;
double p_razem = 0;
double p_razem_litrow = 0;
boolean blokada = 0;


void setup() {
  // put your setup code here, to run once:
  pinMode(flowPin, INPUT);           //Sets the pin as an input
  pinMode(przycisk, INPUT_PULLUP);
  attachInterrupt(0, Flow, RISING);  //Configures interrupt 0 (pin 2 on the Arduino Uno) to run the function "Flow"  
  Serial.begin(9600);  //Start Serial
  
  interrupts();   //Enables interrupts on the Arduino
  currentTime = millis();
  cloopTime = currentTime;
}
void loop() {
  currentTime = millis();
  
  if(currentTime >= (cloopTime + 1000))
  {     
    cloopTime = currentTime;              // Updates cloopTime
	
    flowRate = (count/11);        //Take counted pulses in the last second and multiply by 2.25mL 
	
    razem = razem + flowRate;
    razem_litrow = razem/1000;
	
    if(flowRate == 0) 
    {
      p_razem = 0;		//jeśli brak przepływ, wyzerowanie zmiennej zliczającej jednorazowy przepływ
      Serial.println("brak przepływu, wyzerowanie zmiennej");
    }
    else 
    {
      p_razem = p_razem + flowRate;	//w innym przypadku dodanie aktualnego chwilowego przepływu
      Serial.println("przepływ ciągły, sumowanie przepływu");
    }
    p_razem_litrow = p_razem/1000;
	
    flowRate = flowRate * 60;         //Convert seconds to minutes, giving you mL / Minute
    flowRate = flowRate / 1000;       //Convert mL to Liters, giving you Liters / Minute
	
    count = 0;      // Reset the counter so we start counting from 0 again
	
    Serial.print(razem_litrow);
    Serial.println(" litrów łącznie");
	
    Serial.print(flowRate);
    Serial.println(" litrów na minutę");
	
    Serial.print(p_razem_litrow);
    Serial.println(" litrów aktualnego przepływu");

  }  
  
  if(p_razem_litrow > 1.0) blokada = 1;   //jeśli jednorazowy przepływ większy niż 30 litrów (dla litra 1.0 zamiast 30.0)
  
  if(blokada == 1)	
  {  
    noInterrupts();
	//wyłączenie przepływu wody
    Serial.println("wejście w blokadę");
    while(blokada == 1) 	
    if(digitalRead(przycisk) == LOW)	//oczekiwanie na wciśnięcie przycisku
    {
      blokada = 0;
      Serial.println("wyjście z blokady");
    }
	//włączenie przepływu wody
   count = 0;
   p_razem = 0;	//wyzerowanie zmiennej zliczającej jednorazowy przepływ
   p_razem_litrow = 0; 
   Serial.println("wyzerowanie zmiennych");
   cloopTime = millis();
   interrupts();
  }
  
 }

void Flow()
{
  count++; //Every time this function is called, increment "count" by 1
}

Co miesiąc do wygrania nagrody o wartości ponad 1600 zł!


hazi18
Młodszy majsterkowicz
Posty: 44
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 20 sty 2020, 18:51

Hej, do pinu 3 mam podłączony przycisk. zrobiłem jak kazałeś, zmieniłem warunek na 0.1l i zrobiłem test. Program nie zatrzymał się tylko się resetnął :). Zastanawia mnie jedno, jeśli po każdej sekundzie jest zerowany aktualny przepływ wody to jak będę mieć awarię to nigdy program się nie zatrzyma bo nie osiągnie 30l. Więc trzeba by było dać odświeżanie co, np. 1 minutę, żeby czujnik doszedł do conajmniej 24l. Popraw mnie jeśli źle piszę :)
Żeby dojść do takiego wyniku 0.12l przy tylko obliczeniach musiałem użyć sprężonego powietrza :)
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
stiven
Złota rączka
Posty: 1629
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Inkrementacja zmiennej

Post autor: stiven » 20 sty 2020, 22:05

Zmienna z aktualną ilością impulsów jest zerowana co sekundę, ale wcześniej jest dodawana ich wartość po przeliczeniu do innych zmiennych i te zmienne są brane pod uwagę przy warunku do zablokowania programu.

Musisz mieć źle podłączony przycisk, bo program wchodzi w blokadę, ale sam wychodzi, widać to po komunikatach, które dodałem do wyświetlania. Odłącz przycisk od pinu i na pewno program się zatrzyma. Co to jest za przycisk i jak go podłączyłeś?

Trudno mi powiedzieć jaki powinien być właściwy ten współczynnik do przeliczania impulsów z czujnika na ml. Na razie możesz wrócić do *2.5, żeby łatwiej testować program.
hazi18
Młodszy majsterkowicz
Posty: 44
Rejestracja: 18 paź 2019, 20:36

Re: Inkrementacja zmiennej

Post autor: hazi18 » 21 sty 2020, 18:48

Juz dziala. Zle podlaczylem przycisk i robilo zwarcie. Pytanie jaki elektrozawor polecasz do tego projektu? Jesli teraz elektrozawor ma zamknac sie po osiagnieciu if'a to jak to zrobic? Dac mu sygnal z pinu od przeplywomierza?
stiven
Złota rączka
Posty: 1629
Rejestracja: 13 maja 2014, 08:47
Lokalizacja: Zielona Góra

Re: Inkrementacja zmiennej

Post autor: stiven » 22 sty 2020, 19:52

https://botland.com.pl/pl/803-zawory
Jak patrzę na te zawory, to one niewiele się różnią, poza złączami do podłączenia wody, więc wybór będzie zależał od możliwości połączenia. Każdy jest sterowany napięciem 12V i bez podania napięcia zawór jest zamknięty. Podanie napięcia otwiera zawór. Dlatego, że napięcie 12V, to nie wystarczy podłączyć bezpośrednio z pinem arduino. Będzie potrzebny dodatkowy układ z tranzystorem, albo z przekaźnikiem. Tyle że w przypadku przekaźnika, będzie można tylko całkiem otworzyć zawór, lub zamknąć, przy tranzystorze zdaje mi się, że można też będzie korzystając z PWM ustawić jak mocno ma się zawór otworzyć. Pobór prądu jest u wszystkich podobny, niecałe 0,5A.
ODPOWIEDZ

Strony partnerskie: