16 changed files with 528 additions and 162 deletions
			
			
		- 
					BINfritzing_files/input_Platte.fzz
- 
					28source/INPUT_MCP23017_test/INPUT_MCP23017_test.ino
- 
					99source/MCP23017_test/MCP23017_test.ino
- 
					1source/_4051_test/_4051_test.ino
- 
					22source/input_4051_library_test/input_4051_library_test.ino
- 
					67source/libraries/INPUT_74HC4051/INPUT_74HC4051.cpp
- 
					29source/libraries/INPUT_74HC4051/INPUT_74HC4051.h
- 
					115source/libraries/INPUT_MCP23017/INPUT_MCP23017.cpp
- 
					51source/libraries/INPUT_MCP23017/INPUT_MCP23017.h
- 
					42source/library/input_4051/input_4051.cpp
- 
					28source/library/input_4051/input_4061.h
- 
					0source/midi_in_out/midi_in_out.ino
- 
					62source/midi_in_out_softwareserial/midi_in_out_softwareserial.ino
- 
					45source/midi_led/midi_led.ino
- 
					9source/piezo_input/piezo_input.ino
- 
					92source/sketches/testing/midi_in_out_softwareserial.ino
| @ -0,0 +1,28 @@ | |||||
|  | #include <Wire.h>
 | ||||
|  | 
 | ||||
|  | #include <INPUT_MCP23017.h>
 | ||||
|  | #include <INPUT_74HC4051.h>
 | ||||
|  | 
 | ||||
|  | INPUT_MCP23017 input_MCP23017; | ||||
|  | INPUT_74HC4051 input_4051; | ||||
|  | 
 | ||||
|  | void setup() { | ||||
|  |   Serial.begin(9600); | ||||
|  |   input_MCP23017.begin(0,printValue); | ||||
|  |   input_4051.begin(A0,11,12,13,printValue); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void loop() { | ||||
|  |   input_MCP23017.loop();   | ||||
|  |   input_4051.loop(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void printValue(int id, int pin, int value) { | ||||
|  |    Serial.print("id: "); | ||||
|  |    Serial.print(id); | ||||
|  |    Serial.print(" pin: "); | ||||
|  |    Serial.print(pin); | ||||
|  |    Serial.print(" value: "); | ||||
|  |    Serial.print(value); | ||||
|  |    Serial.println(); | ||||
|  | } | ||||
| @ -0,0 +1,99 @@ | |||||
|  | #include <Wire.h>
 | ||||
|  | 
 | ||||
|  | #define MCP23017_ADDRESS 0x20
 | ||||
|  | 
 | ||||
|  | // registers (from https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/Adafruit_MCP23017.h)
 | ||||
|  | #define MCP23017_IODIRA 0x00
 | ||||
|  | #define MCP23017_IPOLA 0x02
 | ||||
|  | #define MCP23017_GPINTENA 0x04
 | ||||
|  | #define MCP23017_DEFVALA 0x06
 | ||||
|  | #define MCP23017_INTCONA 0x08
 | ||||
|  | #define MCP23017_IOCONA 0x0A
 | ||||
|  | #define MCP23017_GPPUA 0x0C
 | ||||
|  | #define MCP23017_INTFA 0x0E
 | ||||
|  | #define MCP23017_INTCAPA 0x10
 | ||||
|  | #define MCP23017_GPIOA 0x12
 | ||||
|  | #define MCP23017_OLATA 0x14
 | ||||
|  | 
 | ||||
|  | #define MCP23017_IODIRB 0x01
 | ||||
|  | #define MCP23017_IPOLB 0x03
 | ||||
|  | #define MCP23017_GPINTENB 0x05
 | ||||
|  | #define MCP23017_DEFVALB 0x07
 | ||||
|  | #define MCP23017_INTCONB 0x09
 | ||||
|  | #define MCP23017_IOCONB 0x0B
 | ||||
|  | #define MCP23017_GPPUB 0x0D
 | ||||
|  | #define MCP23017_INTFB 0x0F
 | ||||
|  | #define MCP23017_INTCAPB 0x11
 | ||||
|  | #define MCP23017_GPIOB 0x13
 | ||||
|  | #define MCP23017_OLATB 0x15
 | ||||
|  | 
 | ||||
|  | int _addr = 0; | ||||
|  | int _value[16]; | ||||
|  | 
 | ||||
|  | void setup() { | ||||
|  |   Serial.begin(9600); | ||||
|  | 	Wire.begin(); | ||||
|  | 	 | ||||
|  | 	// set defaults!
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write((byte)MCP23017_IODIRA); | ||||
|  | 	Wire.write(0xFF);  // all inputs on port A
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_IODIRB); | ||||
|  | 	Wire.write(0xFF);  // all inputs on port B
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 	 | ||||
|  | 	 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPPUA);  | ||||
|  | 	Wire.write(0xFF);	// all pullup resistors on port A
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 	 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPPUB);  | ||||
|  | 	Wire.write(0xFF);	// all pullup resistors on port B
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void loop() { | ||||
|  |    	uint8_t pin,bank; | ||||
|  | 	int value; | ||||
|  | 	//read bank A
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPIOA); | ||||
|  | 	Wire.endTransmission(); | ||||
|  |     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | ||||
|  | 	bank = Wire.read(); | ||||
|  | 	for (pin=0; pin<8; pin++) { | ||||
|  | 		value = (bank >> pin) & 0x1; | ||||
|  | 		if (_value[pin] != value) { | ||||
|  | 			_value[pin] = value; | ||||
|  | 		printValue(_addr,pin,value); | ||||
|  | 		} | ||||
|  | 	}  	 | ||||
|  | 	//read bank B
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPIOB); | ||||
|  | 	Wire.endTransmission(); | ||||
|  |     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | ||||
|  | 	bank = Wire.read(); | ||||
|  | 	for (pin=8; pin<16; pin++) { | ||||
|  | 		value = (bank >> (pin-8)) & 0x1; | ||||
|  | 		if (_value[pin] != value) { | ||||
|  | 			_value[pin] = value; | ||||
|  | 		printValue(_addr,pin,value); | ||||
|  | 		}		 | ||||
|  | 	} | ||||
|  | } | ||||
|  | 
 | ||||
|  | void printValue(int id, int pin, int value) { | ||||
|  |    Serial.print("id: "); | ||||
|  |    Serial.print(id); | ||||
|  |    Serial.print(" pin: "); | ||||
|  |    Serial.print(pin); | ||||
|  |    Serial.print(" value: "); | ||||
|  |    Serial.print(value); | ||||
|  |    Serial.println(); | ||||
|  | } | ||||
| @ -0,0 +1,22 @@ | |||||
|  | #include <INPUT_4051.h>
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | INPUT_4051 input_4051(A1,10,9,8,printValue); | ||||
|  | 
 | ||||
|  | void setup() { | ||||
|  |   Serial.begin(9600); | ||||
|  |   input_4051.setPinCount(2); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void loop() { | ||||
|  |   input_4051.loop(); | ||||
|  | }  | ||||
|  | 
 | ||||
|  | void printValue(int pin, int value) { | ||||
|  |     Serial.print("pin"); | ||||
|  |     Serial.print(pin); | ||||
|  |     Serial.print(" : "); | ||||
|  |     Serial.print(value/8); | ||||
|  |     Serial.println(); | ||||
|  | } | ||||
| @ -0,0 +1,67 @@ | |||||
|  | #include "Arduino.h"
 | ||||
|  | #include "INPUT_74HC4051.h"
 | ||||
|  | 
 | ||||
|  | void INPUT_74HC4051::begin(uint8_t analog, uint8_t s0, uint8_t s1, uint8_t s2,CallbackFunction cbF) { | ||||
|  | 	_analog = analog; | ||||
|  | 	 | ||||
|  | 	_s0 = s0; | ||||
|  | 	_s1 = s1; | ||||
|  | 	_s2 = s2; | ||||
|  | 	 | ||||
|  | 	pinMode(_analog,INPUT); | ||||
|  | 	 | ||||
|  | 	pinMode(_s0,OUTPUT); | ||||
|  | 	pinMode(_s1,OUTPUT); | ||||
|  | 	pinMode(_s2,OUTPUT); | ||||
|  | 	 | ||||
|  | 	_callbackFunction = cbF; | ||||
|  | 	 | ||||
|  | 	//init start values
 | ||||
|  | 	uint8_t pin,r0,r1,r2; | ||||
|  | 	for (pin=0; pin<8; pin++) { | ||||
|  | 		r0 = bitRead(pin,0);      | ||||
|  | 		r1 = bitRead(pin,1); | ||||
|  | 		r2 = bitRead(pin,2);    | ||||
|  | 		digitalWrite(_s0, r0); | ||||
|  | 		digitalWrite(_s1, r1); | ||||
|  | 		digitalWrite(_s2, r2); | ||||
|  | 		//delayMicroseconds(10);
 | ||||
|  | 		_value[pin] = analogRead(_analog); | ||||
|  | 	}  	 | ||||
|  | } | ||||
|  | 
 | ||||
|  | void INPUT_74HC4051::loop() { | ||||
|  | 	uint8_t pin,r0,r1,r2; | ||||
|  | 	int value; | ||||
|  | 	for (pin=0; pin<8; pin++) { | ||||
|  | 		r0 = bitRead(pin,0);      | ||||
|  | 		r1 = bitRead(pin,1); | ||||
|  | 		r2 = bitRead(pin,2);    | ||||
|  | 		digitalWrite(_s0, r0); | ||||
|  | 		digitalWrite(_s1, r1); | ||||
|  | 		digitalWrite(_s2, r2); | ||||
|  | 		//delayMicroseconds(10);
 | ||||
|  | 		value = analogRead(_analog); | ||||
|  | 		if (_value[pin] < value - INPUT_74HC4051_TOLERANCE || _value[pin] > value + INPUT_74HC4051_TOLERANCE) { | ||||
|  | 			_value[pin] = value; | ||||
|  | 			(*_callbackFunction)(_analog,pin,value); | ||||
|  | 		} | ||||
|  | 	}  	 | ||||
|  | } | ||||
|  | 
 | ||||
|  | int INPUT_74HC4051::getSpecificValue(uint8_t pin) { | ||||
|  | 	if (pin >= 8) | ||||
|  | 		return -1; | ||||
|  | 	uint8_t r0,r1,r2; | ||||
|  | 	r0 = bitRead(pin,0);      | ||||
|  | 	r1 = bitRead(pin,1); | ||||
|  | 	r2 = bitRead(pin,2);    | ||||
|  | 	digitalWrite(_s0, r0); | ||||
|  | 	digitalWrite(_s1, r1); | ||||
|  | 	digitalWrite(_s2, r2); | ||||
|  | 	//delayMicroseconds(10);
 | ||||
|  | 	int value = analogRead(_analog); | ||||
|  | 	_value[pin] = value; | ||||
|  | 	return value; | ||||
|  | } | ||||
|  | 
 | ||||
| @ -0,0 +1,29 @@ | |||||
|  | /* | ||||
|  |   INPUT_4051.h - Library for reading inputs from 4051 multiplexer | ||||
|  | */ | ||||
|  | #ifndef INPUT_74HC4051_h | ||||
|  | #define INPUT_74HC4051_h | ||||
|  | 
 | ||||
|  | #define INPUT_74HC4051_TOLERANCE 1 | ||||
|  | 
 | ||||
|  | #if !defined(CallbackFunction) | ||||
|  | typedef void (*CallbackFunction)(int,int,int); | ||||
|  | #endif | ||||
|  | 
 | ||||
|  | class INPUT_74HC4051 | ||||
|  | { | ||||
|  | 	public: | ||||
|  | 		void begin(uint8_t analog, uint8_t s0, uint8_t s1, uint8_t s2,CallbackFunction cbF); | ||||
|  | 		void loop(void); | ||||
|  | 		int getSpecificValue(uint8_t pin); | ||||
|  | 	private: | ||||
|  | 		uint8_t _analog; | ||||
|  | 		uint8_t _s0; | ||||
|  | 		uint8_t _s1; | ||||
|  | 		uint8_t _s2; | ||||
|  | 		int _value[8]; | ||||
|  | 		CallbackFunction _callbackFunction; | ||||
|  | }; | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | #endif | ||||
| @ -0,0 +1,115 @@ | |||||
|  | #include <Wire.h>
 | ||||
|  | 
 | ||||
|  | #include "Arduino.h"
 | ||||
|  | #include "INPUT_MCP23017.h"
 | ||||
|  | 
 | ||||
|  | void INPUT_MCP23017::begin(uint8_t addr,CallbackFunction cbF) { | ||||
|  | 	Wire.begin(); | ||||
|  | 	 | ||||
|  | 	if (addr > 7) | ||||
|  | 		_addr = 7; | ||||
|  | 	else _addr =  addr; | ||||
|  | 	 | ||||
|  | 	_callbackFunction = cbF; | ||||
|  | 		 | ||||
|  | 	// set defaults!
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write((byte)MCP23017_IODIRA); | ||||
|  | 	Wire.write(0xFF);  // all inputs on port A
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_IODIRB); | ||||
|  | 	Wire.write(0xFF);  // all inputs on port B
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 	 | ||||
|  | 	 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPPUA);  | ||||
|  | 	Wire.write(0xFF);	// all pullup resistors on port A
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 	 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPPUB);  | ||||
|  | 	Wire.write(0xFF);	// all pullup resistors on port B
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write((byte)MCP23017_IPOLA); | ||||
|  | 	Wire.write(0xFF);  // inverse all inputs
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_IPOLB); | ||||
|  | 	Wire.write(0xFF);    // inverse all inputs
 | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 
 | ||||
|  | 	//init start values
 | ||||
|  | 	uint8_t pin,bank; | ||||
|  | 	//read bank A
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPIOA); | ||||
|  | 	Wire.endTransmission(); | ||||
|  |     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | ||||
|  | 	bank = Wire.read(); | ||||
|  | 	for (pin=0; pin<8; pin++)  | ||||
|  | 		_value[pin] = (bank >> pin) & 0x1; | ||||
|  | 	//read bank B
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPIOB); | ||||
|  | 	Wire.endTransmission(); | ||||
|  |     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | ||||
|  | 	bank = Wire.read(); | ||||
|  | 	for (pin=8; pin<16; pin++)  | ||||
|  | 		_value[pin] = (bank >> (pin-8)) & 0x1;	 	 | ||||
|  | } | ||||
|  | 
 | ||||
|  | void INPUT_MCP23017::loop() { | ||||
|  | 	uint8_t pin,bank; | ||||
|  | 	int value; | ||||
|  | 	//read bank A
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPIOA); | ||||
|  | 	Wire.endTransmission(); | ||||
|  |     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | ||||
|  | 	bank = Wire.read(); | ||||
|  | 	for (pin=0; pin<8; pin++) { | ||||
|  | 		value = (bank >> pin) & 0x1; | ||||
|  | 		if (_value[pin] != value) { | ||||
|  | 			_value[pin] = value; | ||||
|  | 		(*_callbackFunction)(_addr,pin,value); | ||||
|  | 		} | ||||
|  | 	}  	 | ||||
|  | 	//read bank B
 | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr); | ||||
|  | 	Wire.write(MCP23017_GPIOB); | ||||
|  | 	Wire.endTransmission(); | ||||
|  |     Wire.requestFrom(MCP23017_ADDRESS | _addr, 1); | ||||
|  | 	bank = Wire.read(); | ||||
|  | 	for (pin=8; pin<16; pin++) { | ||||
|  | 		value = (bank >> (pin-8)) & 0x1; | ||||
|  | 		if (_value[pin] != value) { | ||||
|  | 			_value[pin] = value; | ||||
|  | 		(*_callbackFunction)(_addr,pin,value); | ||||
|  | 		}		 | ||||
|  | 	}  | ||||
|  | } | ||||
|  | 
 | ||||
|  | int INPUT_MCP23017::getSpecificValue(uint8_t pin) { | ||||
|  | 	if (pin > 16) | ||||
|  | 		return LOW; | ||||
|  | 	Wire.beginTransmission(MCP23017_ADDRESS | _addr);	 | ||||
|  | 	uint8_t p = pin; | ||||
|  | 	if (pin > 8) { | ||||
|  | 		Wire.write(MCP23017_GPIOB); | ||||
|  | 		p -= 8; | ||||
|  | 	} else  | ||||
|  | 		Wire.write(MCP23017_GPIOA); | ||||
|  | 	Wire.endTransmission(); | ||||
|  | 	uint8_t	bank = Wire.read(); | ||||
|  | 	int value = (bank >> p) & 0x1; | ||||
|  | 	_value[pin] = value; | ||||
|  | 	return value; | ||||
|  | } | ||||
|  | 
 | ||||
|  | 
 | ||||
| @ -0,0 +1,51 @@ | |||||
|  | /* | ||||
|  |   INPUT_MCP23017.h - Library for reading inputs from MCP23017 port Expander | ||||
|  | */ | ||||
|  | #ifndef INPUT_MCP23017_h | ||||
|  | #define INPUT_MCP23017_h | ||||
|  | 
 | ||||
|  | #if !defined(CallbackFunction) | ||||
|  | typedef void (*CallbackFunction)(int,int,int); | ||||
|  | #endif | ||||
|  | 
 | ||||
|  | class INPUT_MCP23017 | ||||
|  | { | ||||
|  | 	public: | ||||
|  | 		void begin(uint8_t addr,CallbackFunction cbF); | ||||
|  | 		void loop(void); | ||||
|  | 		int getSpecificValue(uint8_t pin); | ||||
|  | 	private: | ||||
|  | 		uint8_t _addr; | ||||
|  | 		int _value[16]; | ||||
|  | 		CallbackFunction _callbackFunction; | ||||
|  | }; | ||||
|  | 
 | ||||
|  | #define MCP23017_ADDRESS 0x20 | ||||
|  | 
 | ||||
|  | // registers (from https://github.com/adafruit/Adafruit-MCP23017-Arduino-Library/blob/master/Adafruit_MCP23017.h) | ||||
|  | #define MCP23017_IODIRA 0x00 | ||||
|  | #define MCP23017_IPOLA 0x02 | ||||
|  | #define MCP23017_GPINTENA 0x04 | ||||
|  | #define MCP23017_DEFVALA 0x06 | ||||
|  | #define MCP23017_INTCONA 0x08 | ||||
|  | #define MCP23017_IOCONA 0x0A | ||||
|  | #define MCP23017_GPPUA 0x0C | ||||
|  | #define MCP23017_INTFA 0x0E | ||||
|  | #define MCP23017_INTCAPA 0x10 | ||||
|  | #define MCP23017_GPIOA 0x12 | ||||
|  | #define MCP23017_OLATA 0x14 | ||||
|  | 
 | ||||
|  | #define MCP23017_IODIRB 0x01 | ||||
|  | #define MCP23017_IPOLB 0x03 | ||||
|  | #define MCP23017_GPINTENB 0x05 | ||||
|  | #define MCP23017_DEFVALB 0x07 | ||||
|  | #define MCP23017_INTCONB 0x09 | ||||
|  | #define MCP23017_IOCONB 0x0B | ||||
|  | #define MCP23017_GPPUB 0x0D | ||||
|  | #define MCP23017_INTFB 0x0F | ||||
|  | #define MCP23017_INTCAPB 0x11 | ||||
|  | #define MCP23017_GPIOB 0x13 | ||||
|  | #define MCP23017_OLATB 0x15 | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | #endif | ||||
| @ -1,42 +0,0 @@ | |||||
| /*
 |  | ||||
|   Morse.cpp - Library for flashing Morse code. |  | ||||
|   Created by David A. Mellis, November 2, 2007. |  | ||||
|   Released into the public domain. |  | ||||
| */ |  | ||||
| 
 |  | ||||
| #include "Arduino.h"
 |  | ||||
| #include "input_4051.h"
 |  | ||||
| 
 |  | ||||
| const int tolerance = 4; |  | ||||
| 
 |  | ||||
| input_4051::input_4051(int analogPin, int s0Pin, int s1Pin, int s2Pin, void (*valueChangeCallback(int,int))) |  | ||||
| { |  | ||||
| 	_analog = analogPin; |  | ||||
| 	_s0 = s0Pin; |  | ||||
| 	_s1 = s1Pin; |  | ||||
| 	_s2 = s2Pin; |  | ||||
| 	pinMode(_analog,INPUT); |  | ||||
| 	pinMode(_s0,OUTPUT); |  | ||||
| 	pinMode(_s1,OUTPUT); |  | ||||
| 	pinMode(_s2,OUTPUT); |  | ||||
| 	_valueChangeCallback = valueChangeCallback; |  | ||||
| 	_value = {-1,-1,-1,-1,-1,-1,-1,-1}; |  | ||||
| } |  | ||||
| 
 |  | ||||
| void input_4051::loop() |  | ||||
| { |  | ||||
| 	for (count=0; count<=7; count++) { |  | ||||
| 		r0 = bitRead(count,0);      |  | ||||
| 		r1 = bitRead(count,1); |  | ||||
| 		r2 = bitRead(count,2);    |  | ||||
| 		digitalWrite(_s0, r0); |  | ||||
| 		digitalWrite(_s1, r1); |  | ||||
| 		digitalWrite(_s2, r2); |  | ||||
| 		int read = analogRead(_analog); |  | ||||
| 		if (value[count] < read - tolerance || value[count] > read + tolerance) { |  | ||||
| 			value[count] = read; |  | ||||
| 			_valueChangeCallback(count, read); |  | ||||
| 		} |  | ||||
| 	}  	 |  | ||||
| } |  | ||||
| 
 |  | ||||
| @ -1,28 +0,0 @@ | |||||
| /* |  | ||||
|   input_4051.h - Library for reading inputs from 4051 multiplexer |  | ||||
|   Created by David A. Mellis, November 2, 2007. |  | ||||
|   Released into the public domain. |  | ||||
| */ |  | ||||
| #ifndef input_4051_h |  | ||||
| #define input_4051_h |  | ||||
| 
 |  | ||||
| #include "Arduino.h" |  | ||||
| 
 |  | ||||
| 
 |  | ||||
| class input_4051 |  | ||||
| { |  | ||||
| 	public: |  | ||||
| 		Morse(int analogPin, int s0Pin, int s1Pin, int s2Pin, void (*valueChangeCallback(int,int))); |  | ||||
| 		void loop(void); |  | ||||
| 		int getSpecificValue(int pin); |  | ||||
| 	private: |  | ||||
| 		int _analog; |  | ||||
| 		int _s0; |  | ||||
| 		int _s1; |  | ||||
| 		int _s2; |  | ||||
| 		void (*_valueChangeCallback(int,int); |  | ||||
| 		int _value[8]; |  | ||||
| }; |  | ||||
| 
 |  | ||||
| 
 |  | ||||
| #endif |  | ||||
| @ -0,0 +1,62 @@ | |||||
|  | #include <Wire.h>
 | ||||
|  | #include <SoftwareSerial.h>
 | ||||
|  | 
 | ||||
|  | #define IOPOLA   0x02
 | ||||
|  | #define GPPUA   0x12
 | ||||
|  | #define BIT_IS_SET(i, bits)  (1 << i & bits)
 | ||||
|  | 
 | ||||
|  | SoftwareSerial MIDI(10,11); | ||||
|  | 
 | ||||
|  | boolean button[8]; | ||||
|  | 
 | ||||
|  | void setup()   | ||||
|  | { | ||||
|  |   //printing baudrate
 | ||||
|  |   Serial.begin(9600); | ||||
|  |   MIDI.begin(31250); | ||||
|  |   Wire.begin(); | ||||
|  |    Wire.beginTransmission(0x20); | ||||
|  |   Wire.write(0x12); // set MCP23017 memory pointer to GPIOB address
 | ||||
|  |   Wire.write(0xFF); //PULLUP
 | ||||
|  |   Wire.endTransmission(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void loop() | ||||
|  | { | ||||
|  |   Wire.beginTransmission(0x20); | ||||
|  |   Wire.write(0x12); // set MCP23017 memory pointer to GPIOB address
 | ||||
|  |   Wire.endTransmission(); | ||||
|  |   Wire.requestFrom(0x20, 1); // request one byte of data from MCP20317
 | ||||
|  |   int inputs = Wire.read(); | ||||
|  |   delayMicroseconds(10); | ||||
|  |   //check if button is pressed
 | ||||
|  |    | ||||
|  |   int i; | ||||
|  |   for(i=0;i<8;i++) { | ||||
|  |     if (BIT_IS_SET(i,inputs)) { | ||||
|  |       if(!button[i]) { | ||||
|  |         button[i] = true; | ||||
|  |         midiSignal(144,60+i,115); | ||||
|  |       } | ||||
|  |     } else { | ||||
|  |       if(button[i]) { | ||||
|  |         button[i] = false; | ||||
|  |         midiSignal(128,60+i,0); | ||||
|  |       } | ||||
|  |     } | ||||
|  |   }   | ||||
|  | } | ||||
|  | 
 | ||||
|  | //send MIDI signal through softwareserial
 | ||||
|  | void midiSignal(byte b1, byte b2, byte b3) { | ||||
|  |   Serial.print(b1); | ||||
|  |   Serial.print(" "); | ||||
|  |   Serial.print(b2); | ||||
|  |   Serial.print(" "); | ||||
|  |   Serial.print(b3); | ||||
|  |   Serial.print(" "); | ||||
|  |   Serial.println(); | ||||
|  |   MIDI.write(b1); | ||||
|  |   MIDI.write(b2); | ||||
|  |   MIDI.write(b2); | ||||
|  | } | ||||
| @ -0,0 +1,45 @@ | |||||
|  | /*
 | ||||
|  |  MIDI note player | ||||
|  |   | ||||
|  |  This sketch shows how to use the serial transmit pin (pin 1) to send MIDI note data. | ||||
|  |  If this circuit is connected to a MIDI synth, it will play  | ||||
|  |  the notes F#-0 (0x1E) to F#-5 (0x5A) in sequence. | ||||
|  | 
 | ||||
|  |   | ||||
|  |  The circuit: | ||||
|  |  * digital in 1 connected to MIDI jack pin 5 | ||||
|  |  * MIDI jack pin 2 connected to ground | ||||
|  |  * MIDI jack pin 4 connected to +5V through 220-ohm resistor | ||||
|  |  Attach a MIDI cable to the jack, then to a MIDI synth, and play music. | ||||
|  | 
 | ||||
|  |  created 13 Jun 2006 | ||||
|  |  modified 13 Aug 2012 | ||||
|  |  by Tom Igoe  | ||||
|  | 
 | ||||
|  |  This example code is in the public domain. | ||||
|  |   | ||||
|  |  http://www.arduino.cc/en/Tutorial/Midi
 | ||||
|  |   | ||||
|  |  */ | ||||
|  | 
 | ||||
|  | void setup() { | ||||
|  |   //  Set MIDI baud rate:
 | ||||
|  |   Serial.begin(9600); | ||||
|  |   pinMode(2, INPUT); | ||||
|  |   digitalWrite(2, HIGH); | ||||
|  |   pinMode(3, OUTPUT);  | ||||
|  | } | ||||
|  | 
 | ||||
|  | void loop() { | ||||
|  |   button(); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void button() { | ||||
|  |   int sensorVal = digitalRead(2); | ||||
|  |   if (sensorVal == HIGH) { | ||||
|  |     digitalWrite(3, LOW); | ||||
|  |   }  | ||||
|  |   else { | ||||
|  |     digitalWrite(3, HIGH); | ||||
|  |   } | ||||
|  | } | ||||
| @ -0,0 +1,9 @@ | |||||
|  | void setup() { | ||||
|  |    Serial.begin(9600); | ||||
|  | } | ||||
|  | 
 | ||||
|  | void loop() { | ||||
|  |   int val = analogRead(5);      | ||||
|  |   Serial.println(val); | ||||
|  |   delay(100);  // we have to make a delay to avoid overloading the serial port
 | ||||
|  | } | ||||
| @ -1,92 +0,0 @@ | |||||
| #include <SoftwareSerial.h>
 |  | ||||
| 
 |  | ||||
| // RX, TX for MIDI out
 |  | ||||
| SoftwareSerial MIDI(10, 11);  |  | ||||
| 
 |  | ||||
| //button pin
 |  | ||||
| const int switchPin = 6; |  | ||||
| //rotary encoder pins
 |  | ||||
| const int encAPin = 4; |  | ||||
| const int encBPin = 5; |  | ||||
| 
 |  | ||||
| //for sending note-off once after button is released
 |  | ||||
| boolean btnOff = false; |  | ||||
| 
 |  | ||||
| //old rotary encoder value
 |  | ||||
| int encA = LOW; |  | ||||
| //read rotary encoder value
 |  | ||||
| int enc = HIGH; |  | ||||
| 
 |  | ||||
| void setup()   |  | ||||
| { |  | ||||
|   //printing baudrate
 |  | ||||
|   Serial.begin(9600); |  | ||||
|   //MIDI baudrate for software serial (pin 10 & 11)
 |  | ||||
|   MIDI.begin(31250); |  | ||||
|   //button and encoder pins as input
 |  | ||||
|   pinMode(switchPin, INPUT); |  | ||||
|   pinMode(encAPin, INPUT); |  | ||||
|   pinMode(encBPin, INPUT); |  | ||||
|   //activate pullup-resistors (read value is inverted, so LOW is active)
 |  | ||||
|   digitalWrite(switchPin, HIGH); |  | ||||
|   digitalWrite(encAPin, HIGH); |  | ||||
|   digitalWrite(encBPin, HIGH); |  | ||||
| } |  | ||||
| 
 |  | ||||
| void loop() |  | ||||
| { |  | ||||
|   //print incoming bytes on softwareserial, just for checking MIDI-in, worked
 |  | ||||
|   if (MIDI.available()) |  | ||||
|     Serial.println(MIDI.read()); |  | ||||
|    |  | ||||
|   //check if button is pressed
 |  | ||||
|   if (digitalRead(switchPin) == LOW) |  | ||||
|   {   |  | ||||
|     if (!btnOff) { |  | ||||
|       //send note on
 |  | ||||
|       midiSignal(144,60,100); |  | ||||
|       btnOff = true; |  | ||||
|     } |  | ||||
|   }   |  | ||||
|   if (digitalRead(switchPin) == HIGH) |  | ||||
|     { |  | ||||
|     //send note off
 |  | ||||
|     if (btnOff) { |  | ||||
|         midiSignal(128,60,0); |  | ||||
|         btnOff = false; |  | ||||
|     } |  | ||||
|   } |  | ||||
|    |  | ||||
|   //read encoder pin A
 |  | ||||
|   enc = digitalRead(encAPin); |  | ||||
|   //check if rotary encoder is turned
 |  | ||||
|   if ((encA == HIGH) && (enc == LOW)) { |  | ||||
|       //check direction of turning
 |  | ||||
|       if (digitalRead(encBPin) == HIGH) { |  | ||||
|          //send note on and note off directly, so signal is send on every turn 
 |  | ||||
|          midiSignal(144,62,100); |  | ||||
|          midiSignal(128,62,100); |  | ||||
|        } else { |  | ||||
|          //other direction, other note value
 |  | ||||
|          midiSignal(144,61,100); |  | ||||
|          midiSignal(128,61,100); |  | ||||
|        } |  | ||||
|    }  |  | ||||
|    //save "old" encoder value
 |  | ||||
|    encA = enc; |  | ||||
| } |  | ||||
| 
 |  | ||||
| //send MIDI signal through softwareserial
 |  | ||||
| void midiSignal(byte b1, byte b2, byte b3) { |  | ||||
|   //debug printing
 |  | ||||
|   Serial.print("send: "); |  | ||||
|   Serial.print(b1); |  | ||||
|   Serial.print(" | "); |  | ||||
|   Serial.print(b2); |  | ||||
|   Serial.print(" | "); |  | ||||
|   Serial.print(b3); |  | ||||
|   Serial.println(""); |  | ||||
|   MIDI.write(b1); |  | ||||
|   MIDI.write(b2); |  | ||||
|   MIDI.write(b2); |  | ||||
| } |  | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue