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
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
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
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.
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
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
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?
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....
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
#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
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
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
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?
la seconda
...
...
...
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