Go Down

Topic: Arduino Uno: Codigo Interruptor de 3 posiciones (Read 141 times) previous topic - next topic

barbol_music

Hola Foro,
estoy empezando en esto de la programación, y por la fuerza he tenido que empezar un código para un interruptor de 3 posiciones on-off-on con 3 pines. 1,2,3 o L, C y R (Left, Center y Right)
Se conecta uno a tierra y los otros dos a dos pines digitales.

La idea es enviar mensajes MIDI CC# en cada posición del interruptor.

Aun me falta definir cuando la posición 1 esta en off y la posición 3 esta en off, o sea que el interruptor esta en su posición 2, o central, hacer el código de esto.

Logre asignar MIDI CC# a cada posición extrema.

La pregunta es como detener el envío del mensaje, cuando se posiciona el interruptor en 1 o 3 (L o R)
En Hairless Midi continúa eternamente emitiendo el mensaje, según el delay que le coloque.

Este es el codigo:

Code: [Select]


 #include <MIDI.h>   
int sw_L = 6;
int sw_C ; // falta definir cuando sw_L =off y sw_R =off, así Center =on
int sw_R = 5;

void setup()
{
  Serial.begin(115200);     //hairless + loop midi (via usb - pc) descargar hairless y loop midi - conecta con PEDALERA gt-1000 a traves de loopmidi


 
//-----------------/ SETUP - INTERRUPTOR 3 POS /--------------------------

pinMode (sw_L, INPUT_PULLUP);
pinMode (sw_R, INPUT_PULLUP);
}

//-----------------/ LOOP - INTERRUPTOR 3 POS /--------------------------
if (digitalRead(sw_L)==LOW){
MIDI.sendControlChange(8, 0, 1);
      delay(200);// no se detiene el envio del mensaje
 
}
if (digitalRead(sw_R)==LOW){
MIDI.sendControlChange(8, 127, 1);
      delay(200);// no se detiene el envio del mensaje
 
}
//-----------------/ end LOOP - INTERRUPTOR 3 POS /--------------------------

}

surbyte

#1
Sep 23, 2020, 04:46 pm Last Edit: Sep 23, 2020, 08:11 pm by surbyte
Quote
La pregunta es como detener el envío del mensaje, cuando se posiciona el interruptor en 1 o 3 (L o R)
La respuesta es usando flancos, no comprando estados sino su cambio de estado.
Para ello requieres de guardar la posición previa.
Sabes la posición previa y la actual.
Si cambia de 0 a 1 tomas acción o si cambia de 1 a 0 lo mismo, dependerá de tu cableado.

veo en tu código que ves el cambio en LOW entonces haces esto.

NOTA: ese no puede ser un código válido, ni siquiera tienes loop.

define cuatro variables globales como

Code: [Select]
bool estadoL, estadoLAnt = true;
bool estadoR, estadoRAnt = true;



Code: [Select]
#include <MIDI.h>  
int sw_L = 6;
int sw_C ; // falta definir cuando sw_L =off y sw_R =off, así Center =on
int sw_R = 5;

bool estadoL, estadoLAnt = true;
bool estadoR, estadoRAnt = true;

void setup() {
 Serial.begin(115200);     //hairless + loop midi (via usb - pc) descargar hairless y loop midi - conecta con PEDALERA gt-1000 a traves de loopmidi
 //-----------------/ SETUP - INTERRUPTOR 3 POS /--------------------------
 pinMode (sw_L, INPUT_PULLUP);
 pinMode (sw_R, INPUT_PULLUP);
}

void loop() {
 
 estadoL = digitalRead(sw_L);
 estadoR = digitalRead(sw_R);
 
 //-----------------/ LOOP - INTERRUPTOR 3 POS /--------------------------
 if (!estadoL && estadoLAnt){ // cambio de 1 a 0.
 MIDI.sendControlChange(8, 0, 1);
 delay(200);// no se detiene el envio del mensaje
 } // se ejecuta solo una vez.
 estadoLAnt = estadoL;
    
 if (!estadoR && estadoRAnt){
 MIDI.sendControlChange(8, 127, 1);
 delay(200);// no se detiene el envio del mensaje
 
 }
} //-----------------/ end LOOP - INTERRUPTOR 3 POS /--------------------------

Go Up