problema con il Costruttore della Libreria

Salve a tutti,
sono un programmatore PLC che inizia ad usare arduino per la prima volta e sono abituato a lavorare ad oggetti, ho costruito la mia prima libreria per avere i fronti di salita e discesa (Trig P e Trig N) ma le variabili di ingresso del costruttore vengono ignorate e non capisco il perchè.
nel file .cpp se sostituisco T con il numero del pin di ingresso e Q con la variabile di uscita lui funziona, quindi l'inizializzazione e l'inclusione della libreria sono a posto ma le variasbili del costruttore le ignora e non capisco dove sbaglio la sintassi, mi servirebbe aiuto per capire dove sbaglio la sintassi.
di seguito allego il codice:

Trig.h:

#ifndef Trig_h
#define Trig_h

class Trig {

public:

  Trig(int in, int out);
  void P();
  void N();
  int T = 0;
  int Q = 0;

private:
  bool memoria_P = false;
  bool memoria_N = true;
};
#endif
----------------------------------------------------------------------
Trig.cpp:
#include "Trig.h"
#include "Arduino.h"

Trig::Trig(int in, int out)
{
int T = in;
int Q = out;
}

// -------------- metodo P --------------
void Trig::P()
{
if (memoria_P == true) {
  Q = 0;
}
if (digitalRead (T) == LOW) {
  memoria_P = false;
}
if (digitalRead (T) == HIGH & memoria_P == false ) {
  Q = 1;
  Serial.println("Positive Trig");
  memoria_P = true;
}
}
// -------------- metodo N --------------
void Trig::N()
{
if (memoria_N == true) {
  Q = 0;
}
if (digitalRead(T) == HIGH) {
  memoria_N = false;
}
if (digitalRead(T) == LOW & memoria_N == false ) {  
  Q = 1;
   Serial.println("Negative Trig");
  memoria_N = true;
}  
}
----------------------------------------------------------------------
trigger_class:


#include "Trig.h"
#include "Arduino.h"

int FF = 0 ;
Trig Negativo(7, FF);
Trig Positivo(6, FF);


void setup() {

pinMode (6, INPUT);
pinMode (7, INPUT);
pinMode (12, OUTPUT);
Serial.begin(9600);

}

void loop() {

Negativo.N();
Positivo.P();

if (FF == 1) {
  digitalWrite (12, HIGH);
}
}
----------------------------------------------------------------------

Buongiorno e benvenuto :slight_smile: ,
prima di tuttto, essendo il tuo primo post nella sezione Italiana del forum, nel rispetto del regolamento di detta sezione (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione … possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO

… poi, in conformità al suddetto regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More → Modify che si trova in basso a destra del tuo post) e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread e sistemato il codice come da regolamento, nessuno ti potrà rispondere, quindi ti consiglio di fare il tutto al più presto. :wink:

ma le variabili di ingresso del costruttore vengono ignorate e non capisco il perchè.

Perchè se le dichiari così come hai fatto :

Trig::Trig(int in, int out)
{
int T = in;
int Q = out;
}

Sono variabili locali, cioè visibili solo nella funzione e distrutte alla sua uscita.
Prova così :

Trig::Trig(int in, int out)
{
   T = in;
   Q = out;
}

o meglio ancora :

Trig::Trig(int in, int out)
{
  this->T = in;
  this->Q = out;
}

Ciao, Ale.

grazie Ale!!! adesso funziona!! :grinning: :grinning: :grinning:

OPS… ancora un piccolo problema, Q però non lo vede come uscita ma come ingresso, ho provato con la sintassi

out = Q;

ma non funziona, come devo fare per avere il valore Q in uscita?
intanto ora il trig funziona e lo scrive sul monitor

Ah ok, uso una funzione Int invece che void e il risultato lo metto in return, il concetto non è proprio uguale a un PLC ma mi ci abituo

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.