Low-latency-Haptic-Feedback / Haptics_Final_CodeV2 / Haptics_Final_CodeV2.ino
Haptics_Final_CodeV2.ino
Raw
// Pin definitions for the FlexiForce sensors
#define FLEXI_FORCE_PIN_1 A0
#define FLEXI_FORCE_PIN_2 A1
#define FLEXI_FORCE_PIN_3 A2

// Pin definitions for other digital pins
#define PIN_P_1 6
#define PIN_P_2 5
#define PIN_P_3 3

// Constants for size of arrays and threshold
#define ARRAY_SIZE 9
#define THRESHOLD 90 //sucess at 30 and 50 too but 90 was more consistent

// Arrays to hold sensor readings and boolean states
int valArray[ARRAY_SIZE];
int valInitArray[ARRAY_SIZE];
bool boolArray[ARRAY_SIZE];

// Variable to hold the sum of boolean states
int sum = 0;

// Initial setup routine
void setup() {
  // Begin serial communication
  Serial.begin(9600);
  
  // Set pin modes to output
  pinMode(PIN_P_1, OUTPUT);
  pinMode(PIN_P_2, OUTPUT);
  pinMode(PIN_P_3, OUTPUT);

  // Initialize pins and values
  initializePins();
  initializeValues();
}

// Main loop routine
void loop() {
  // Initialize pins and update values
  initializePins();
  updateValues();

  // Update boolean array and print it
  updateBoolArray();
  printBoolArray();
  
  // Check conditions of walls
  checkWallConditions();
  
  // Print new line
  Serial.println();
}

// Function to initialize pins to low
void initializePins() {
  digitalWrite(PIN_P_1,LOW);
  digitalWrite(PIN_P_2,LOW);
  digitalWrite(PIN_P_3,LOW);
}

// Function to initialize values by reading from sensors
void initializeValues() {
  updateValuesWithPinHigh(PIN_P_3, valInitArray, 6, 0, 3);
  updateValuesWithPinHigh(PIN_P_2, valInitArray, 7, 1, 4);
  updateValuesWithPinHigh(PIN_P_1, valInitArray, 8, 2, 5);
}

// Function to update values by reading from sensors
void updateValues() {
  updateValuesWithPinHigh(PIN_P_3, valArray, 6, 0, 3);
  updateValuesWithPinHigh(PIN_P_2, valArray, 7, 1, 4);
  updateValuesWithPinHigh(PIN_P_1, valArray, 8, 2, 5);
}

// Function to read sensor values with the given pin set high
void updateValuesWithPinHigh(int pin, int* array, int index1, int index2, int index3) {
  digitalWrite(pin, HIGH);
  array[index1] = analogRead(FLEXI_FORCE_PIN_1);
  array[index2] = analogRead(FLEXI_FORCE_PIN_2);
  array[index3] = analogRead(FLEXI_FORCE_PIN_3);
  digitalWrite(pin, LOW);
}

// Function to update boolean array based on threshold
void updateBoolArray() {
  sum = 0;
  for(int k = 0; k < ARRAY_SIZE; k++){
    if(valArray[k] > valInitArray[k] + THRESHOLD) {
      boolArray[k] = 1;
      sum++;
    } else {
      boolArray[k] = 0;
    }
  }
}

// Function to print the boolean array
void printBoolArray() {
  for(int i = 0; i < 3; i++) {
    for(int j = 0; j < 3; j++) {
      Serial.print(boolArray[3*i + j]);
      Serial.print("\t");
    }
    Serial.println();
  }
}

// Function to check conditions of walls based on boolean array
void checkWallConditions() {
  // Check conditions based on sum of boolean states
  // Print the corresponding wall condition
   if(sum == 3){
    if(boolArray[0] + boolArray[1] + boolArray[2] == 3){
      Serial.println("Wall Top");
    }else if(boolArray[3] + boolArray[4] + boolArray[5] == 3){
      Serial.println("Wall Middle Hori");
    }else if(boolArray[6] + boolArray[7] + boolArray[8] == 3){
      Serial.println("Wall Bottom");
    }
    if(boolArray[0] + boolArray[3] + boolArray[6] == 3){
      Serial.println("Wall Left");
    }else if(boolArray[1] + boolArray[4] + boolArray[7] == 3){
      Serial.println("Wall Middle Vert ");
    }else if(boolArray[2] + boolArray[5] + boolArray[8] == 3){
      Serial.println("Wall Right");
    }
  }else if(sum == 4) {
    if(boolArray[0] + boolArray[1] + boolArray[3] + boolArray[4] == 4){
      Serial.println("Bottom Right Edge");
    }else if(boolArray[1] + boolArray[2] + boolArray[4] + boolArray[5] == 4){
      Serial.println("Bottom Left edge");
    }else if(boolArray[6] + boolArray[7] + boolArray[3] + boolArray[4] == 4){
      Serial.println("Top Right Edge");
    }else if(boolArray[8] + boolArray[7] + boolArray[5] + boolArray[4] == 4){
      Serial.println("Top Left Edge");
    }
  }else if(sum == 5) {
    if(boolArray[0] + boolArray[1] + boolArray[3] + boolArray[4] == 0){
      Serial.println("Bottom Right Corner");
    }else if(boolArray[1] + boolArray[2] + boolArray[4] + boolArray[5] == 0){
      Serial.println("Bottom Left Corner");
    }else if(boolArray[6] + boolArray[7] + boolArray[3] + boolArray[4] == 0){
      Serial.println("Top Right Corner");
    }else if(boolArray[8] + boolArray[7] + boolArray[5] + boolArray[4] == 0){
      Serial.println("Top Left Corner");
    }
  }else if(sum == 6){
    if(boolArray[0] + boolArray[1] + boolArray[2] == 0){
      Serial.println("Top Edge");
    }else if(boolArray[3] + boolArray[4] + boolArray[5] == 0){
      Serial.println("Middle Hori Edge");
    }else if(boolArray[6] + boolArray[7] + boolArray[8] == 0){
      Serial.println("Bottom Edge");
    }
    if(boolArray[0] + boolArray[3] + boolArray[6] == 0){
      Serial.println("Left Edge");
    }else if(boolArray[1] + boolArray[4] + boolArray[7] == 0){
      Serial.println("Middle Vert Edge ");
    }else if(boolArray[2] + boolArray[5] + boolArray[8] == 0){
      Serial.println("Right Edge");
    }
  }

}