Skocz do zawartości

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


kamkaminek

Pomocna odpowiedź

Walczę nad wyświetlaniem przeplywu cieczy za pomocą przeplywki YF-S402 i wyswietlacza z tematu. Potrafię odczytać przeplyw, na wyświetlacz też mogę wyslac informacje, lecz gdy chce to połączyć, nie działa.

1. Gdy dam kod wysylajacay info co ma wyswietlic na wyswietlaczu nad kodem obslugujacym przeplywke w loop, wyglada to jak na zdj nr.1image.thumb.png.fde7037635f44ef9f051498f8c62f83e.png

2. Gdy dam to pod kodem obslugujacym przeplywke, wyglada to jak na zdj nr.2

image.thumb.png.667a47a1981771f0fb1e5b65dd03f4c0.png

Co więcej, bez kodu obslugujacego wyswietlacz, po wlaczeniu programu arduino pieknie mi wyswietla zmieniajacy sie przeplyw, jesli kod zawiera komendy dotyczace wyswietlacz, niezaleznie czy na gorze, czy na dole kodu, wartosc przeplywu wynosi 0, dopiero zaczyna sie zmieniac po wcisnieciu czerwonego przycisku na arduino.

pewnie zapchalem jakas pamiec lub cos, jestem laikiem, prosze o pomoc (prosze nie zwracac uwagi na przelicznik przy wartosci przeplywu cieczy, zmodyfikowalem przeplywke, wspolczynnik sam znalazlem empirycznie).


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

#define BACKLIGHT_PIN 3

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);

volatile float NbTopsFan;  //measuring the rising edges of the signal
float Calc;
int hallsensor = 2;  //The pin location of the sensor

void rpm()  //This is the function that the interupt calls
{
  NbTopsFan++;  //This function measures the rising and falling edge of the hall effect sensors signal
}

void setup() {
  lcd.begin(16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home();
  lcd.print("Przeplyw");

  pinMode(hallsensor, INPUT);       //initializes digital pin 2 as an input
  Serial.begin(9600);               //This is the setup function where the serial port is initialised,
  attachInterrupt(0, rpm, RISING);  //and the interrupt is attached
}

void loop() {
  NbTopsFan = 0;  //Set NbTops to 0 ready for calculations
  sei();          //Enables interrupts
  delay(1000);    //Wait 1 second
  cli();          //Disable interrupts
  Calc = (NbTopsFan / 26.1);
  Serial.println(Calc);  //Prints the number calculated above
  Serial.print(" L/min\r\n");
  lcd.setCursor(0, 1);
  lcd.print(Calc);  //(Pulse frequency x 60) / 7.5Q, = flow rate in L/hour
  lcd.print(" L/Min");
}

 

Edytowano przez kamkaminek
Link do komentarza
Share on other sites

@kamkaminek wyprobuj ten kod... moze dzialac bedzie, druga sprawa to taka ze pin halla nie ma ustalonego stanu no chyba ze masz rezystor podciagajacy...

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

#define BACKLIGHT_PIN 3

LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7);

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

void rpm()  
{
  NbTopsFan++;  
}

void setup() {
  lcd.begin(16, 2);
  lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);
  lcd.setBacklight(HIGH);
  lcd.home();
  lcd.print("Przeplyw");

  pinMode(hallsensor, INPUT);       
  Serial.begin(9600);               
  attachInterrupt(0, rpm, RISING);  
}

void loop() {
  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(); 
 }
}

 

Link do komentarza
Share on other sites

8 minut temu, farmaceuta napisał:
Calc = (NbTopsFan / 26.1);

@farmaceuta nie powinno być 

Calc = (NbTopsFan / 26.1f); 

 

 

Edytowano przez _LM_
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

1 minutę temu, _LM_ napisał:

@farmaceuta nie powinno być 

Calc = (NbTopsFan / 26.1f); 

 

 

Niby nie bo w równaniu jest już float, choć miałem kiedyś przypadek że nie chciało mi rzutować za cholerę mimo że w równaniu było coś wiekszego niż int...

Link do komentarza
Share on other sites

5 minut temu, kamkaminek napisał:

Działa to, tylko ktos moze mi wtlumaczyc co jest bledem w moim kodzie? Druga kwestia, czy jak zaadoptuje ten kod do dluzszego programu bedzie wszystk gralo? Np program nie bedzie ciagle chodzil w przeprwaniu?@farmaceuta

Będzie działał dobrze...nie będzie ciągle chodził w przerwaniu, z tym że niema tu żadnej histerezy i czasem możesz mieć fałszywe impulsy...a co działało źle? Też obstawiam to że wylaczales przerwania lub użyłeś pinów od uart'a...tak mi się wydaje...ponadto użyj jakiejś normalnej biblioteki do LCD...nie wiem po co w konstruktorze podajesz tyle pinów...używaj tej biblioteki... https://github.com/johnrickman/LiquidCrystal_I2C (jest najpopularniejsza)

Link do komentarza
Share on other sites

10 minut temu, ethanak napisał:

@farmaceuta ale przemilczyłeś drobiazg, że do i2c potrzebny jest jeszcze konwerter?

On chyba ma konwerter...spójrz na zdjęcie...ja tam widzę ładne luty na wszystkich pinach i tak wnioskuję że ma, takiej biblioteki nawet używa 

Link do komentarza
Share on other sites

Uzylem tej biblioteki bo z nia akurat znalazlem jakis program na necie. W Arduino nie bawilem sie juz ze dwa lata i tak wyglada moje pisanie tego, coś znajdę, coś zmodyfikuje, cos popisze samemu. Zmienilem na twoja biblioteke, LCD podlaczylem pod A5 i A4, jakies zastrzezenia jeszcze ktore moga mnie uchronic przed problemami w przyszlosci? 😅

Link do komentarza
Share on other sites

Mam jeszcze jeden problem, pewnie bedzie ich wiecej. Problem wyzej to tylko mala czesc wiekszej zabawki. W kodzie poniżej druga petla while nie wykonuje sie caly czas jak powinna, mimo ze warunek jest spelniony, komendy na koncu serial print wykonuja sie za kazdym razem, mimo ze sa one poza While. 

Z grubsza program polega na tym, ze gdt czujka indukcyjna jest w odpowiednim stanie, program wlacza przekaznik od pompki, po czym zaleznie od stanu czujki ir otwiera lub zamyka obwod otwarty, pompka chodzi caly czas gdy indukcja dziala. Stany z czujki ir sa wczytywane do tablicy w celu wyeliminowania chwilowych zmian, poniewaz czujka ma wykrywac trawe na podbieraczu prasy rolujacej, belownicy (moze sie pojawic przeswit).

#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 = 0;
int przekaznik11 = 0;
int przekaznik22 = 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);
    for (int i = 0; i <= 3; i++) {
      sensorState = digitalRead(bramkair);
      irtab[i] = sensorState;
      delay(500);
    }


    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;
      //stanIR = LOW;
      Serial.println("Unbroken");
    }
  }

  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

W praktyce przekazniki zalezne od czujki ir wylaczaja sie i wlaczaja mimo braku zmiany stanu. Czas wylaczenia i wlaczenia trwa tyle co petla for. Zmniejszajac czas wylaczanie i wlaczanie zwieksza czestotliwosc.

  • Lubię! 1
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.