#include "Adafruit_NeoPixel.h" #include #define DEBUG 0 // Pin definitions for the 74HC164 SIPO shift register (drives button rows high) #define DATAPIN 5 #define CLOCKPIN 7 // digital LEDS #define PIN 12 #define NUM_LEDS 8 #define AWAKE 11 #define POWER_ON 10 // variables for the sensors //#define THRESHOLD 15 #define THRESHOLD 15 #define SCANTIME 1500 //#define MASKTIME 60 #define MASKTIME 50 #define RETRIGTIME 100 //#define VERYVERYFASTADC 1 // defines for setting and clearing register bits //#ifndef cbi //#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) //#endif //#ifndef sbi //#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) //#endif // Define various ADC prescaler const unsigned char PS_16 = (1 << ADPS2); const unsigned char PS_32 = (1 << ADPS2) | (1 << ADPS0); const unsigned char PS_64 = (1 << ADPS2) | (1 << ADPS1); const unsigned char PS_128 = (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); float sensorValue[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; // variable to store the value coming from the sensor float sensorValueAnt[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; // variable to store the value coming from the sensor anterior int sensorPin[8] = { A1, A7, A2, A6, A3, A5, A4, A8}; int dischargePin[8] = { 0, 6, 1, 5, 2, 4, 3, 7}; int mapled[8] = { 0, 6, 1, 5, 2, 4, 3, 7}; unsigned long time[8] = { 0, 0, 0, 0, 0, 0, 0, 0}; boolean state[8] = { true, true, true, true, true, true, true, true }; Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, PIN, NEO_GRB + NEO_KHZ800); void setup() { // 164 Setup pinMode(DATAPIN, OUTPUT); pinMode(CLOCKPIN, OUTPUT); pinMode(POWER_ON , OUTPUT); pinMode(AWAKE, OUTPUT); digitalWrite(AWAKE, HIGH); digitalWrite(POWER_ON,LOW); strip.begin(); // Initialization of led matrix strip.setPixelColor(0, 0, 0, 0); strip.show(); Serial1.begin(9600); // delay(500); // Serial1.print(F("$$$")); // delay(500); // Serial1.println(); // Serial1.print(F("$$$")); // delay(500); // Serial1.println(); // Serial1.println(F("sleep")); // // digitalWrite(AWAKE, LOW); // // set prescale to 16 // sbi(ADCSRA,ADPS2) ; // cbi(ADCSRA,ADPS1) ; // cbi(ADCSRA,ADPS0) ; // // // set prescale to 8 // cbi(ADCSRA,ADPS2) ; // sbi(ADCSRA,ADPS1) ; // sbi(ADCSRA,ADPS0) ; // // set prescale to 4 // cbi(ADCSRA,ADPS2) ; // sbi(ADCSRA,ADPS1) ; // cbi(ADCSRA,ADPS0) ; // set up the ADC ADCSRA &= ~PS_128; // remove bits set by Arduino library // you can choose a prescaler from above. // PS_16, PS_32, PS_64 or PS_128 //ADCSRA |= PS_64; // set our own prescaler to 64 ADCSRA |= PS_32; // set our own prescaler to 64 if(DEBUG) Serial.begin(115200); } void loop() { for (int i = 0; i<8; i++) { sensorValue[i] = analogRead(sensorPin[i]); if (( ( sensorValue[i]>THRESHOLD ) && state[i] ) ) //|| ( (sensorValue[i]>(sensorValueAnt[i]/3) ) && ( (millis()-time[i])>(MASKTIME+SCANTIME) ) && ( (millis()-time[i])<=RETRIGTIME ) ) ) // superado el umbral y estado listo para samplear { // while (analogRead(sensorPin[i])>sensorValue[i]) { /*delayMicroseconds(100);*/ sensorValue[i] = analogRead(sensorPin[i]); } // while (average(sensorPin[i])>sensorValue[i]) { /*delayMicroseconds(100);*/ sensorValue[i] = average(sensorPin[i]); } delayMicroseconds(SCANTIME); // sustituir por un detector de nivel maximo durante una ventana temporal // // sensorValue[i] = average(sensorPin[i]); sensorValue[i] = analogRead(sensorPin[i]); if(sensorValue[i]>THRESHOLD) { if(DEBUG) { Serial.print("ON Sensor"); Serial.print(i); Serial.print(": "); Serial.print((sensorValue[i]*5)/1.023); Serial.print("mV"); Serial.print(" Time: "); Serial.print(millis()-time[i]); Serial.println("ms"); } if (state[i]) time[i] =millis(); state[i] = false; MIDIEvent e1 = { 0x09, 0x90, 60+i, constrain(sensorValue[i]/2, 0, 127) }; // aplicar curvas de log y exp MIDIUSB.write(e1); //int Value = sensorValue[i]*8; //if ((Value>341)&(Value<=682)) strip.setPixelColor(mapled[i], 0, map(Value,342, 682, 0, 255), 0); //else if(Value>682) strip.setPixelColor(mapled[i], 0, 0,map(Value, 883, 1023, 0, 255)); //else strip.setPixelColor(mapled[i], map(Value, 0, 341, 0, 255), 0, 0); //strip.show(); //sensorValueAnt[i]=sensorValue[i]; } } if(((millis()-time[i]) > MASKTIME ) && !state[i] ) { state[i] = true; MIDIEvent e2 = { 0x09, 0x90, 60+i, 0 }; MIDIUSB.write(e2); if(DEBUG) { Serial.print("OFF Sensor"); Serial.print(i); Serial.println(); } ShiftWrite(dischargePin[i], HIGH); ShiftWrite(dischargePin[i], LOW); } } } float average(int anaPin) { int lecturas = 4; long total = 0; float average = 0; for(int i=0; i>3); if(ret>=127) return 127; return ret;} float x=(float)Value; float f=((float)Form)/128.0; switch(Curve) { //[0-1023]x[0-127] case 1: ret=(127.0/(exp(2.0*f)-1))*(exp(f*x/512.0)-1.0);break; //Exp 4*(exp(x/256)-1) case 2: ret=log(1.0+(f*x/128.0))*(127.0/log((8*f)+1));break; //Log 64*log(1+x/128) case 3: ret=(127.0/(1.0+exp(f*(512.0-x)/64.0)));break; //Sigma case 4: ret=(64.0-((8.0/f)*log((1024/(1+x))-1)));break; //Flat } if(ret<=0) return 0; if(ret>=127) return 127;//127 return ret; }