I've been using two MB1240 Ultrasonic Sensors with analogRead, and have found that after using bubble sort, the array is found in array readings2, and not readings1. This is important because I would like to find the distance from each sensor.
Below is the code I've put together that uses buttons to determine when each sensor should be triggered.
const int anPin1 = 1;
const int anPin2 = 2;
const int triggerPin = 2;
long anVolt1, anVolt2;
// button Pins
const int buttonPin1 = 11;
const int buttonPin2 = 13;
int buttonState1;
int buttonState2;
int lastButtonState1 = false;
int lastButtonState2 = false;
long lastDebounceTime1 = 0;
long lastDebounceTime2 = 0;
long debounceDelay = 50; //ms
// initialise averaging array
const int numberOfReadings = 10; // reasonable DOF
long readings1[numberOfReadings];
long readings2[numberOfReadings];
long median;
void setup() {
Serial.begin(9600);
pinMode(triggerPin,OUTPUT);
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
delay(200); // Datasheet: Sensors require 175 ms to calibrate
}
void start_sensor(){
digitalWrite(triggerPin,HIGH);
delay(10);
digitalWrite(triggerPin,LOW);
}
long read_sensor1(){
//Used to read in the analog voltage output that is being sent by the XL-MaxSonar device.
//Scale factor is (Vcc/1024) per centimeter. A 5V supply yields ~4.9mV/cm for standard range sensors
anVolt1 = analogRead(anPin1);
return anVolt1;
}
long read_sensor2(){
anVolt2 = analogRead(anPin2);
return anVolt2;
}
void printall(long readings[]) {
int med = numberOfReadings/2;
median = (readings[med-1] + readings[med])/2;
Serial.print("Sensor: ");
for (int i = 0; i < numberOfReadings; i++) {
Serial.print(readings[i]);
Serial.print("cm ");
}
Serial.println();
Serial.print("Median: ");
Serial.print(median);
Serial.println(" cm");
}
void loop () {
int reading1 = digitalRead(buttonPin1);
int reading2 = digitalRead(buttonPin2);
// for noise
if (reading1 != lastButtonState1) {
lastDebounceTime1 = millis();
}
// for noise
if (reading2 != lastButtonState2) {
lastDebounceTime2 = millis();
}
if ((millis() - lastDebounceTime1) > debounceDelay) {
if (reading1 != buttonState1) {
buttonState1 = reading1;
if (buttonState1 == HIGH) {
for (int i = 0; i < numberOfReadings; i++){
start_sensor();
readings1[i] = read_sensor1();
delay(150); // From datasheet: Period = 99ms
}
**// bubble sort with flag
for (int i = 0; i < sizeof(readings1)-1; i++) {
bool flag = true;
for (int j = 1; j < sizeof(readings1)-1; j++) {
if (readings1[j-1] > readings1[j]) {
int t = readings1[j-1];
readings1[j-1] = readings1[j];
readings1[j] = t;
flag = false;
}
}
if (flag) break;
}
printall(readings1);**
}
}
}
lastButtonState1 = reading1;
if ((millis() - lastDebounceTime2) > debounceDelay) {
if (reading2 != buttonState2) {
buttonState2 = reading2;
if (buttonState2 == HIGH) {
for (int i = 0; i < numberOfReadings; i++) {
start_sensor();
readings2[i] = read_sensor2();
delay(150);
}
printall(readings2);
}
}
}
lastButtonState2 = reading2;
//clear previous readings
memset(readings1, 0, sizeof(readings1));
memset(readings2, 0, sizeof(readings2));
}
Scenario: I have clicked the first button to return a reading from the first sensor, and I am expecting the results to be stored then sorted in array readings1. After the bubble sort, if I enter printall(readings1), it returns an array of zeros, but if I use a printall(readings2), it returns the sorted array I expected.
I can't find where I'm going wrong with this one, any help would be greatly appreciated. Thank you!
qsort
be easier, faster, and more reliable?qsort
is brilliant. I switched from a bubble sort to a qsort algorithm for ordering triangles in a 3d mesh drawing library and it went from ~1fps for 8000 triangles to ~20fps.