#include <Wire.h>
#include <Adafruit_SSD1306.h>
#include <Servo.h>
// OLED Display setup
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, -1);
// Bluetooth setup
char voiceCommand;
// Ultrasonic Sensor setup
#define trigPin 12
#define echoPin 13
long duration;
int distance;
// L293D Motor Driver Shield pins (already predefined by the shield)
#define M1 3 // Motor A - Left Front (Enable Pin)
#define M2 11 // Motor B - Right Front (Enable Pin)
#define M3 5 // Motor C - Left Rear (Enable Pin)
#define M4 6 // Motor D - Right Rear (Enable Pin)
// IR Sensors
#define IR_LEFT 4
#define IR_RIGHT 2
// Servo setup for Ultrasonic sensor rotation
Servo myServo;
void setup() {
// Motor pins setup (pwm speed control for motors)
pinMode(M1, OUTPUT);
pinMode(M2, OUTPUT);
pinMode(M3, OUTPUT);
pinMode(M4, OUTPUT);
// IR Sensors
pinMode(IR_LEFT, INPUT);
pinMode(IR_RIGHT, INPUT);
// Ultrasonic sensor setup
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
// Servo setup
myServo.attach(3);
myServo.write(90); // Start with the sensor facing forward
// Bluetooth Serial setup
Serial.begin(9600);
// OLED Display initialization
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.clearDisplay();
}
void loop() {
// Check for Bluetooth command
if (Serial.available() > 0) {
voiceCommand = Serial.read();
controlCar(voiceCommand);
}
// Display distance measured by the ultrasonic sensor on OLED
displayDistance();
}
void controlCar(char command) {
switch (command) {
case 'F': // Move Forward
moveForward();
break;
case 'B': // Move Backward
moveBackward();
break;
case 'L': // Turn Left
turnLeft();
break;
case 'R': // Turn Right
turnRight();
break;
case 'S': // Stop
stopCar();
break;
default:
stopCar();
}
}
// Control functions for the motors using the shield
void moveForward() {
analogWrite(M1, 255); // Full speed forward for left front motor
analogWrite(M2, 255); // Full speed forward for right front motor
analogWrite(M3, 255); // Full speed forward for left rear motor
analogWrite(M4, 255); // Full speed forward for right rear motor
}
void moveBackward() {
analogWrite(M1, 0); // Reverse left front motor
analogWrite(M2, 0); // Reverse right front motor
analogWrite(M3, 0); // Reverse left rear motor
analogWrite(M4, 0); // Reverse right rear motor
}
void turnLeft() {
analogWrite(M1, 0); // Stop left front motor
analogWrite(M2, 255); // Full speed right front motor
analogWrite(M3, 0); // Stop left rear motor
analogWrite(M4, 255); // Full speed right rear motor
}
void turnRight() {
analogWrite(M1, 255); // Full speed left front motor
analogWrite(M2, 0); // Stop right front motor
analogWrite(M3, 255); // Full speed left rear motor
analogWrite(M4, 0); // Stop right rear motor
}
void stopCar() {
analogWrite(M1, 0); // Stop all motors
analogWrite(M2, 0);
analogWrite(M3, 0);
analogWrite(M4, 0);
}
void displayDistance() {
// Send trigger pulse
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
// Read echo pulse
duration = pulseIn(echoPin, HIGH);
distance = duration * 0.034 / 2;
// Display the distance on the OLED
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0, 0);
display.print("Distance: ");
display.print(distance);
display.println(" cm");
display.display();
}