// // Ultra Sonic parking sensor // Alex Tatistcheff (alext@pobox.com) 2011 // #define SENSOR_PIN A2 #define PHOTO_PIN A1 #define DISTANCE_ADJ A0 #define RED 5 #define YEL_2 4 #define YEL_1 3 #define GRN 2 int introFlag; int MoveFlag = 0; int LastDist=0; int StaticCount = 0; int SleepFlag = false; void setup(){ Serial.begin(9600); pinMode(RED, OUTPUT); pinMode(YEL_2, OUTPUT); pinMode(YEL_1, OUTPUT); pinMode(GRN, OUTPUT); pinMode(SENSOR_PIN, INPUT); pinMode(PHOTO_PIN, INPUT); pinMode(DISTANCE_ADJ, INPUT); } void loop(){ top: int DistRaw = analogRead(SENSOR_PIN); //Returns value of 0-150 (lower=closer) //Serial.print("DistRaw="); //Serial.println(DistRaw); DistRaw = map(DistRaw, 15, 500, 0, 50); Serial.print("DistRaw-1="); Serial.println(DistRaw); //int Dist = map(DistRaw, 0, 500, 1, 100); //Serial.println(Dist); //int DistAdjRaw = analogRead(DISTANCE_ADJ); //Serial.print("DistAdjRaw="); //Serial.println(DistAdjRaw); int DistAdj = map(analogRead(DISTANCE_ADJ), 0, 1024, -40, 20); //Serial.print(" DistAdj="); //Serial.println(DistAdj); int Dist = DistRaw + DistAdj; //Serial.print(" Dist="); //Serial.println(Dist); // Check to see if nothing is moving MoveFlag++; if (MoveFlag > 2) { MoveFlag = 0; //Reset the count if (LastDist - DistRaw > 1 || DistRaw - LastDist > 1) { SleepFlag = false; // Wake up! LastDist = DistRaw; // We've moved so store the current Distance into a variable } else { if (SleepFlag == true) { MoveFlag = 99; // To make sure it re-enters this code block digitalWrite(GRN, LOW); // Turn off the lights digitalWrite(YEL_1, LOW); digitalWrite(YEL_2, LOW); digitalWrite(RED, LOW); goto top; } StaticCount++; //We haven't seen movement so increment the static counter //Serial.print(" StaticCount="); //Serial.println(StaticCount); if (StaticCount > 15) { //Ok, no movement in a while - let's sleep StaticCount = 0; // Reset the counter SleepFlag = true; // Set the sleep flag goto top; //Top of the loop } } } if (Dist > 12) { digitalWrite(GRN, LOW); digitalWrite(RED, LOW); digitalWrite(YEL_1, LOW); digitalWrite(YEL_2, LOW); } if (Dist > 8 && Dist < 12) { digitalWrite(GRN, HIGH); digitalWrite(RED, LOW); digitalWrite(YEL_1, LOW); digitalWrite(YEL_2, LOW); } if (Dist > 4 && Dist < 8) { digitalWrite(GRN, HIGH); digitalWrite(RED, LOW); digitalWrite(YEL_1, HIGH); digitalWrite(YEL_2, LOW); } if (Dist > 0 && Dist < 4) { digitalWrite(GRN, HIGH); digitalWrite(RED, LOW); digitalWrite(YEL_1, HIGH); digitalWrite(YEL_2, HIGH); } if (Dist <= 0) { digitalWrite(RED, HIGH); digitalWrite(GRN, HIGH); digitalWrite(YEL_1, HIGH); digitalWrite(YEL_2, HIGH); delay(300); digitalWrite(RED, LOW); } else { digitalWrite(RED, LOW); } delay(333); }