This is an old revision of the document!
Mașina funcționează în două moduri distincte, controlate din aplicația de pe smartphone (Dabble):
Modul Manual (default la conectare) Modul Automat: Evitare obstacole + prăpastii
Starea 0 → Așteptare conectare Bluetooth (Idle):
Starea 1 → Mod Manual (Bluetooth GamePad activ):
Starea 2 → Mod Automat (Evitare obstacole și prăpastii):
Starea 3 → Revenire la Manual:
#define CUSTOM_SETTINGS #define INCLUDE_GAMEPAD_MODULE #include <DabbleESP32.h> #include <ESP32Servo.h> #include <NewPing.h> #include <Wire.h> #include <LiquidCrystal_I2C.h>
LCD setup (SDA=25, SCL=26) LiquidCrystal_I2C lcd(0x27, 16, 2); Motoare #define IN1 18 #define IN2 19 #define IN3 21 #define IN4 22
Ultrasunete #define TRIG_PIN 14 #define ECHO_PIN 27 #define MAX_DISTANCE 200 Servomotor #define SERVO_PIN 32
Senzor IR pentru margine/prăpastie #define IR_SENSOR_PIN 34 Configurări #define MAX_MOTOR_SPEED 255 #define TURN_SPEED 150 #define OBSTACLE_DISTANCE 20
Servo myServo; NewPing sonar(TRIG_PIN, ECHO_PIN, MAX_DISTANCE);
boolean goesForward = false; boolean obstacleAvoidanceMode = false; int distance = 100; int speedSet = 0;
void setUpPinModes() {
pinMode(IN1, OUTPUT); pinMode(IN2, OUTPUT); pinMode(IN3, OUTPUT); pinMode(IN4, OUTPUT); pinMode(IR_SENSOR_PIN, INPUT);
myServo.attach(SERVO_PIN); myServo.write(90); Serial.println("Servomotor inițiat la 90°");
}
void moveForward() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); Serial.println("Înainte");
}
void moveBackward() {
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); Serial.println("Înapoi");
}
void turnLeft() {
digitalWrite(IN1, LOW); digitalWrite(IN2, HIGH); digitalWrite(IN3, HIGH); digitalWrite(IN4, LOW); Serial.println("Stânga");
}
void turnRight() {
digitalWrite(IN1, HIGH); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, HIGH); Serial.println("Dreapta");
}
void stopMotors() {
digitalWrite(IN1, LOW); digitalWrite(IN2, LOW); digitalWrite(IN3, LOW); digitalWrite(IN4, LOW); Serial.println("Oprire");
}
int readPing() {
delay(70); int cm = sonar.ping_cm(); if (cm == 0) { cm = MAX_DISTANCE; } Serial.print("Distanță: "); Serial.print(cm); Serial.println(" cm"); return cm;
}
int lookRight() {
myServo.write(50); delay(500); int distance = readPing(); myServo.write(90); return distance;
}
int lookLeft() {
myServo.write(130); delay(500); int distance = readPing(); myServo.write(90); return distance;
}
void avoidObstacles() {
int senzorIR = digitalRead(IR_SENSOR_PIN); // LOW = prăpastie int distanceR = 0; int distanceL = 0; distance = readPing();
if (senzorIR == LOW) { stopMotors(); lcd.setCursor(0, 1); lcd.print("Prapastie STOP "); delay(200);
moveBackward(); delay(400); stopMotors(); delay(200);
turnLeft(); // Întoarcere completă delay(700); stopMotors(); delay(200); return; }
if (distance <= OBSTACLE_DISTANCE) { stopMotors(); lcd.setCursor(0, 1); lcd.print("Obstacol STOP "); delay(100); moveBackward(); delay(300); stopMotors(); delay(200);
distanceR = lookRight(); delay(200); distanceL = lookLeft(); delay(200);
if (distanceR >= distanceL) { turnRight(); delay(500); stopMotors(); } else { turnLeft(); delay(500); stopMotors(); } } else { moveForward(); lcd.setCursor(0, 1); lcd.print("Drum liber "); }
}
void setup() {
Serial.begin(115200); setUpPinModes(); Dabble.begin("MyBluetoothCar");
Wire.begin(25, 26); // SDA, SCL lcd.init(); lcd.backlight(); lcd.setCursor(0, 0); lcd.print("Conecteaza-te"); lcd.setCursor(0, 1); lcd.print("sefule ");
Serial.println("Dabble și LCD inițiate, aștept conectarea...");
}
void loop() {
Dabble.processInput();
if (!Dabble.isAppConnected()) { lcd.setCursor(0, 0); lcd.print("Conecteaza-te "); lcd.setCursor(0, 1); lcd.print("sefule "); delay(1000); return; }
static bool wasConnected = false; if (!wasConnected) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Mod: Manual"); wasConnected = true; }
// Activare mod evitare obstacole (include și prăpastie) if (GamePad.isTrianglePressed()) { Serial.println("Mod obstacole+prapastie activat"); obstacleAvoidanceMode = true;
lcd.clear(); lcd.setCursor(0, 0); lcd.print("Mod: Obstacole+"); lcd.setCursor(0, 1); lcd.print("Prapastii "); }
// Dezactivare if (GamePad.isCrossPressed()) { Serial.println("Mod automat oprit, revenire la manual"); obstacleAvoidanceMode = false; stopMotors();
lcd.clear(); lcd.setCursor(0, 0); lcd.print("Mod: Manual"); }
if (obstacleAvoidanceMode) { avoidObstacles(); return; }
// Control manual if (GamePad.isUpPressed()) { moveForward(); } else if (GamePad.isDownPressed()) { moveBackward(); } else if (GamePad.isLeftPressed()) { turnLeft(); } else if (GamePad.isRightPressed()) { turnRight(); } else { stopMotors(); }
}