Configurar Micro para apretar Ctrl sin loop

Hola, estoy aprendiendo todo esto del arduino y tengo un Micro con un gatillo de taladro que le puse. Lo que quiero hacer es poder apretar el gatillo y que se apriete la tecla Ctrl y automaticamente se desapriete aunque yo no suelte el gatillo. LEs muestro mi código para que ustedes me digan como quito el loop.

<#include <Keyboard.h>

void setup() {
 pinMode(4, INPUT_PULLUP);

 Serial.begin(9600);
 Keyboard.begin();
}
void loop(){
 while (digitalRead (4) == HIGH){
   delay(100);
 }
 Keyboard.press (KEY_LEFT_CTRL);
 delay(500);
 Keyboard.releaseAll();
 delay(100);
 Keyboard.end();
 }>

Como hago para quitar el loop y que se desapriete el botón solito y que al volverlo a apretar apriete Ctrl y se desapriete de nuevo solo.

Gracias!!!

Buen día amigo, bienvenido a este mundo, la verdad no entiendo lo que tratas de hacer, vamos por partes, ¿a que te refieres con:

tengo un Micro

? ¿el gatillo de taladro lo usas como interruptor? ¿que quieres hacer cuando aprietas el gatillo?
Ahora en lo que se refiere a tu código ¿para que usas ese while() con el delay()? .
Si pones el código completo o un esquema de lo que tienes conectado o algo mas claro de lo que hace tu codigo, sera mas fácil de brindarte ayuda

Hola, si, simplemente quiero apretar el gatillo y que se presione 1 vez la tecla ctrl e inmediatamente que se despresione aunque yo mantenga apretado el gatillo. Pero lo que me hace es apretarlo una y otra vez!

Gracias!!!!

Necesitarás crear una variable que pueda saltarse un IF en caso de haber pulsado la tecla. Plantéalo de la siguiente manera:

-Crea una variable con el más variopinto nombre que quieras con valor 0
-Un IF comprobará el estado del pulsador y que la variable es cero, y si es correcto, hace un keyboard.press y después un keyboard.releaseall
-Después del keyboard.releaseall asignas un valor distinto de cero a la variable para que el IF la identifique como que no es 0 y no podrá correr el IF
-Cuando el pulsador se suelte, asignará un 0 a la variable para que pueda volver a pulsar la tecla.

Este mismo código lo tengo por ahí en un programa pero ahora mismo no sé dónde está, y funciona, porque es para un proyecto que quiero hacer pasado el verano con una consola de botones. El código funciona pero está incompleto. Cuando lo encuentre te pongo la parte interesante. :wink:

Estas emulando un teclado de PC via USB o es un simple teclado 4x4.
Es raro porque Keyboard.h suele llamarse la librería para teclados matriciales pero no veo la definición de pines y matriz de corresondencia del teclado matricial.
Por otro lado si fuera un teclado emulador USB faltan tmb cosas.

PUedes explicarte?

No comprendo aun muchas cosas pero trataré de explicar. Tengo un gatillo, osea un botón, lo tengo conectado al Arduino Micro. Lo que yo quiero hacer es apretar el gatillo y que se presione CTRL una sola vez e inmediatamente se suelte no importando si sigo apretando el gatillo y que vuelva a un estado de stand by para esperar a que lo vuelva a presionar.

Al soltar el gatillo me gustaría que no sucediera nada en espera de que vuelva a presionarlo.

Lo que no quisiera y es lo que me está sucediendo es que aprieto el gatillo y mientras lo mantengo apretado se queda presionado el CTRL y no se como hacer para que lo suelte. Cambié un poco el código pero no se que me pueda faltar.

#include <Keyboard.h>

void setup() {
    pinMode (4, INPUT_PULLUP);

     Serial.begin(9600);
     Keyboard.begin();
}

void loop() {
    while (digitalRead (4) == HIGH){
      delay(100);
    }
      Keyboard.press (KEY_LEFT_CTRL);{
      delay (50);}
    Keyboard.releaseAll();
    Keyboard.end();
}

Gracias!!!

muy bien ya se comprendió un poco mejor lo que quieres hacer. Para eso solo tienes que detectar el cambio de estado del botón con el flanco de bajada

#include <Keyboard.h>   


bool estado_gatillo = true;     //Variables para guardar estados del gatillo
bool estado_anterior = true;   //inicializo en true porque tienes conectado en pull-up

void setup() {

  pinMode (4, INPUT_PULLUP);

  Serial.begin(9600);
  Keyboard.begin();
}

void loop()
{

  //Lo primero es quitar el while, que no sirve para nada 
  

    
  estado_gatillo = digitalRead(4);  //guardamos el estado del botón en la variable estado_gatillo

  
  if ( !estado_gatillo && estado_anterior)  //aqui es donde se detecta el flanco
  
{

    //  >>>>>>Aquí va todo lo que quieres que se ejecute al presionar el botón<<<<<<<
    //por ejemplo:
    Serial.println("Se presionó el gatillo");
  }
  estado_anterior=estado_gatillo;
}

En serio tu comprendes @RIG usando la librería Keyboard.h bueno yo me perdí de algo porque sigo sin comprender.
Es algo como esto? Keyboard.h Library example

Se trata de un arduino que le envia un comando de Teclado de PC a la PC?

Es un arduino Micro, no se la verdad si ese sea el mejor modo de hacerlo. Con mi poca experiencia solo se me ocurre que sea un teclado por que la app con la que quiero usar el gatillo necesita apretar CTRL una vez e inmediatamente soltar la tecla aunque yo tenga el gatillo apretado para esperar a que yo nuevamente suelte y apriete el gatillo, pero solo consigo que apriete ctrl y lo suelte y repite el ciclo mientras tengo apretado el gatillo o he logrado que funcione como boton nada mas aprieto y aprieta ctrl y suelto y la suelta.

Siento que estoy cerca de lograrlo pero tal vez necesito un comando o algo así para que lo haga

Gracias!!!!

La verdad no comprendo que quiere hacer con esa biblioteca keyboard.h. Lo único que entendí (en realidad lo supongo), es la parte donde dice que aprieta el gatilo y que el evento solo ocurra una vez aunque lo deje presionado, por eso solo le pongo la parte que quiere hacer con el botón, incluso borre la parte ;

      Keyboard.press (KEY_LEFT_CTRL);{
      delay (50);}
    Keyboard.releaseAll();
    Keyboard.end();
}

Como lo dije es lo que yo entendí, como el amigo no da mucha información, espero no estar equivocado, pero, esperemos la respuesta del amigo Fermeister

Si pero si no entendiste porque decís que entendiste jajaja!!!

que tiene que ver esto KEY_LEFT_CTRL esto se usa cuando emulas teclados de PC con un Arduino y lo envias por USB, por eso mi confusión y si la persona que tiene la duda no puede explicar algo tan elemental estamos en problemas no te parece.

Sino como bien vos decis y como yo he preguntado para que esta la librería? Para leer un pin no necesitas nada.

Si pero si no entendiste porque decís que entendiste jajaja!!!

jajaj tienes razon, debi aclarar bien ese punto(en realidad solo entendí una parte)
Bueno al parecer el interesado esta en este momento en linea, ahora pregunto; Fermeister, tienes que ser mas claro con todo lo que quieres hacer, te voy a unas preguntas, cuando aprietas al gatillo:

priete el gatillo, pero solo consigo que apriete ctrl

¿a quien le mandas crtl? ¿para que? ¿ porque usas la biblioteca keyboard? ¿como tienes conectado el arduino? ¿que haces con cuando se aprieta crtl? toda la informacion que proporciones es de mucha ayuda

Lo que quiero hacer es un Push to Talk para un simulador de Control de Tránsito Aéreo que tengo. la idea es la siguiente.

1.- El programa me requiere que presione 1 vez la tecla ctrl
2.- En ese momento un programa anexo que tiene esta a la escucha de mi voz convirtiendo todos los comandos que digo en letras o códigos que se escriben en automático
3.- Cuando el programa considera que he terminado de hablar envia los comandos al avión.
4.- El avión contesta.

Por lo tanto elegí la libreria Keyboard por que en tutoriales en youtube decía que usara esa y por que necesito que se presione la tecla ctrl. No se si otras bibliotecas lo hacen. Ahora bien necesito apretar el gatillo y que se haga una especie de click en Ctrl. Yo quiero seguir apretando el gatillo (ahora muerto OFF) para fines de simulación de radio. Luego deseo soltar el gatillo y que el arduino no haga absolutamente nada.

Por utlimo quiero que vuelva al origen y el arduino esté en espera de que yo vuelva a apretar el gatillo para hacer todo el ciclo de nuevo.

El arduino está conectado del gatillo (switch o botón) con dos cables uno al pin 4 otro a la tierra y luego por USB a la computadora.

Disculpa que tardara pero es que sigo haciendo pruebas y este arduino hace de todo menos lo que le digo o mi lógica es muy mala jajajajaja

Gracias

Creo que ahora si entendí lo que quieres, usas el arduino emulando que es tu dedo haciendo click al boton ctrl del teclado para que funcione otra aplicacion que tienes en tu computadora
con temor a equivocarme creo que asi te debe funcionar

#include <Keyboard.h>

char ctrlKey = KEY_LEFT_CTRL;
bool estado_gatillo = true;     //Variables para guardar estados del gatillo
bool estado_anterior = true;   //inicializo en true porque tienes conectado en pull-up

void setup() {

  pinMode (4, INPUT_PULLUP);

  Serial.begin(9600);
  Keyboard.begin();
}

void loop()
{
  estado_gatillo = digitalRead(4);  //guardamos el estado del botón en la variable estado_gatillo

  if ( !estado_gatillo && estado_anterior)  //aqui es donde se detecta el flanco

  {
    Keyboard.press (ctrlKey);
    delay (50);
    Keyboard.releaseAll();
    //Keyboard.end();     comenté esta linea porque detiene la emulacion del teclado
  }
  estado_anterior = estado_gatillo;
}

Correcto, ahora si hizo lo que quería.

Si no es mucha molestia me podrías explicar un poco que fue lo que cambió el efecto?

Siento que el "estado anterior igual a estado gatillo" del final es lo que hizo el efecto. Y no entiendo bien lo del flanco que mencionas, esa linea de "if" para mi es un poco complicada de entender con el signo de exclamación.

Muchas Gracias!!!!

@Fermeister hablamos en inglés o español? 3 o 4 veces te preguntamos algo y no respondes y solo quieres que te resolvamos el problema y lo demás parece no importar.

Espero que no venga ahora un paracaidista y diga "yo si lo entiendo, esta muy claro para mi, porque no lo esta."

Puse que si habia funcionado el codigo que me envio. Y de hecho le escribi que si me podia explicar un poco la linea if para saber que es lo que hacia ese codigo con signo de exclamacion que puso y con dos signos de && por que no lo conozco. Me gustaria saber que es lo que hace esa variable para aprender que creo que es la finalidad de este foro.

Esta es tu obligación luego de leer las normas cosa que no se si has hecho pero supongo que si y se te han olvidado:

  1. Tips para obtener mejores respuestas

• Menciona que Arduino tienes. ¿Es un UNO? ¿Leonardo? ¿Due? ¿Mini? ¿Mega? El problema podría ser específico de cualquiera de estos modelos.
Describe tu problema en detalle.
Si es relacionado a una pieza electrónica (chip o modulo), menciona el modelo exacto y preferentemente un link al data sheet.
• Describe cómo has conectado cosas como registros. ¿Los has conectado a tierra? ¿o +5v? ¿Están con resistencias pull-up ó pull-down? Postea el circuito si tienes dudas.
• Agrega el Sketch (código) ¡completo! Si no lo haces harás perder el tiempo a las personas que te pidan hacerlo. Sin embargo, con problemas de código, si es posible postear un sketch mínimo que reproduzca el problema - sin cientos de líneas de código. Si el problema se desvanece en el sketch reducido, el error no estaba donde pensabas que estaba.
• Copia y pega el código que te ha dado problemas, no trates de reproducirlo escribiéndolo de memoria en el post.
• Si tienes un error, postea el mensaje de error, (copia y pega). No solo digas: "Tengo un error".
• Si has agregado sentencias para debugin en tu sketch (Serial), postea los mensajes del monitor serial (solo una muestra representativa).
• Si estas usando una librería que no viene con el IDE (en otras palabras, la has descargado de otro sitio) por favor pon un link al sitio donde la has descargado.
• Describe que esperas que pase y que es lo que pasa en realidad. No solo "no funciona"
• Si es posible, describe que es lo que tratas de hacer realmente, no solo lo que no puedes echar a andar, por ejemplo "Estoy tratando de encender un calentador y una bomba en un acuario al mismo tiempo"; no como "Como hago dos cosas al mismo tiempo".
• Trata de aislar el problema, ya sea en código o electrónico. No nos confundamos tratando de hacer todo en de una vez. Por ejemplo si estas teniendo problemas leyendo un sensor has una simple prueba aislando el sensor y probándolo en un código dedicado solo al sensor.

No has dicho nada a pesar de que te lo solicité expresamente varias veces.
Por favor, no vengas a decirnos cual es la finalidad del foro.
El foro ayuda cuando quiere hacerlo.
Si quien plantea la pregunta no lo hace bien, entonces queda a discreción de cada uno responder o no, como siempre.
De hecho verás que yo tengo algunas respuestas y respondo casi todas las consultas pero cuando alguien se anda con vueltas para explicarse pues simplemente no le digo ni sugiero nada, porque repito, no tengo obligación.
Si me corresponde orientarte para que obtengas tu solución y eso tmb es ayudarte.
Espero haber sido claro..