Olá a todos, primeiramente quero agradecer pela oportunidade de estar fazendo parte da comunidade Arduino.
Preciso de uma solução para adaptar um código no meu teensy preciso de ajuda para fazer uma sequencia de loop onde ele digita 2x o mesmo numero e apos um tempo de 50 minutos continue a sequencia, que vai de 000000 - 999999. Segue o código abaixo, pois ele digita continuamente e como comecei agora não tenho muita ideia de como fazer da forma que preciso..
Exemplo do que preciso:
000000
000000
tempo: 50min
000001
000001
tempo: 50min
000002
000002
e por ai vai ate parar em 999999...
Código que tenho para adaptar..
#include <usb_keyboard.h>
// This code is licensed under Apache 2.0 License
// http://www.apache.org/licenses/LICENSE-2.0.txt
// Limitation of Liability. In no event and under no legal theory,
// whether in tort (including negligence), contract, or otherwise,
// unless required by applicable law (such as deliberate and grossly
// negligent acts) or agreed to in writing, shall any Contributor be
// liable to You for damages, including any direct, indirect, special,
// incidental, or consequential damages of any character arising as a
// result of this License or out of the use or inability to use the
// Work (including but not limited to damages for loss of goodwill,
// work stoppage, computer failure or malfunction, or any and all
// other commercial damages or losses), even if such Contributor
// has been advised of the possibility of such damages.
// This code is indented for people who are not able to contact
// apple support and I am in no way liable for any damage or
// problems this code might cause.
const int ledPin = 13; // choose the pin for the LED
int counter = 0;
int fakecounter = counter;
char pin[]="xxxxxx";
void setup() {
pinMode(ledPin, OUTPUT); // declare LED as output
delay(7000);
}
void loop(){
keyboard_modifier_keys = 0;
if (counter <= 999999){
delay(8000);
digitalWrite(ledPin, LOW);
delay(5500);
digitalWrite(ledPin, HIGH);
sprintf(pin, "%04d", fakecounter);
//sending first digit
Keyboard.press(pin[0]);
delay(100);
Keyboard.release(pin[0]);
delay(100);
//sending second digit
Keyboard.press(pin[1]);
delay(100);
Keyboard.release(pin[1]);
delay(100);
//sending third digit
Keyboard.press(pin[2]);
delay(100);
Keyboard.release(pin[2]);
delay(100);
//sending forth digit
Keyboard.press(pin[3]);
delay(100);
Keyboard.release(pin[3]);
delay(100);
//sending fifth digit
Keyboard.press(pin[4]);
delay(100);
Keyboard.release(pin[4]);
delay(100);
//sending sixth digit
Keyboard.press(pin[5]);
delay(100);
Keyboard.release(pin[5]);
delay(100);
//sending enter
Keyboard.press(KEY_ENTER);
delay(305);
Keyboard.release(KEY_ENTER);
}
//reached 6 digit PIN max value
if (counter > 999999){
for (int blinkies = 0; blinkies < 8; blinkies++) {
digitalWrite(ledPin, HIGH);
delay(20);
digitalWrite(ledPin, LOW);
delay(200);
}
delay(6000);
}
++counter;
fakecounter = counter;
}
Você pode usar a função millis() pra te ajudar e evitar que seu código fique estagnado em um delay nesse intervalo de 50min. Tenho o seguinte exemplo:
unsigned long tempo = millis(); //Coloca essa parte no inicio do programa
if(millis()-tempo<3000000 && counter <= 999999){ //3000000 sao 50 min em ms
Serial.println(counter); //Nao sei o que voce quis dizer com digitar, entao usei o comando serial pra simbolizar essa parte
Serial.println(counter);
tempo = millis();
counter++;
}
Não cheguei a testar, então pode haver algum erro, mas a essência é essa. Se eu tiver entendido sua dúvida errado ou caso você ainda não tenha entendido algo, pode perguntar.
Obrigado por responder meu post, vou tentar ser o mais claro possível.
Quando vc cria por exemplo um email cria tb uma senha, entao na parte da senha pede pra vc digitar por 2x para entao confirmar que aquela e a senha que vc ira usar! Entao e isso que preciso, que o codigo faça essa digitação por 2x porem em numeros começando com 0000 ate 9999, exemplo 0000, 0000, 0001, 0001, 0002, 0002 e assim por diante ate parar em 9999. Meu codigo acima mostrado informa que existe uma sequencia a ser digitada começando com 0000 ate 9999 porem nao tem essa digitação por 2x a mesma sequencia, ele digita direto 0000, 0001, 0002, 0003... Entendeu o que preciso agora?
binhop:
Boa noite,
Você pode usar a função millis() pra te ajudar e evitar que seu código fique estagnado em um delay nesse intervalo de 50min. Tenho o seguinte exemplo:
unsigned long tempo = millis(); //Coloca essa parte no inicio do programa
if(millis()-tempo<3000000 && counter <= 999999){ //3000000 sao 50 min em ms
Serial.println(counter); //Nao sei o que voce quis dizer com digitar, entao usei o comando serial pra simbolizar essa parte
Serial.println(counter);
tempo = millis();
counter++;
}
Não cheguei a testar, então pode haver algum erro, mas a essência é essa. Se eu tiver entendido sua dúvida errado ou caso você ainda não tenha entendido algo, pode perguntar.
Att,
Fábio
Bem, dá pra você fazer isso usando o código que eu passei mudando apenas a linha do Serial pra sua aplicação:
unsigned long tempo = millis(); //Coloca essa parte no inicio do programa
int n1,n2,n3,n4,n5,n6;
if(millis()-tempo<3000000 && counter <= 999999){ //3000000 sao 50 min em ms
n1=counter%10+48; //Basicamente eu desmembrei o counter em 6 digitos, começando com a casa das unidades (n1)
n2=(counter/10)%10+48; //Eu adiciono 48 pq a funçao keyboard funciona de acordo com a tabela asc ii
n3=(counter/100)%10+48;
n4=(counter/1000)%10+48;
n5=(counter/10000)%10+48;
n6=(counter/100000)%10+48;
keyboard.press(n6); //Depois eu so mando digitar os digitos na ordem
delay(100);
keyboard.release(n6);
keyboard.press(n5);
delay(100);
keyboard.release(n5);
keyboard.press(n4);
delay(100);
keyboard.release(n4);
keyboard.press(n3);
delay(100);
keyboard.release(n3);
keyboard.press(n2);
delay(100);
keyboard.release(n2);
keyboard.press(n1);
delay(100);
keyboard.release(n1);
tempo = millis();
counter++;
}
entao tentei colocar seu codigo no meu Arduino Teensy e esta dando um erro ao qual não sei como solucionar pode me auxiliar? No caso seria uma emulação de teclado que digita os números automaticamente..
binhop:
Boa noite,
Bem, dá pra você fazer isso usando o código que eu passei mudando apenas a linha do Serial pra sua aplicação:
unsigned long tempo = millis(); //Coloca essa parte no inicio do programa
int n1,n2,n3,n4,n5,n6;
if(millis()-tempo<3000000 && counter <= 999999){ //3000000 sao 50 min em ms
n1=counter%10+48; //Basicamente eu desmembrei o counter em 6 digitos, começando com a casa das unidades (n1)
n2=(counter/10)%10+48; //Eu adiciono 48 pq a funçao keyboard funciona de acordo com a tabela asc ii
n3=(counter/100)%10+48;
n4=(counter/1000)%10+48;
n5=(counter/10000)%10+48;
n6=(counter/100000)%10+48;
keyboard.press(n6); //Depois eu so mando digitar os digitos na ordem
delay(100);
keyboard.release(n6);
keyboard.press(n5);
delay(100);
keyboard.release(n5);
keyboard.press(n4);
delay(100);
keyboard.release(n4);
keyboard.press(n3);
delay(100);
keyboard.release(n3);
keyboard.press(n2);
delay(100);
keyboard.release(n2);
keyboard.press(n1);
delay(100);
keyboard.release(n1);
O código que eu coloquei está reduzido, a ideia era você implementar ele no seu. Mas já que você disse que é iniciante, vou fazer isso pra você: (só copiar e colar numa sketch nova)
#include <Keyboard.h>
unsigned long tempo = millis(); //Coloca essa parte no inicio do programa
int n1,n2,n3,n4,n5,n6,counter;
void setup(){
//Suas fumções de inicialização
Keyboard.begin();
}
void loop(){
if(millis()-tempo<3000000 && counter <= 999999){ //3000000 sao 50 min em ms
n1=counter%10+48; //Basicamente eu desmembrei o counter em 6 digitos, começando com a casa das unidades (n1)
n2=(counter/10)%10+48; //Eu adiciono 48 pq a funçao Keyboard funciona de acordo com a tabela asc ii
n3=(counter/100)%10+48;
n4=(counter/1000)%10+48;
n5=(counter/10000)%10+48;
n6=(counter/100000)%10+48;
Keyboard.press(n6); //Depois eu so mando digitar os digitos na ordem
delay(100);
Keyboard.release(n6);
Keyboard.press(n5);
delay(100);
Keyboard.release(n5);
Keyboard.press(n4);
delay(100);
Keyboard.release(n4);
Keyboard.press(n3);
delay(100);
Keyboard.release(n3);
Keyboard.press(n2);
delay(100);
Keyboard.release(n2);
Keyboard.press(n1);
delay(100);
Keyboard.release(n1);
tempo = millis();
counter++;
}
}
Se der algum erro, informe qual é que vai ser mais fácil te ajudar. Dependendo, um print da tela facilita mais ainda.
Boa noite e obrigado por estar me dando essa força, porem ao colocar o código que me passou no teensy ele executa as mesmas funçoes do codigo que postei no inicio do post. Eu preciso que ele faça esse digito por 2x e de pausa de 50min seja em ms ou ml. O codigo esta digitando sem parar um numero abaixo do outro conforme a modificação que fiz, porem nao repete a mesma carreira pra depois seguir para proxima.
Exemplo como deveria:
000000
000000
50 min depois
000001
000001
50min depois
000002
000002
E assim por diante, isso que preciso que ele faça, me entendeu agora? Veja a imagem da sketch
O código que eu coloquei está reduzido, a ideia era você implementar ele no seu. Mas já que você disse que é iniciante, vou fazer isso pra você: (só copiar e colar numa sketch nova)
#include <Keyboard.h>
unsigned long tempo = millis(); //Coloca essa parte no inicio do programa
int n1,n2,n3,n4,n5,n6,counter;
void setup(){
//Suas fumções de inicialização
Keyboard.begin();
}
void loop(){
if(millis()-tempo<3000000 && counter <= 999999){ //3000000 sao 50 min em ms
n1=counter%10+48; //Basicamente eu desmembrei o counter em 6 digitos, começando com a casa das unidades (n1)
n2=(counter/10)%10+48; //Eu adiciono 48 pq a funçao Keyboard funciona de acordo com a tabela asc ii
n3=(counter/100)%10+48;
n4=(counter/1000)%10+48;
n5=(counter/10000)%10+48;
n6=(counter/100000)%10+48;
Keyboard.press(n6); //Depois eu so mando digitar os digitos na ordem
delay(100);
Keyboard.release(n6);
Keyboard.press(n5);
delay(100);
Keyboard.release(n5);
Keyboard.press(n4);
delay(100);
Keyboard.release(n4);
Keyboard.press(n3);
delay(100);
Keyboard.release(n3);
Keyboard.press(n2);
delay(100);
Keyboard.release(n2);
Keyboard.press(n1);
delay(100);
Keyboard.release(n1);
tempo = millis();
counter++;
}
}
Se der algum erro, informe qual é que vai ser mais fácil te ajudar. Dependendo, um print da tela facilita mais ainda.
Sem problemas em ajudar.
Eu cometi um equívoco no if do void loop e arrumei no código abaixo. Com isso ele não vai mais digitar sem parar, e sim a cada 50min. Bugs fazem parte... ainda mais que não deu pra mim testar antes de enviar.
Em relação a repetição de 2x, eu também arrumei (basicamente usei um for pra repetir a estrutura 2x).
#include <Keyboard.h>
unsigned long tempo = millis(); //Coloca essa parte no inicio do programa
int n1,n2,n3,n4,n5,n6,counter;
void setup(){
//Suas fumções de inicialização
Keyboard.begin();
}
void loop(){
if(millis()-tempo>3000000 && counter <= 999999){ //3000000 sao 50 min em ms
n1=counter%10+48; //Basicamente eu desmembrei o counter em 6 digitos, começando com a casa das unidades (n1)
n2=(counter/10)%10+48; //Eu adiciono 48 pq a funçao Keyboard funciona de acordo com a tabela asc ii
n3=(counter/100)%10+48;
n4=(counter/1000)%10+48;
n5=(counter/10000)%10+48;
n6=(counter/100000)%10+48;
for(int i=0;i<2;i++){
Keyboard.press(n6); //Depois eu so mando digitar os digitos na ordem
delay(100);
Keyboard.release(n6);
Keyboard.press(n5);
delay(100);
Keyboard.release(n5);
Keyboard.press(n4);
delay(100);
Keyboard.release(n4);
Keyboard.press(n3);
delay(100);
Keyboard.release(n3);
Keyboard.press(n2);
delay(100);
Keyboard.release(n2);
Keyboard.press(n1);
delay(100);
Keyboard.release(n1);
tempo = millis();
counter++;
}
}
}
Se ainda sobrar algum erro, pode voltar a falar que a gente vai até o programa ficar 100%.