pulsante funzione hold

ciao a tutti,
ho un dubbio sulla funzione del pulsante hold…
in realtà il programma funziona, perchè se premo il pulsante
il valore hold mi viene eseguito poi premendo il touch screen la funzione del pulsante si annulla…

ma se io volessi mantenere la funzione hold attiva anche lavorando sul touch screen
ed annullarla premendo nuovamente il pulsante, come posso fare?

di seguito allego il codice:

static int holdButton = 2;
int holdFlag = 0;


int x = A0;
int y = A1;
int nx = A2;
int ny = A3;

int touchFlag = 0;
int prevSend = 0;


void setup() {
  pinMode(holdButton, INPUT);
  digitalWrite(holdButton, HIGH);
  attachInterrupt(0, holdToggle, FALLING);
  Serial.begin(9600);
}
int readX() {
  int xr = 0;
  pinMode(A0, INPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, INPUT);
  pinMode(A3, OUTPUT);
  digitalWrite(A1, LOW);
  digitalWrite(A3, HIGH);
  delay(5);
  xr = analogRead(0);
}

int readY() {
  int yr = 0;
  pinMode(A0, OUTPUT);
  pinMode(A1, INPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, INPUT);
  digitalWrite(A0, LOW);
  digitalWrite(A2, HIGH);
  delay(5);
  yr = analogRead(1);
  return yr;

}

void holdToggle() {
    if (holdFlag == 1) {
    holdFlag = 0;
    touchFlag = 0;
  }
  else
    holdFlag = 1;
}

void loop() {
  prevSend = x + y;
  y = readY();
  x = readX();
  if (x < 1000 && y < 1000) {
    if (prevSend != x + y) {
      ny = map(y, 0, 1016, 0, 127);
      nx = map(x, 0, 1016, 0, 127);
      if (touchFlag == 0) {
        touchFlag = 1;
      }
    }
  }
else{
      if(touchFlag){
        touchFlag=0;
    }
  }
}

Usa una variabile boolean per hold.
La funzione che richiami all'interrupt falla in modo da invertire hold

hold = !hold

così se era 0 diventa 1, se era 1 diventa 0
Puoi richiamare la stessa funzione anche da un evento sul touch, in questo caso dalla pressione in una certa zona ed otterrai l'inversione della variabile hold.
Quindi sia che tu prema il pulsante, sia che tu prema una zona del touch da te appositamente predisposta, otterrai che hold passa da 0 ad 1 o da 1 a 0.

paulus1969:
Usa una variabile boolean per hold.
La funzione che richiami all’interrupt falla in modo da invertire hold

ciao paulus, grazie mille per il tuo intervento…
io ho modificato il listato seguento i tuoi suggerimenti,
che ne pensi?

const int holdPin = 2;
int holdStat = LOW;
boolean hold = false;
int val;


int x = A0;
int y = A1;
int nx = A2;
int ny = A3;

int touchFlag = 0;
int prevSend = 0;


void setup() {
  pinMode(holdButton, INPUT);
  digitalWrite(holdButton, HIGH);
  
  Serial.begin(9600);
}
int readX() {
  int xr = 0;
  pinMode(A0, INPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, INPUT);
  pinMode(A3, OUTPUT);
  digitalWrite(A1, LOW);
  digitalWrite(A3, HIGH);
  delay(5);
  xr = analogRead(0);
}

int readY() {
  int yr = 0;
  pinMode(A0, OUTPUT);
  pinMode(A1, INPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, INPUT);
  digitalWrite(A0, LOW);
  digitalWrite(A2, HIGH);
  delay(5);
  yr = analogRead(1);
  return yr;

}



void loop() {
    holdStat = digitalRead(holdPin);
    if (holdStat == HIGH) {
      hold = !hold;
}
  prevSend = x + y;
  y = readY();
  x = readX();
  if (x < 1000 && y < 1000) {
    if (prevSend != x + y) {
      ny = map(y, 0, 1016, 0, 127);
      nx = map(x, 0, 1016, 0, 127);
      if (touchFlag == 0) {
        touchFlag = 1;
      }
    }
  }
  else {
    if (touchFlag) {
      touchFlag = 0;
    }
  }
}

Puoi richiamare la stessa funzione anche da un evento sul touch, in questo caso dalla pressione in una certa zona ed otterrai l’inversione della variabile hold.
Quindi sia che tu prema il pulsante, sia che tu prema una zona del touch da te appositamente predisposta, otterrai che hold passa da 0 ad 1 o da 1 a 0.

al momento mi piacerebbe che alla pressione del tasto i valori del touch
rimanessero attivi in continuo (hold) con i valori di x ed y in funzione del dito…
così dici che possa funzionare?

niente da fare!!
ancora non sono riuscito a trovare la soluzione..
mi potete dare una mano?

Mica ho capito la modifica che hai fatto.
Come suggerito hai introdotto una nuova variabile booleana "hold".
La inverti alla pressione del pulsante. Ma poi... mi pare non ci fai nulla con questa variabile :o

E di base... ma che deve fare questo programma ? Che cosa hai collegato ad Arduino ?

nid69ita:
Mica ho capito la modifica che hai fatto.
Come suggerito hai introdotto una nuova variabile booleana "hold".
La inverti alla pressione del pulsante. Ma poi... mi pare non ci fai nulla con questa variabile :o

E di base... ma che deve fare questo programma ? Che cosa hai collegato ad Arduino ?

ciaoooo nid69ita,
grazie mille per aver risposto al mio aiuto..
dunque all'arduino ho collegato un touch screen resistivo 4 fili ed un pulsante sul pin 2..
in sostanza toccando il touch screen arduino mi legge i valori in coordinate x ed y: qui tutto bene.
quando non tocco il touch screen nessun valore, qui tutto bene..

premendo il pulsante vorrei che il valore ad esempio x=108 - y=167 fosse continuo..
per capirci meglio:
x=108 - y=167
x=108 - y=167
x=108 - y=167
naturalmente se tocco col dito il touch screen deve cambiare valore ma sempre in continuo (hold).
alla successiva pressione del pulsante la funzione si deve spegnere o disattivare e continuare
ad usare il touch screen normalmente..

al momento invece succede che il touch screen funziona,
se premo il pulsante la funzione hold si attiva ma se premo il touch screen per cambiare
valore x ed y la funzione hold si disattiva..
e se voglio spegnerla premendo di nuovo il pulsante non disattiva la funzione...
come posso procedere?

Ma il codice non è tutto li vero ?
Questo:
x=108 - y=167
è qualcosa che da qualche parte nel codice stampi su Monitor Seriale ?

nid69ita:
Ma il codice non è tutto li vero ?
Questo:
x=108 - y=167
è qualcosa che da qualche parte nel codice stampi su Monitor Seriale ?

ciao nid69ita,
si lo visualizzo sul serial monitor con il serial print:

Serial.print("X: ");
Serial.print("nx");
Serial.print(" - Y: ");
Serial.println("ny");

ciao nid69ita,
si lo visualizzo sul serial monitor con il serial print:
Serial.print("X: ");
Serial.print("nx");
Serial.print(" - Y: ");
Serial.println("ny");

PS: scusate errore mio, per correggere le virgolette mi sono quotato da solo ah ah ah...

Senza quella parte (meglio il codice completo) è difficile dirti come risolvere :confused:

nid69ita:
Senza quella parte (meglio il codice completo) è difficile dirti come risolvere :confused:

si, ok…

 const int holdPin = 2;
int holdStat = LOW;
boolean hold = false;
int val;


int x = A0;
int y = A1;
int nx = A2;
int ny = A3;

int touchFlag = 0;
int prevSend = 0;


void setup() {
  pinMode(holdPin, INPUT);
  digitalWrite(holdPin, HIGH);

  Serial.begin(9600);
}
int readX() {
  int xr = 0;
  pinMode(A0, INPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, INPUT);
  pinMode(A3, OUTPUT);
  digitalWrite(A1, LOW);
  digitalWrite(A3, HIGH);
  delay(5);
  xr = analogRead(0);
}

int readY() {
  int yr = 0;
  pinMode(A0, OUTPUT);
  pinMode(A1, INPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, INPUT);
  digitalWrite(A0, LOW);
  digitalWrite(A2, HIGH);
  delay(5);
  yr = analogRead(1);
  return yr;

}



void loop() {
  holdStat = digitalRead(holdPin);
  if (holdStat == HIGH) {
    hold = !hold;
    
    Serial.print("X: ");
    Serial.print(nx);
    Serial.print(" - Y: ");
    Serial.println(ny); 
  }
  prevSend = x + y;
  y = readY();
  x = readX();
  if (x < 1000 && y < 1000) {
    if (prevSend != x + y) {
      ny = map(y, 0, 1016, 0, 127);
      nx = map(x, 0, 1016, 0, 127);
      if (touchFlag == 0) {
        touchFlag = 1;
      }
    }
    Serial.print("X: ");
    Serial.print(nx);
    Serial.print(" - Y: ");
    Serial.println(ny);
  }
  else {
    if (touchFlag) {
      touchFlag = 0;
    }
  }
}

Solo quando è hold a vero stampi e da vedere anche altri casi.
Io stamperei con quella if(hold) alla fine della loop() e stamperei i valori precedenti (da salvare i 2 variabi2li distinte tipo prevx e prevy). Quando stampare quindi ? Quando hold a vero oppure (or) quando i valori nuovi sono cambiati.

void loop()
{ holdStat = digitalRead(holdPin);
  if (holdStat == HIGH) hold = !hold;
  y = readY();
  x = readX();
  if (x < 1000 && y < 1000) 
  { if (prevx!=x || prevy!=y) 
    { ny = map(y, 0, 1016, 0, 127);
      nx = map(x, 0, 1016, 0, 127);
      if (touchFlag == 0) touchFlag = 1;
    }
  }
  else 
  { if (touchFlag) touchFlag = 0;
  }
  if(hold || x!=prevx || y!=prevy)
  { prevx=x; 
    prevy=y; 
    Serial.print("X: "); Serial.print(prevx);
    Serial.print("Y: "); Serial.println(prevy);
  }
}

Non ho fatto test, potrebbe non essere corretto.

Senza offesa, però. Ci stai postando pezzi di codice a caso ? Stampi nx che nel codice è fisso a A2 e non c’entra nulla con quello che vuoi fare. Boh.

nid69ita:
Solo quando è hold a vero stampi e da vedere anche altri casi.
Io stamperei con quella if(hold) alla fine della loop() e stamperei i valori precedenti (da salvare i 2 variabi2li distinte tipo prevx e prevy). Quando stampare quindi ? Quando hold a vero oppure (or) quando i valori nuovi sono cambiati.

Non ho fatto test, potrebbe non essere corretto.

Senza offesa, però. Ci stai postando pezzi di codice a caso ? Stampi nx che nel codice è fisso a A2 e non c'entra nulla con quello che vuoi fare. Boh.

in effetti, oramai vado a tentativi e quindi direi di si, vado a caso..
però mi hai dato un imput importantissimo;
tra i mille tentativi fatti non mi ero più reso conto della mappatura su nx,
questa la devo subito sistemare, magari creando nuove variabili (xprova ed yprova)
al posto di nx ed ny perchè utilizzate per altri scopi..
però molto strano che mi dava tranquillamente i valori sul monitor.. mah!?!

provando il tuo listato ho dovuto creare le variabili prevx e prevy,
ma adesso su arduino il led RX è sempre acceso e sul serial monitor
senza premere touch screen o il pulsante partono una serie di valori fissi continui..

Nel dichiarare i pin falli sempre const (e basta byte)

const byte nx = A2;
const byte ny = A3;

Così nel tuo programma ti darà errore, stai usando le stesse variabili per ricalcolare i valori mappati. Errato.

Per la logica, probabilmente nel test se stampare o no, devi tenere conto anche di "touchFlag"

nid69ita:
Nel dichiarare i pin falli sempre const (e basta byte)

const byte nx = A2;

const byte ny = A3;



Così nel tuo programma ti darà errore, stai usando le stesse variabili per ricalcolare i valori mappati. Errato.

Per la logica, probabilmente nel test se stampare o no, devi tenere conto anche di "touchFlag"

ciaooooo nid69ita,
ho riprovato sul tuo precedente consiglio (quello dell’errore RX sempre attivo)…
ed ho trovato l’errore, praticamente era il delay (5)…
adesso funziona!!! grazie grazie!!!

praticamente quanto premo il pulsante (hold) si attiva la funzione e se tocco il touch screen
resta ancora attiva… bravissimo!!!

solo un ultima cosa: se premo di nuovo il pulsante per disattivare HOLD non si disattiva,
cosa bisogna fare?
il listato secondo i tuoi consigli l’ho modificato così:

  const int holdPin = 2;
int holdStat = LOW;
boolean hold = false;
int val;


int x = A0;
int y = A1;
int nx = A2;
int ny = A3;
int prevx = 0;
int prevy = 0;
int xprova = 0;
int yprova = 0;

int touchFlag = 0;
int prevSend = 0;


void setup() {
  pinMode(holdPin, INPUT);
  digitalWrite(holdPin, HIGH);

  Serial.begin(9600);
}
int readX() {
  int xr = 0;
  pinMode(A0, INPUT);
  pinMode(A1, OUTPUT);
  pinMode(A2, INPUT);
  pinMode(A3, OUTPUT);
  digitalWrite(A1, LOW);
  digitalWrite(A3, HIGH);
  //delay(5);
  xr = analogRead(0);
}

int readY() {
  int yr = 0;
  pinMode(A0, OUTPUT);
  pinMode(A1, INPUT);
  pinMode(A2, OUTPUT);
  pinMode(A3, INPUT);
  digitalWrite(A0, LOW);
  digitalWrite(A2, HIGH);
  //delay(5);
  yr = analogRead(1);
  return yr;

}



void loop()
{ holdStat = digitalRead(holdPin);
  if (holdStat == HIGH) hold = !hold;
  y = readY();
  x = readX();
  if (x < 1000 && y < 1000)
  { if (prevx!=x || prevy!=y)
    { yprova = map(y, 0, 1016, 0, 127);
      xprova = map(x, 0, 1016, 0, 127);
      if (touchFlag == 0) touchFlag = 1;
    }
  }
  else
  { if (touchFlag) touchFlag = 0;
  }
  if(hold || x!=prevx || y!=prevy)
  { prevx=x;
    prevy=y;
    Serial.print("X: "); Serial.print(xprova);
    Serial.print(" - Y: "); Serial.println(yprova);
  }
}
[\code]

Occhio ai pulsanti. Esiste il problema del debounce dei pulsanti.
Quando lo premi a volte non parte solo un HIGH ma una serie di HIGH-LOW-HIGH
http://arduinotutorial.altervista.org/category/digital-io/debounce/

nid69ita:
Occhio ai pulsanti. Esiste il problema del debounce dei pulsanti.
Quando lo premi a volte non parte solo un HIGH ma una serie di HIGH-LOW-HIGH
Debounce – Tutorial Arduino
https://www.arduino.cc/en/Tutorial/Debounce

ok, ho già cominciato a studiarmi l'argomento..
bhè adesso penso sia tutto in discesa..
non sò come ringraziarti, sei stato veramente molto gentile ad aiutarmi..
ancora grazie mille.