Heb geprobeerd om een bestaand programma wat aan te passen aan mijn doeleinden maar dat is me te moeilijk gebleken zien mijn geringe programmeer ervaring.
Ik probeer nu vanuit de basis eerst een beeld te maken wat ik wil.
Ik heb een arduino uno die ik voor midi doeleinden gebruik.
Wat doe ik ermee?
ik heb 5 (terugverende)schakelaars en 5 leds.
Aan de hand van een ingedrukte schakelaar moet een corresponderende led gaan branden en moet een midicode verstuurt worden.
Allereerst moet ik toch variabelen definiëren?
Dat zal dan de schakelaars en leds zijn.
Ik zit eraan te denken een sub(1) voor het scannen van de schakelaars te maken en aan de hand van die uitkomst een sub(2) aanroepen voor de led aansturing en een sub(3) om de midicode te versturen.
Pas wanneer er een verandering in de schakelaars komt wordt sub(2&3) aangeroepen.
Hopelijk klopt deze gedachtegang een beetje?
Het moeilijkste moet nog komen en dat is programmeren zelf en daar zie ik wel wat tegenop.
Nieko
LED addicted... Fijnmalen en snuiven maar!! :P
Klinkt niet heel lastig gezien midi ondersteunt wordt door Arduino.
http://arduino.cc/en/Tutorial/Midi?from=Tutorial.MIDI
Je gedachtegang klopt wel, althans als je met sub een "subroutine" of wel functie bedoelt.
Houd er rekening mee dat alle sequentieel wordt uitgevoerd, bouw je ergens een nagenoeg oneindige while loop in, dan zal het programma daar vast lopen.
Nou dat kan nog wel wat worden zonder een loop.
Heb toch maar ff een sketch van arduino.cc gehaald en geprobeerd de logica te vatten.
Valt helaas nog wel tegen gezien mijn ontoereikende ervaring.
Heb daarom nog heel veel vragen. Bij onderstaande programma zal ik case 0 1 en 3 niet nodig zijn, deze moeten ongeveer hetzelfde worden als case 4&5 maar dan met andere currentprogram nummers.
Vraag is of dat zo te veranderen valt?
Verder heb ik niet zoveel aan de flashpin want die laat een led even knipperen en ik wil deze constant laten branden. Daar moet ik ook nog eerst iets op vinden.
Maar eerst ga ik een regel uitpluizen want joost mag weten wat er bedoeld word met:
for( currentSwitch = 0; currentSwitch < 5; currentSwitch++ ) {
// midi.controller
// written by The Cat Herder
// Sends midi program change and control change messages based on foot pedal pressed
// Constants
#define SWITCH1 2
#define SWITCH2 3
#define SWITCH3 4
#define SWITCH4 5
#define SWITCH5 6
#define SWITCH6 7
#define LED1 7
#define LED2 8
#define LED3 9
#define LED4 10
#define LED5 11
#define BOUNCEDELAY 25
// Variables:
int switches[5] = { SWITCH1, SWITCH2, SWITCH3, SWITCH4, SWITCH5 };
int switchState[5] = { HIGH, HIGH, HIGH, HIGH, HIGH };
// Initial state of switch is high due to internal pullup
int leds[5] = { LED1, LED2, LED3, LED4, LED5 };
int currentSwitch = 0;
int currentProgram = 22; // current program - sent to the output
int bypassState = LOW; // state of bypass pedal
int pedalActiveFlash = 50; // Delay for flash when pedal is pressed
void setup() {
// Set MIDI baud rate:
Serial.begin(31250);
// Setup Switches and activation LEDs
for( currentSwitch = 0; currentSwitch < 5; currentSwitch++ ) {
pinMode( switches[currentSwitch], INPUT ); // Set pin for switch
digitalWrite( switches[currentSwitch], HIGH ); // Turn on internal pullup
pinMode( leds[currentSwitch], OUTPUT ); // Set pin for LED
flashPin( leds[currentSwitch], 100 ); // Flash LED
}
}
void loop() {
for( currentSwitch = 0; currentSwitch < 5; currentSwitch++ ) {
if((digitalRead(switches[currentSwitch]) != switchState[currentSwitch] )&&(switchState[currentSwitch] == HIGH)){
switch( currentSwitch ) {
case 0:
//Bypass
if( bypassState == LOW ) {
bypassState = HIGH;
midiSend( 0xB0, 0x5B, 0x00 ); // bypass off
digitalWrite( leds[currentSwitch], LOW );
}
else {
bypassState = LOW;
midiSend( 0xB0, 0x5B, 0x7F ); // bypass on
digitalWrite( leds[currentSwitch], HIGH );
}
break;
case 1:
//Prev Program
currentProgram = currentProgram--;
if( currentProgram < 1 )
currentProgram = 0; // Don't go lower than 0
midiProg( 0xC0, currentProgram );
flashPin( leds[currentSwitch], pedalActiveFlash );
break;
case 2:
// Next Program
currentProgram = currentProgram++;
if( currentProgram > 96 )
currentProgram = 97; // Don't go lower than 97
midiProg( 0xC0, currentProgram );
flashPin( leds[currentSwitch], pedalActiveFlash );
break;
case 3:
// Favourite 1
currentProgram = 22;
midiProg( 0xC0, currentProgram );
flashPin( leds[currentSwitch], pedalActiveFlash );
break;
case 4:
// Favourite 2
currentProgram = 27;
midiProg( 0xC0, currentProgram );
flashPin( leds[currentSwitch], pedalActiveFlash );
break;
}
delay( BOUNCEDELAY );
}
switchState[currentSwitch] = digitalRead( switches[currentSwitch] );
}
}
// Send a three byte midi message
void midiSend(char status, char data1, char data2) {
Serial.print(status, BYTE);
Serial.print(data1, BYTE);
Serial.print(data2, BYTE);
}
// Send a two byte midi message
void midiProg(char status, int data ) {
Serial.print(status, BYTE);
Serial.print(data, BYTE);
}
void flashPin( int ledPin, int flashDelay ) {
digitalWrite( ledPin, HIGH );
delay( flashDelay );
digitalWrite( ledPin, LOW );
}
[Bericht gewijzigd door Henry S. op (0%)]
for( currentSwitch = 0; currentSwitch < 5; currentSwitch++ ) { .... }Dit is een for-loop, van 0 tot 5 (tot en met 4 dus).