Pages: [1] 2   Go Down
Author Topic: hold last sensor value  (Read 1774 times)
0 Members and 1 Guest are viewing this topic.
berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hello

I would like to loop the last value coming out of a pressure sensor. At the moment the value drops back to 0 when no pressure is applied because it is a resistor. I need it to stay on the last value it read.

It is probably easy but I can't figure it out.

Code:
#include <MIDI.h>

int posPin = A0;
int posVal = 0;

void setup() {
 MIDI.begin(4);
}

void loop() {
  delay(30);
  posVal = analogRead(posPin);
  posVal = map(posVal, 1023, 0, 0, 127);
  posVal = constrain(posVal, 0, 127);
  MIDI.sendControlChange(20, posVal, 4);
}

Thank you!

Fubbi
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I need it to stay on the last value it read.
That's exactly what it is doing. The last value that it read was a 0. You need to be a little clearer in your requirements.
Logged

berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
I need it to stay on the last value it read.
That's exactly what it is doing. The last value that it read was a 0. You need to be a little clearer in your requirements.

Sorry if I was unclear,

Its a 50 cm position sensor and if I press it in the middle and get a value of perhaps 60, I would like the MIDI.sendControlChange to keep sending 60. Until I press again somewhere else and update the "last pressed value".


Thanks
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So, you want it to detect the highest value read within some period of time? Remember that the 0 values that it reads are perfectly valid values. Remember also that it will read values from zero up to some high value and then all the way back down to zero.
Logged

berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

So, you want it to detect the highest value read within some period of time? Remember that the 0 values that it reads are perfectly valid values. Remember also that it will read values from zero up to some high value and then all the way back down to zero.

If I press 0 that would indeed be the right value for that case. However, I would like it to continously send the last value I pressed circumventing the automatic drop back to 0.

I am building a midi instrument and I am using the position sensor to update filter parameters. Kinda dull if it always snaps back to zero. It should just stay where I last lifted my finger.

cheers
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
If I press 0 that would indeed be the right value for that case. However, I would like it to continously send the last value I pressed circumventing the automatic drop back to 0.
I don't think what you want to do can be done, then. You can't "press a 0". If you are not touching the sensor, the value that it returns should be 0. When you do touch it, the value read ramps up to some value and then back down to zero when you release it. The Arduino reads a number of values along that curve.

If you want to track the highest value in some time frame, and use that value for some time, that could be done.

But, the Arduino can not tell whether a reading was of some particular meaning to you, and should be maintained until it no longer means anything to you. It does not have an ESP sensor built in.
Logged

berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I hear ya.

thanks!
Logged

berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset


Hey, since I have a reliable zero (pull-down R) when not pressed. It must be possible to "hold" any last value that wasn't a zero, no?
Logged

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 602
Posts: 33372
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes do you mean something like this:-
Code:
tempVal = analogRead(posPin);
if(tempVal !=0) posVal = tempVal;
Logged

berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Yes do you mean something like this:-
Code:
tempVal = analogRead(posPin);
if(tempVal !=0) posVal = tempVal;

yey! this works:

Code:
void loop(){
    delay(30);
    readPos();
    MIDI.sendControlChange(22, posVal, 16);
}

void readPos(){
  tempVal = analogRead(posPin);
  if(tempVal !=0) {
  posVal = tempVal;
  posVal = map(posVal, 1023, 1, 127, 0);
  posVal = constrain(posVal, 0, 127);
}
}

Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
    delay(30);
So, you DID mean periodically? You swore up and down you didn't.
Logged

berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
    delay(30);
So, you DID mean periodically? You swore up and down you didn't.

the delay was just in there to slow things down temporarily

 smiley-small
Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Then, the value read from the FSR is going to ramp up and back down. Holding the last non-zero value is not the same as holding the highest value that was reached. But, of course, that might be just fine, if the fall off ramp is very steep (without the delay()).
Logged

berlin
Offline Offline
Full Member
***
Karma: 0
Posts: 154
fubbi.com
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I was wondering about that. How fast a hardware pulldown occurs VS how fast the arduino loops. But it behaves ok. So if it isn't broken don't fix it, right?

Now that that works I need to figure out how to release it so that I can slide my finger over the ribbon triggering notes form a scale.

I am currently blocking the polling of the sensor by how I wrote my code so the value does not update and the note won't change. Can you point me in the right direction please?

Code:
#include <MIDI.h>

int posPin = A0;
int posVal = 0;
int note = 0;
int tempVal = 0;
int led = 13;
int scale[] = {
  60,62,64,65,67,69,71};

#define LED 13

void setup() {
  pinMode(LED, OUTPUT);
  MIDI.begin();            // Launch MIDI with default options
}

void loop(){
  readPos();
}

void readPos(){
  tempVal = analogRead(posPin);

  if(tempVal == 0) {
    MIDI.sendControlChange(123,0,1); // OMNI NOTE OFF MSG
    digitalWrite(led, LOW);
  }

  if(tempVal !=0) {
    posVal = tempVal;
    posVal = map(posVal, 1023, 1, 127, 0); // make midi notes
    posVal = constrain(posVal, 0, 127); // constrain it
    note = map(tempVal, 1023, 1, 6, 0); // make it 7 for the note array
    note = constrain(note, 0, 6); // constrain it
    note = scale[note]; // pick a note
    MIDI.sendNoteOn(note,127,1); // send the note (note, velocity, channel)
    digitalWrite(led, HIGH);
  }
}
 

Logged

Seattle, WA USA
Offline Offline
Brattain Member
*****
Karma: 601
Posts: 48543
Seattle, WA USA
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I don't really understand what you are doing.
Code:
  if(tempVal == 0) {
    MIDI.sendControlChange(123,0,1); // OMNI NOTE OFF MSG
    digitalWrite(led, LOW);
  }

  if(tempVal !=0) {
If tempVal is not 0, how can it be anything other than not 0? The 2nd if statement should be an else.

Code:
    posVal = tempVal;
    posVal = map(posVal, 1023, 1, 127, 0); // make midi notes
    posVal = constrain(posVal, 0, 127); // constrain it
Why? You never use posVal anywhere else.

Quote
Now that that works I need to figure out how to release it so that I can slide my finger over the ribbon triggering notes form a scale.
Pressing somewhere else/some other amount should generate another non-zero value.
Logged

Pages: [1] 2   Go Up
Jump to: