Skocz do zawartości

Pomocna odpowiedź

Napisano

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ć

 

 

 

 

 

 

 

 

  • 2 tygodnie później...
#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 

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