Skocz do zawartości

Odczyt wejść w programie QtCreator funkcja WiringPiISR, Raspberry Pi4b


Bornhartt

Pomocna odpowiedź

Dzień dobry, mam problem z ustawieniem wejść cyfrowych na raspberry Pi4b, chciałbym skorzystać z funkcji WiringPiISR aby odczytywać tylko zbocze narastające.

1. Sensor przepływu cieczy wysyła sygnał cyfrowy na pin "1", 

2. Odczytuje kolejne zbocza narastające na danym pinie i zliczam je w zmiennej. Tutaj rozumiem, że ta funkcja WiringPiISR wymaga podania:pinu, rodzaju zbocza, oraz co ma być wykonane

3. Po zliczeniu np. 100 sygnałów ma się wykonać funkcja wyłączająca pompkę

Problem napotykam w samej składni, ponieważ nie jestem doświadczonym programista, i niewiele wiem o qt, 

Etap na którym ugrzązłem: 

W konstruktorze:

WiringPiISR (pin_1,INT_EDGE_RISING,isrInput);

Oraz zadeklarowałem

void(*isrInput)(void);

Tylko nie wiem co to tak naprawdę oznacza.

Chciałbym jedynie aby dany pin odczytywał zbocze narastające

 

Przepraszam za brak kodu, bo nie mam aktualnie możliwości wstawienia, oczywiście mogę podesłać plik .h oraz .cpp aczkolwiek jest to goła aplikacja w qt creator jedynie z kodem inicjalizujacym bibliotekę wiringPi oraz dane piny.

Dziękuję z góry za każdą wskazówkę jak dany problem rozwiązać

 

 

 

 

 

 

 

 

Link do komentarza
Share on other sites

#include "drinkmachine.h"
#include "ui_drinkmachine.h"


//po wybraniu drinka ustaw pompy i ilosc
//odmierzaj ilosc i wypisuj ja na ekranie
//po odmierzeniu wylacz pompy
//
//

int vol1 = 0;

DrinkMachine::DrinkMachine(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::DrinkMachine)
{
    ui->setupUi(this);
    wiringPiSetup();
    m_pin = 15;//pin wejscia sygnalu z przeplywomierza
    pinMode(15, GPIO_INPUT);
   
    wiringPiISR(15, INT_EDGE_RISING, &DrinkMachine::isrInput);//funkcja ISR z detekcja zbocza narastajacego, 
    //po wychwyceniu ma sie wykonac funkcja zliczajaca sygnaly
   
    pinMode(7, GPIO_OUTPUT);//pin wyjscia uruchamiajacy pompe
}

DrinkMachine::~DrinkMachine()
{
    delete ui;
}

void DrinkMachine::isrInput()
{
   vol1++;
}

void DrinkMachine::display(int a)
{
    ui->display->setText(QString::number(a));
    QString displayval = ui->display->text();

}

void DrinkMachine::volume(int vol, int pin)
{
    digitalWrite(pin,LOW);//ustaw pompe

    if(vol1>=vol)//jesli ilosci sie zgadzaja
    {
        digitalWrite(pin,HIGH);
        vol1=0;
    }

}

void DrinkMachine::on_t_on_clicked()
{
    volume(300,7);
}

void DrinkMachine::on_t_off_clicked()
{
     digitalWrite(7,HIGH);
     display(vol1);
}

funkcja on_t_on_clicked() jest wywoływana poprzez przyciśnięcie ikonki na panelu dotykowym, i oczywistym błędem jest, że funkcja volume() wywoła się tylko raz, natomiast chciałbym aby wykonywała się w tle aż do wyłączenia pompy.

Co do funkcji WiringPiISR to rozwiązaniem było wykorzystać funkcję void static

#ifndef DRINKMACHINE_H
#define DRINKMACHINE_H



#include <QObject>
#include <QMainWindow>
#include <wiringPi.h>
#include <QDateTime>
#include <QString>
#include <QDebug>


#define GPIO_INPUT   0
#define GPIO_OUTPUT  1


QT_BEGIN_NAMESPACE
namespace Ui { class DrinkMachine; }
QT_END_NAMESPACE

class DrinkMachine : public QMainWindow
{
    Q_OBJECT

public:
    DrinkMachine(QWidget *parent = nullptr);//konstr
    ~DrinkMachine();//destr

   void display(int a);
   void volume(int a, int pin);//funkcja ustawiająca ilosc i pompe
   void static isrInput(void);

private slots:

    void on_t_on_clicked();
    void on_t_off_clicked();

Czy ktoś mógłby mi podać rozwiązanie tego problemu? 

Wykonywanie funkcji zliczającej sygnały z przepływomierza bez zawieszania programu pętlą while.

W przyszłości chciałbym aby np. dwie pompy działały równocześnie 

Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

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