Show Posts
|
|
Pages: 1 ... 5 6 [7] 8
|
|
91
|
Using Arduino / Programming Questions / jerky mapped values from sensor
|
on: April 04, 2012, 05:20:56 pm
|
so I've got a sensor that is mapped to lead's. as i transition into the next range of my mapped values, the sensor readings flicker, causing the LED to glitch out a bit. heres my code: int ledVal;
const int pingPin = 7; const int ledG1 = 11; const int ledY1 = 10; const int ledR1 = 9;
int outputValue1; int outputValue2; int outputValue3; int outputValue4;
void setup() {
Serial.begin(9600); pinMode(ledG1, OUTPUT);
pinMode(ledR1, OUTPUT);
pinMode(ledY1, OUTPUT);
}
void loop() {
long duration, inches, cm;
pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(5); digitalWrite(pingPin, LOW); // delay(5);
pinMode(pingPin, INPUT); duration = pulseIn(pingPin, HIGH);
inches = microsecondsToInches(duration); cm = microsecondsToCentimeters(duration); // Serial.print(inches); Serial.print("in, "); Serial.print(cm); Serial.print("cm"); Serial.println(); //delay(10);
int ledVal = cm;
for(int value = 0; value <=0; value +=15) // ramp the number in "value" from 0 to 255 {
//forwrd fade
outputValue1 = map(ledVal,28, 37, value, 255);
outputValue2 = map(ledVal, 34, 23, value, 255);
//delay(100); outputValue3 = map(ledVal, 15, 23, value, 255);
//delay(100); outputValue4= map(ledVal, 17, 2, value, 255);
}
if(ledVal <=37 && ledVal >= 28){
analogWrite(ledG1, outputValue1); digitalWrite(ledR1, LOW); } if(ledVal <=34 && ledVal >=23 ){
analogWrite(ledY1, outputValue2 );
digitalWrite(ledR1, LOW);
}
if(ledVal <= 23 && ledVal >=15) { analogWrite(ledY1, outputValue3); digitalWrite(ledG1, LOW);
if(ledVal <= 17 && ledVal >=2) analogWrite(ledR1, outputValue4 );
digitalWrite(ledG1, LOW);
}}
long microsecondsToInches(long microseconds) { // According to Parallax's datasheet for the PING))), there are // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per // second). This gives the distance travelled by the ping, outbound // and return, so we divide by 2 to get the distance of the obstacle. // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf return microseconds / 74 / 2; }
long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2; }
|
|
|
|
|
92
|
Using Arduino / Programming Questions / Re: ramping up fading LED and suggestions
|
on: April 03, 2012, 02:24:03 pm
|
|
i understand, but i think i left out crucial info about what effect i want. i basically want to emulate "momentum" with these LED's. so when the sensor data is scaling with the pwm, i would expect a delay would be visible and a lack of flickering with the led brightness as i go through the ranges.
I've tried incrementing the pwm max val (255) by different amounts with for statement, but results are same.
and thanks for the previous response.
|
|
|
|
|
94
|
Using Arduino / Programming Questions / ramping up fading LED and suggestions
|
on: April 03, 2012, 01:19:59 pm
|
so, Ive mapped sensor data to an LED's PWM values. with doing this, the fading is far from smooth. I've tried the example smoothing, but I'm not seeing any positive results. any feedback, suggestions, resources very appreciated. heres a chunk of code: int values = cm; //cm = the values from sensor
//forwrd fade outputValue1 = map(values, 25, 39, 0, 255); outputValue2 = map(values, 39, 25, 0, 255); outputValue3 = map(values, 2, 24, 0, 255); outputValue4= map(values, 24, 2, 0, 255); // change the analog out value: }
//analogWrite(led1, outputValue1); // analogWrite(ledsignal, outputValue2);
if(values >= 25 ){
analogWrite(ledG1, outputValue1); analogWrite(ledG2, outputValue1); analogWrite(ledR1, outputValue2); analogWrite(ledR2, outputValue2); digitalWrite(ledY1, LOW); digitalWrite(ledY2, LOW); }
if(values >= 2 && values <= 24) { analogWrite(ledY1, outputValue4); analogWrite(ledY2, outputValue4); analogWrite(ledR1, outputValue3); analogWrite(ledR2, outputValue3); digitalWrite(ledG1, LOW); digitalWrite(ledG2, LOW);
|
|
|
|
|
95
|
Using Arduino / Programming Questions / Re: sensor data question
|
on: March 30, 2012, 06:17:56 pm
|
i dont understand why this isn't working. you'll probably find my errors a lot quicker /* Ping))) Sensor This sketch reads a PING))) ultrasonic rangefinder and returns the distance to the closest object in range. To do this, it sends a pulse to the sensor to initiate a reading, then listens for a pulse to return. The length of the returning pulse is proportional to the distance of the object from the sensor. The circuit: * +V connection of the PING))) attached to +5V * GND connection of the PING))) attached to ground * SIG connection of the PING))) attached to digital pin 7 http://www.arduino.cc/en/Tutorial/Ping created 3 Nov 2008 by David A. Mellis modified 30 Aug 2011 by Tom Igoe This example code is in the public domain. */
// this constant won't change. It's the pin number // of the sensor's output:
int redPin = 9; int bluePin = 10; int greenPin = 11;
int led13 = 13; int redVal; int greenVal; int blueVal;
/////// unsigned long now; unsigned long then = 0; int prevSensorValue = 0; const int pingPin = 7; int bigChange = 10; unsigned long longTime = 10; ///////////
int val1; int val2; void setup() { // initialize serial communication: Serial.begin(9600); pinMode(led13, OUTPUT); }
void loop() { // establish variables for duration of the ping, // and the distance result in inches and centimeters: long duration, inches, cm;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds. // Give a short LOW pulse beforehand to ensure a clean HIGH pulse: pinMode(pingPin, OUTPUT); digitalWrite(pingPin, LOW); delayMicroseconds(2); digitalWrite(pingPin, HIGH); delayMicroseconds(5); digitalWrite(pingPin, LOW);
// The same pin is used to read the signal from the PING))): a HIGH // pulse whose duration is the time (in microseconds) from the sending // of the ping to the reception of its echo off of an object. pinMode(pingPin, INPUT); duration = pulseIn(pingPin, HIGH);
// convert the time into a distance inches = microsecondsToInches(duration); cm = microsecondsToCentimeters(duration);
Serial.print(inches); Serial.print("in, "); Serial.print(cm); Serial.print("cm"); Serial.println();
delay(100);
int values = cm;
//forwrd fade int currSensorValue = analogRead(pingPin); if((abs(currSensorValue - prevSensorValue)) > bigChange) { // a change occurred then = millis();
digitalWrite(led13, HIGH); // Do something with the sensor data
} prevSensorValue = currSensorValue;
now = millis();
if(now - then > longTime) { digitalWrite(led13, LOW); // It's been a while since a change occurred
}
// change the analog out value:
redVal = digitalRead(pingPin); greenVal = digitalRead(pingPin); //makes all the mapped functions equal to sensor readings !!!!!!!!!! val1 = digitalRead(pingPin); val2 = digitalRead(pingPin); // redVal = map(values, 25, 40, 0, 255); greenVal = map(values, 40, 25, 0, 255); val1 = map(values, 3, 24, 0, 255); val2= map(values, 24, 3, 0, 255); // blueVal= map(values, 40, 25, 0, 255); //analogWrite(led1, outputValue1); // analogWrite(ledsignal, outputValue2); int pwmMax = 255; if(values >= 25 ){
analogWrite(redPin, HIGH); analogWrite(greenPin,redVal); analogWrite(bluePin, redVal);
} if(values >= 3 && values <= 24) { analogWrite(redPin, val2); analogWrite(greenPin, val2); analogWrite(bluePin, HIGH); } }
long microsecondsToInches(long microseconds) { // According to Parallax's datasheet for the PING))), there are // 73.746 microseconds per inch (i.e. sound travels at 1130 feet per // second). This gives the distance travelled by the ping, outbound // and return, so we divide by 2 to get the distance of the obstacle. // See: http://www.parallax.com/dl/docs/prod/acc/28015-PING-v1.3.pdf return microseconds / 74 / 2; }
long microsecondsToCentimeters(long microseconds) { // The speed of sound is 340 m/s or 29 microseconds per centimeter. // The ping travels out and back, so to find the distance of the // object we take half of the distance travelled. return microseconds / 29 / 2;
}
|
|
|
|
|
96
|
Using Arduino / Programming Questions / Re: sensor data question
|
on: March 30, 2012, 04:59:12 pm
|
no luck. I'm sorry, i am a very slow learner. I've set prevSensorValue to read analog values which i understand in your code isn that if prevSensorValue is different from currsensorValue (both are equal to analog ping pin), and the difference is greater then 5, (> bigChange which i set to 5), then, then= millis(). and below that statement, digitalWrite(led13, HIGH); and inverse for below. nothing aside from declaring then to equal millis and send a led high signal are my understand of what goes on there. hope I'm on the right track at least. I'm not having good results. prevSensorValue = analogRead(pingPin); int currSensorValue = analogRead(pingPin); if((abs(currSensorValue - prevSensorValue)) > bigChange) { // a change occurred then = millis();
digitalWrite(led13, HIGH); // Do something with the sensor data }
now = millis();
if(now - then > longTime) { digitalWrite(led13, LOW); // It's been a while since a change occurred }
|
|
|
|
|
97
|
Using Arduino / Programming Questions / Re: sensor data question
|
on: March 30, 2012, 09:57:53 am
|
OH thats right. stupid mistake forgetting the input was digital. regardless I'm still thrown off by what i should grab from the ping sensor for your script to compare to. unsigned long now; unsigned long then = 0; int prevSensorValue = 5; const int pingPin = 7; int bigChange = 5; unsigned long longTime = 5; also what is prevSensorValue doing? is it comparing if the difference is in time? it looks like its being used here to compare the data from the analog sensor instead of time? i may be incorrect
|
|
|
|
|
98
|
Using Arduino / Programming Questions / Re: sensor data question
|
on: March 30, 2012, 08:15:23 am
|
|
well i have other conversions later in the code. I've been basically triggering my code with the values in "cm". should i replace the analog read up top with an int for cm? ask if full code needed. still a bit unclear if the way I'm using your example is conceptually correct.
|
|
|
|
|
99
|
Using Arduino / Programming Questions / Re: sensor data question
|
on: March 29, 2012, 06:56:09 pm
|
i might be adding incorrect values, but heres what i implemented, without any results: unsigned long now; unsigned long then = 0; int prevSensorValue = 5; const int pingPin = 7; int bigChange = 5; unsigned long longTime = 5;
int currSensorValue = analogRead(pingPin); if((abs(currSensorValue - prevSensorValue)) > bigChange) { // a change occurred then = millis();
digitalWrite(led13, HIGH); // Do something with the sensor data }
now = millis();
if(now - then > longTime) { digitalWrite(led13, LOW); // It's been a while since a change occurred }
int values = cm;
//forwrd fade outputValue1 = map(values, 25, 40, 0, 255); outputValue2 = map(values, 40, 25, 0, 255); outputValue3 = map(values, 3, 24, 0, 255); outputValue4= map(values, 24, 3, 0, 255); // change the analog out value:
//analogWrite(led1, outputValue1); // analogWrite(ledsignal, outputValue2);
if(values >= 25 ){
analogWrite(led1, outputValue1); analogWrite(ledsignal, outputValue2); digitalWrite(led2, LOW); }
if(values >= 3 && values <= 24) { analogWrite(led2, outputValue4); analogWrite(ledsignal, outputValue3); digitalWrite(led1, LOW);
}}
thanks so much for your help.
|
|
|
|
|
102
|
Using Arduino / Programming Questions / sensor data question
|
on: March 29, 2012, 06:00:48 pm
|
|
so i'll explain what I'm doing first. using a ping sensor to change LED's. simple. but what i was wondering if their is a way to detect when a sensor stays at a particular number for "x" amount of time, to do something else. i know i can use another sensor, but thats a last resort.
|
|
|
|
|
103
|
Using Arduino / Programming Questions / Re: LEDS, cross fading, mapping question
|
on: March 29, 2012, 05:17:27 pm
|
sorry, here is what I'm doing: outputValue1 = map(values, 25, 40, 0, 255); outputValue2 = map(values, 40, 25, 0, 255); outputValue3 = map(values, 2, 24, 0, 255); outputValue4= map(values, 24, 2, 0, 255); // change the analog out value:
//analogWrite(led1, outputValue1); // analogWrite(ledsignal, outputValue2);
if(values >= 25 ){
analogWrite(led1, outputValue1); analogWrite(ledsignal, outputValue2); }
if(values >= 2 && values <= 24) { analogWrite(led2, outputValue4); analogWrite(ledsignal, outputValue3);
} }
|
|
|
|
|
104
|
Using Arduino / Programming Questions / Re: LEDS, cross fading, mapping question
|
on: March 29, 2012, 05:07:37 pm
|
|
actually now I'm trying to crossfade between the 3 LED's and I'm having a road block conceptually on how to tackle this. i ended up making two more map functions, but i know this isn't necessary. so transition is led1 cross fades into led2; led 2 crossfades into led3
|
|
|
|
|