/* James Khan Fab Academy final project code https://fabacademy.org/2021/labs/vancouver/students/james-khan/projects/final-project/ wowki simulation: https://wokwi.com/projects/427913698852171777 mostly the same as my sim. made few changes mainly for displaying more info on OLED started by using these Wowki samples: https://wokwi.com/projects/375237011181407233 https://wokwi.com/projects/290056311044833800 https://wokwi.com/projects/365718993906978817 */ #include // for OLED #include // for OLED #include // for OLED const int SCREEN_WIDTH = 128; // OLED display width, in pixels const int SCREEN_HEIGHT = 64; // OLED display height, in pixels // Declaration for an SSD1306 display connected to I2C (SDA, SCL pins) Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1); // for OLED // Define variables button and LED int buttonPin = 10; // Digital pin where the button is connected. int ledPin = 0; // Digital pin where the LED is connected. bool buttonState = false; int timer = 0; // variable to keep count for timer // DEfine variables Ultrasonic #define ECHO_PIN 9 #define TRIG_PIN 8 void setup() { pinMode(ledPin, OUTPUT); // LED pin as an output. pinMode(buttonPin, INPUT); // Button pin as an input. // for OLED Serial.begin(9600); if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // Address 0x3D for 128x64 Serial.println(F("SSD1306 allocation failed")); while(true); } // for ultrasonic // Serial.begin(115200); this was the ultrasonic samples code that conflicted pinMode(LED_BUILTIN, OUTPUT); pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); } float readDistanceCM() { digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); unsigned long duration = pulseIn(ECHO_PIN, HIGH); return duration * 0.034 / 2; } void loop() { float distance = readDistanceCM(); // ultrasonic read // use for troubleshooting // Serial.print("Measured distance: "); // serial output static // Serial.print(readDistanceCM()); // serial output distance // Serial.print(" "); // Serial.println(buttonState); // buttonState = digitalRead(buttonPin); // read state of button only if buttonstate is LOW if (buttonState == LOW){ buttonState = digitalRead(buttonPin); delay(50); if (buttonState == HIGH){ // resets timer on button press timer = 0; }; digitalWrite(ledPin, LOW); // LED off when timer not running display.clearDisplay(); // oled clear display.setTextSize(1); // oled setup display.setTextColor(WHITE); display.setCursor(0, 0); display.println("Press button to"); // static display display.println("start timer"); display.println(" "); display.print("last time:"); display.print(timer/10); display.println(" S"); display.print("Distance: "); display.println(distance); // display distance display.println("stops @ 200 mm"); display.display(); delay(100); } if (buttonState == HIGH){ // once buttonState is HIGH then run rest of code digitalWrite(ledPin, HIGH); // LED on when timer running display.clearDisplay(); // oled clear display.setTextSize(2); // oled setup display.setTextColor(WHITE); display.setCursor(0, 0); display.print("Time: "); display.println(timer/10); /// FILL IN TIME CODE display.println("seconds"); // display.println(" "); display.print("D:"); // static display display.println(distance); // display distance display.println("stop @ 200"); display.display(); delay(100); timer = timer + 1; // increment timer by 0.1 seconds if (distance < 200){ // stop timer code buttonState = digitalRead(buttonPin); // set buttonstate low so it stops timing }; }; }