Lab_interaccio/2014/Oval4_sonar/Oval4_sonar.ino
2025-02-25 21:29:42 +01:00

240 lines
6.1 KiB
C++

#include "Adafruit_NeoPixel.h"
#include <Wire.h>
#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<lecturas; i++)
{
//delay(1);
total = total + analogRead(anaPin);
}
average = (float)total / lecturas;
return(average);
}
uint8_t val_shift = 0x00; //Valor del shift register
void ShiftWrite(uint8_t pin, boolean state){
bitWrite(val_shift, pin, state);
shiftOut(DATAPIN, CLOCKPIN, MSBFIRST, val_shift);
}
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
// USECURVE beta version
//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
byte UseCurve(byte Curve,int Value,byte Form)
{
int ret=0;
if(Curve==0) { ret=((Value*Form)>>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;
}