/**************************************** * By Emmanuel Lalande For CART 360 * November 10 2008 * Based on * Exquisite Corpse API * Vincent Leclerc 11/2008 ****************************************/ int datum1 = 0; int datum2 = 0; int datum3 = 0; int lastnum1 = 0; int lastnum2 = 0; int lastnum3 = 0; int arrayIndex = 0;//keep track of which number we are at in the array int maxNums = 25;//max values in the array int dataNums[25];//the array of numbers int light1 = 3; int light2 = 5; int light3 = 9; int fan = 4; unsigned long time; //variables for sensor #define aultraSoundSignal 6 // UltraSound 6 int aval = 0; int aultrasoundValue = 0; //UltraSound1 Value int atimecount = 0; // Echo counter void setup() { // we put the lights on analog pins pinMode(light1, OUTPUT); pinMode(light2, OUTPUT); pinMode(light3, OUTPUT); pinMode(fan, OUTPUT); Serial.begin(9600); arrayIndex = 0; //start the index at zero } void loop() { atimecount = 0; aval = 0; pinMode(aultraSoundSignal, OUTPUT); // Switch signalpin to output /* Send low-high-low pulse to activate the trigger pulse of the sensor ------------------------------------------------------------------- */ digitalWrite(aultraSoundSignal, LOW); // Send low pulse delayMicroseconds(2); // Wait for 2 microsecond digitalWrite(aultraSoundSignal, HIGH); // Send high pulse delayMicroseconds(5); // Wait for 5 microseconds digitalWrite(aultraSoundSignal, LOW); // Holdoff /* Listening for echo pulse ------------------------------------------------------------------- */ pinMode(aultraSoundSignal, INPUT); // Switch signalpin to input aval = digitalRead(aultraSoundSignal); // Append signal value to val while(aval == LOW) { // Loop until pin reads a high value aval = digitalRead(aultraSoundSignal); } while(aval == HIGH) { // Loop until pin reads a high value aval = digitalRead(aultraSoundSignal); atimecount = atimecount +1; // Count echo pulse time } // Write values for sensor aultrasoundValue = atimecount; // Append echo pulse time to ultrasoundValue Serial.print(aultrasoundValue); delay(100); // delay before you do it all again. ////////////////////////////////////////////////////////// // WAIT FOR A NEW PACKET ////////////////////////////////////////////////////////// while (Serial.available() < 3) asm volatile("nop"); datum1 = Serial.read(); datum2 = Serial.read(); datum3 = Serial.read(); ////////////////////////////////////////////////////////// // MAKE SOMETHING HAPPEN IN THE PHYSICAL WORLD // ACCORDING TO THE RECEIVED PACKET ////////////////////////////////////////////////////////// //if no values are present do nothing if (datum1 == 0 || datum2 == 0 || datum3 == 0){ } else{ //if the proximity sensor reads nothing do not activate if (aultrasoundValue < 400) { time=millis();//record the time //decide which changed the most from the last one //add it to the array if (abs(datum1-lastnum1) >= abs(datum2-lastnum2) && abs(datum1-lastnum1) >= abs(datum3-lastnum3) ){ //1 is grestest change dataNums[arrayIndex] = datum1; } else if (abs(datum2-lastnum2) >= abs(datum3-lastnum3)){ //2 is grestest change dataNums[arrayIndex] = datum2; } else{ //3 is greatest change dataNums[arrayIndex] = datum3; } //each light represents the dataNum //they are the bloodflow //each light fades to the point of the data and then fades out in sequence //fade in and out 1 for (int i=0; i<=datum1;i++){ analogWrite(light1,i); delay(10); } for (int i=0; i<=datum1;i++){ analogWrite(light1,datum1-i); delay(10); } //fade in and out 2 for (int i=0; i<=datum2;i++){ analogWrite(light2,i); delay(10); } for (int i=0; i<=datum2;i++){ analogWrite(light2,datum2-i); delay(10); } //fade in and out 3 for (int i=0; i<=datum3;i++){ analogWrite(light3,i); delay(10); } for (int i=0; i<=datum3;i++){ analogWrite(light3,datum3-i); delay(10); } //the fan will beat at a rate to simulate a heartbeat //it will be the pulse //the delay is the pulse amount, big number equals long pause int total=0; for (int i=0; i<=arrayIndex; i++){ total += dataNums[i]; } digitalWrite(fan,HIGH); delay((total/(arrayIndex+1)));//beat for this strength digitalWrite(fan, LOW); delay((total/(arrayIndex+1)));//beat for this strength //increment the arrayindex if we are not at the maximum if (arrayIndex <= maxNums) { arrayIndex++; } else{ arrayIndex = 0; } ////////////////////////////////////////////////////////// // MODIFY THE PACKET ////////////////////////////////////////////////////////// //the lowest value is oxydised by the heart by a percentage dependant on the user's amount of looking. if (datum1 < datum2 && datum1< datum3){ //1 is smallest datum1 = (time-millis())/255; } else if (datum2 < datum3){ //2 is smallest datum2 = (time-millis())/255; } else{ //3 is greatest change datum3 = (time-millis())/255; } } ////////////////////////////////////////////////////////// // SEND THE NEW PACKET ////////////////////////////////////////////////////////// Serial.print(datum1, BYTE); Serial.print(datum2, BYTE); Serial.print(datum3, BYTE); } }