ARDUINO LEONARDO COME TASTIERA DUW SKETCH INSIEME

salve, rieccomi qui dopo tempo per cercare di sviluppare oltre lo sketch che ho creato per tastiera per delle cose che devo fare continuamente.
ora avrei bisogno di poter programmare alcune cose senza tenere conto della scaletta dello sketch ma che funzionino indipendentemente. lo sketch in breve e il seguente

#include <Mouse.h>


#include <Keyboard.h>


void setup() {
 Keyboard.begin(); //inizializza la tastiera virtuale
 Mouse.begin(); //inizializza mouse virtuale
 delay (10000);
}

void loop() {

  Keyboard.press('5');
  delay(85);
  Keyboard.release('5');
  delay(61);
  Keyboard.press('2');
  delay(85);
  Keyboard.release('2');
  delay(61);
  Keyboard.press('2');
  delay(74);
  Keyboard.release('2');
  delay(63);
  Keyboard.press('2');
  delay(96);
  Keyboard.release('2');
  delay(87);
  //---------------------------------357ms
  Keyboard.press('2');
  delay(59);
  Keyboard.release('2');
  delay(91);
  Keyboard.press('2');
  delay(45);
  Keyboard.release('2');
  delay(81);
  Keyboard.press('2');
  delay(98);
  Keyboard.release('2');
  delay(82);
  //---------------------------------306ms
//---------------------------------cambio schermata
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
delay(100);
Keyboard.releaseAll();
delay(500);
//----------------------
Mouse.press(MOUSE_LEFT);
delay(2000);
Mouse.release(MOUSE_LEFT);
delay(5000);
Keyboard.press(KEY_RETURN);
delay(100);
Keyboard.release(KEY_RETURN);
delay(5000);
Keyboard.press(KEY_RETURN);
delay(100);
Keyboard.release(KEY_RETURN);
delay(5000);
Mouse.press(MOUSE_LEFT);
delay(100);
Mouse.release(MOUSE_LEFT);
delay(5000);
Keyboard.press(KEY_RETURN);
delay(100);
Keyboard.release(KEY_RETURN);
delay(5000);
Keyboard.press(KEY_RETURN);
delay(100);
Keyboard.release(KEY_RETURN);
delay(5000);
Keyboard.press(KEY_RETURN);
delay(100);
Keyboard.release(KEY_RETURN);
delay (5000);
//-------------------------------------
Keyboard.press(KEY_LEFT_ALT);
Keyboard.press(KEY_TAB);
delay(100);
Keyboard.releaseAll();
delay(500);
}

dovrei far si che prema altri 3 pulsanti ma per i fatti suoi e che abbiano questi un intervallo di tempo di pressione indipendente allo sketch sopra.
e possibile farlo? inoltre volevo capire se esisteva il comando mi pare che si chiamasse ''is'' ad esempio dicendo alla scheda ''isred'' (in pratica se questo punto e rosso) ferma lo sketch....logicamente il punto e da mettere all'inizio dello sketch o dove si vuole con le coordinate del mouse.
se nn mi sono spiegato ditemelo che nn mi offendo ^^ cerchero di spiegarmi meglio

sí; togliere tutti i delay() Sai come si usa millis()?

Il C /C++ non possiede comandi. Ha funzioni.

Ciao UWe

mills no nn so come funziona precisamente, ma comporta che mi sbaglia i tempi di pressione utilizzando mills?

Se programmi in modo giusto no.
Cao Uwe

uwefed:
Se programmi in modo giusto no.
Cao Uwe

avresti modo di aiutarmi nel creare lo sketch?

ragazzi c'e' qualcuno che puo darmi una mano a programmare questo sketch?

ragazzi mi sapete aiutare?
vi ripeto cio che devo fare:
ho bisogno di premere tre pulsanti della tastiera sempre ad intervalli regolari mentre altri due tasti proseguono sempre a coclo continuo sempre durante questo schetck faccio un cambio schermata per premere il mouse per poi tornare nella schermata iniziale e riprendere il ciclo.

ad esempio:
premo 1
delay()
premo 2
delay()
//..........cosi per parecchie volte
premi 3 ogni 170 sec
premi 4 ogni 180
premi 5 ogni 200
//
cambio schermata
//
faccio quello che devo fare nella schermata nuova
//
torno alla schermata iniziale

come mi han gia fatto notre dovrei usare la funzione millis per premere i tre tasti ad aintervallo sempre uguale ma non capisco come programmarlo e se e possibile programmare il millis e anche delay insieme
grazie

Per l' uso corretto di millis per programmare tempi di attesa o controlli di intervalli vedi esempio "blink without delay" nella IDE di Arduino. https://www.arduino.cc/en/Tutorial/BlinkWithoutDelay

Praticamente millis é un contatore di millisecondi dall'accensione del Arduino.
Se vuoi programmare un ritardo o un intervallo di tempo/attesa memorizzi l' attuale valore di millis in una variabile unsigned long e controlli se l' intervallo é passato:

unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval)

Dentro il if fai eseguire quello che vuoi fare dopo il ritardo o intervallo.
Il codice non é bloccante e percui puoi controllare entrate o gestire uscite e interfaccie.

Ciao Uwe

ti ringrazio molto!
per inserire tre diversi lassi di tempo per avviare tre comandi in tre tempi diversi devo creare tre millis diversi col tempo indipendente uno dall'altro oppure devo mettere la prima con valore pieno e le successive impostare solo la differza del valore del tempo dalla prima?non so se mi sono spiegato =(

unsigned long currentMillis = millis(   devo impostare il tempo che mi serve per attivare il tasto?     );
  if (currentMillis - previousMillis >= interval)

nell'esempio che mi hai postato parla di accendere e spegne un led ma per comandare un tasto della tastiera non riesco a concepire il modo=(

io creai questo pezzettino di sketck ma non so se e corretto, arduino non mi da nessun errore nel farlo girare

#include <Mouse.h>


#include <Keyboard.h>

unsigned long t0= milis()=178000
void setup() {
 Keyboard.begin(); //inizializza la tastiera virtuale
 Mouse.begin(); //inizializza mouse virtuale
 delay (10000);
}

void loop() {

  Keyboard.press('5');  
 delay(100);
  Keyboard.release('5');
  millis();

.......continua

avendo tre variabili di tempo devo aggiungere t0 la prima t1 la seconda e t2 la terza?

unsigned long t0= milis()=178000

questo sicuramente non va :slight_smile:

unsigned long t0; // creo la variabile

poi nel setup o nel loop o in qualsiasi altra funzione...

t0= millis(); // con 2 elle ;-)
void loop() {

  Keyboard.press('5'); 
 delay(100);
  Keyboard.release('5');
  millis(); // questa riga a cosa serve?... non stampa, non scrive, non conta... non serve

Patrick_M:

unsigned long t0= milis()=178000

questo sicuramente non va :slight_smile:

unsigned long t0; // creo la variabile

poi nel setup o nel loop o in qualsiasi altra funzione...

t0= millis(); // con 2 elle ;-)
void loop() {

Keyboard.press('5');
delay(100);
  Keyboard.release('5');
  millis(); // questa riga a cosa serve?... non stampa, non scrive, non conta... non serve

hai ragione!!! pensavo che girasse invece mi sono sbagliato con un altro sketch probabilmente.
nel setup dopo aver creato la variabile t0 come faccio per dire che t0 = 178000?
e nel loop come faccio a dire che quando arriva al tempo t0 deve premere il tasto 5 la tastiera?

Keyboard.press('5'); 
 delay(100);
  Keyboard.release('5');
delay(100);

nel setup dopo aver creato la variabile t0 come faccio per dire che t0 = 178000?

a be, allora è diverso, se quello deve essere un valore fisso allora basta fare la dichiarazione così

const unsigned long t0=178000;

e nel loop come faccio a dire che quando arriva al tempo t0 deve premere il tasto 5 la tastiera?

aggiungi una variabile (le variabili che usano millis() devono essere di tipo unsigned long )

unsigned long tInizio; //alla fine del setup lo mettiamo = a millis()

come scritto nel commento

void setup() {
   ...
   ...    //tutto quello che ci deve essere
   tInizio=millis(); // aggiungo questa linea
}

poi nel loop controllo il tempo passato

void loop() {
   if ((millis() - tInizio) >= t0) {  // se da quando ho memorizzato tinizio sono passati 178 secondi...
      Keyboard.press('5');
      delay(100);
      Keyboard.release('5');
      delay(100);
      tInizio=millis()  // aggiorno il tempo per il nuovo conteggio
   }
   ...
   ... // altri pezzi del loop
}

solo una considerazione....
vista la scarsa esattezza del calcolo dei tempi di arduino, se non usi un orologio esterno, dopo un po di funzionamento la simulazione dei tasti avverrà con tempi sempre meno precisi

p.s.
come è scritto anche nel regolamento, ti prego di non inviarmi messaggi in privato per argomenti dei topic. Se posso e se ho capito qual'è l'argomento del topic intervengo...

diciamo che non mi serve un contatore preciso preciso, quindi mi e sufficiente l'arduino il problema grosso e come fare per programmarlo come voglio io.
con quello che mi hai scritto ho gia capito abbastanza quello che devo fare e ti ringrazio e mi scuso per il pm.
ora presupponendo che la prima variabile ho capito come crearla ed utilizzarla nel loop, ogni quanto devo mettere il controllo del tempo trascorso?
per creare le altre due variabili delle quali ho bisogno devo fare la stessa cosa?

e scusa l'ignoranza ma non riesco a farlo andare....

#include <Mouse.h>

#include <Keyboard.h>

const unsigned long t0=178000;
const unsigned long t1=170000;
const unsigned long t2=180000;
void setup() {
 Keyboard.begin(); //inizializza la tastiera virtuale
 Mouse.begin(); //inizializza mouse virtuale
 delay (10000);
 unsigned long tInizio;
 unsigned long tInizio1;
 unsigned long tInizio2;
}

void loop() {
   if ((millis() - tInizio) >= t0) {  // se da quando ho memorizzato tinizio sono passati 178 secondi..
      Keyboard.press('5');
      delay(100);
      Keyboard.release('5');
      delay(100);
      tInizio=millis()  // aggiorno il tempo per il nuovo conteggio
   } 
{
   if ((millis() - tInizio1) >= t1) {  // se da quando ho memorizzato tinizio sono passati 170 secondi...
      Keyboard.press('3');
      delay(100);
      Keyboard.release('3');
      delay(100);
      tInizio1=millis()  // aggiorno il tempo per il nuovo conteggio
      }   
{  
             if ((millis() - tInizio2) >= t2) {  // se da quando ho memorizzato tinizio sono passati 180 secondi...
      Keyboard.press('4');
      delay(100);
      Keyboard.release('4');
      delay(100);
      tInizio2=millis()  // aggiorno il tempo per il nuovo conteggio
{
    Keyboard.press('2');
  delay(85);
  Keyboard.release('2');
  delay(61);
  Keyboard.press('2');
  delay(74);
...
....
.... continua loop

su questo passaggio continua a darmi errore cosi come sugli altri che ho scritto basandomi sul tuo

if ((millis() - tInizio) >= t0) {  // se da quando ho memorizzato tinizio sono passati 178 secondi..

l'errore e questo

exit status 1
'tInizio' was not declared in this scope

si vede che non hai seguito bene il post precedente....:wink:

aggiungi una variabile (le variabili che usano millis() devono essere di tipo unsigned long )

unsigned long tInizio; //alla fine del setup lo mettiamo = a millis()

ovviamente va scritta assieme a questa

const unsigned long t0=178000;

all'inizio del programma e non nel setup, altrimenti diventa una variabile locale (che può essere usata solo dentro la funzione che la crea, in questo caso il setup)

ora presupponendo che la prima variabile ho capito come crearla ed utilizzarla nel loop, ogni quanto devo mettere il controllo del tempo trascorso?

il controllo del tempo lo fa la if (millis()... e viene controllato ad ogni "giro" di loop cioè svariate migliaia di volte al secondo (se nel programma non ci sono delay) quindi non te ne devi preoccupare :slight_smile:

se ho capito dovrebbe essere cosi....

#include <Mouse.h>


#include <Keyboard.h>

unsigned long tInizio;
const unsigned long t0=178000;

unsigned long tInizio1;
const unsigned long t1=170000;

unsigned long tInizio2;
const unsigned long t2=180000;

void setup() {
 Keyboard.begin(); //inizializza la tastiera virtuale
 Mouse.begin(); //inizializza mouse virtuale
 

 tInizio=millis();
 tInizio1=millis();
 tInizio2=millis();
 delay (5000);

}

void loop() {
   if ((millis() - tInizio) >= t0)   // se da quando ho memorizzato tinizio sono passati 178 secondi...
      Keyboard.press('5');
      delay(100);
      Keyboard.release('5');
      delay(100);
      tInizio=millis(); // aggiorno il tempo per il nuovo conteggio
   
//------------
delay (500);
//------------
if ((millis() - tInizio1) >= t1)   // se da quando ho memorizzato tinizio sono passati 178 secondi...
      Keyboard.press('4');
      delay(100);
      Keyboard.release('4');
      delay(100);
      tInizio1=millis();// aggiorno il tempo per il nuovo conteggio
      
//------------
delay (500);
//------------
if ((millis() - tInizio2) >= t2)   // se da quando ho memorizzato tinizio sono passati 178 secondi...
      Keyboard.press('3');
      delay(100);
      Keyboard.release('3');
      delay(100);
      tInizio2=millis(); // aggiorno il tempo per il nuovo conteggio
//-----------
delay (500);
//------------
Keyboard.press('2');
  delay(85);
  Keyboard.release('2');
  delay(61);
  Keyboard.press('2');
  delay(74);
  Keyboard.release('2');
  delay(63);
.....
......
......
...//continua loop
}

il problema e che non preme mai i tasti.......5 4 e 3 ......perche?

non dovrebbe premerli subito nel partire e poi di conseguenza ogni tot secondi che ho impostato nelle variabili ???

unsigned long tInizio;
const unsigned long t0=178000;

unsigned long tInizio1;
const unsigned long t1=170000;

unsigned long tInizio2;
const unsigned long t2=180000;

se tu avessi provato a formattare il programma da strumenti -> formattazione automatica oppure premendo ctrl+t, avresti visto cosa hai scritto nel loop :wink:
e cioè:

  if ((millis() - tInizio) >= t0)   // se da quando ho memorizzato tinizio sono passati 178 secondi...
    Keyboard.press('5');       // <--- questa è dentro all'if
  delay(100);                   //
  Keyboard.release('5');      // tutte queste no!
  delay(100);
  tInizio = millis(); // aggiorno il tempo per il nuovo conteggio

  //------------
  delay (500);
  //------------
  if ((millis() - tInizio1) >= t1)   // se da quando ho memorizzato tinizio sono passati 178 secondi...
    Keyboard.press('4'); 
  delay(100);
  Keyboard.release('4');
  delay(100);         //
  tInizio1 = millis(); // aggiorno il tempo per il nuovo conteggio

  //------------
  delay (500);
  //------------
  if ((millis() - tInizio2) >= t2)   // se da quando ho memorizzato tinizio sono passati 178 secondi...
    Keyboard.press('3');
  delay(100);
  Keyboard.release('3');
  delay(100);
  tInizio2 = millis(); /

cioè.... se devi eseguire più di una istruzione dentro ad un if (...)
CI VOGLIONO LE PARENTESI!!!!
altrimenti viene eseguita solo una istruzione se la condizione e vera, mentre le restanti istruzioni vengono sempre eseguite in quanto fanno parte del ciclo principale del loop...
quindi il tuo codice va modificato così

  if ((millis() - tInizio) >= t0)  { // se da quando ho memorizzato tinizio sono passati 178 secondi...
    Keyboard.press('5');       
    delay(100);                   
    Keyboard.release('5');     
    delay(100);
    tInizio = millis(); // aggiorno il tempo per il nuovo conteggio
  }

e togli anche il delay(500) tra un if e l'altro che non serve a nulla :wink:

perfetto!!!!!
funziona meravigliosamente!
ho riscontrato un problema pero, ovvero come faccio per far premere subito i tasti 3 4 5 ad inizio sketch? perche la prima volta dovrei attivarli subito e da li poi partire con i conteggi
grazie

aggiungi le varie attivazioni nel setup..

void setup() {
...  //tutto quello che c'è gia
...
  Keyboard.press('5');       
  delay(100);                  
  Keyboard.release('5');     
  delay(100);
  Keyboard.press('4');
  delay(100);
  Keyboard.release('4');
  delay(100);   
  Keyboard.press('3');
  delay(100);
  Keyboard.release('3');
  delay(100);
}

quindi qualsiasi cosa io inserisca nel setup , le fa immediatamente nel accendere arduino la prima volta e poi che comanda e il millis?
quindi il contatore millis partira nel setup dopo aver attivato le tre funzioni giusto?

void setup() {
  Keyboard.begin(); //inizializza la tastiera virtuale
  Mouse.begin(); //inizializza mouse virtuale

Keyboard.press('5');       
  delay(100);                 
  Keyboard.release('5');     
  delay(100);
  tInizio1 = millis();
  Keyboard.press('4');
  delay(100);
  Keyboard.release('4');
  delay(100);   
  tInizio = millis();
  Keyboard.press('3');
  delay(100);
  Keyboard.release('3');
  delay(100);
  tInizio2 = millis();
  delay (5000);

}

oppure devo compilarlo cosi:

void setup() {
  Keyboard.begin(); //inizializza la tastiera virtuale
  Mouse.begin(); //inizializza mouse virtuale

Keyboard.press('5');       
  delay(100);                 
  Keyboard.release('5');     
  delay(100);

  Keyboard.press('4');
  delay(100);
  Keyboard.release('4');
  delay(100);   

  Keyboard.press('3');
  delay(100);
  Keyboard.release('3');
  delay(100);
 
  
  tInizio = millis();
  tInizio1 = millis();
  tInizio2 = millis();
  tInizio3 = millis();
  delay (5000);

}

???????????

la seconda :wink:
...
...
...
o la prima
è indifferente, ci sono poche centinaia di millisecondi di differenza...

quindi qualsiasi cosa io inserisca nel setup , le fa immediatamente nel accendere arduino la prima volta e poi che comanda e il millis?
quindi il contatore millis partira nel setup dopo aver attivato le tre funzioni giusto?

si, tutto quello che c'è nel setup viene eseguito per primo (ed una sola volta) poi sarà quello che c'è nel loop a comandare il programma