#include <TaskScheduler.h>
#include <NewPing.h>
// Define pin numbers
const int ledPlayerRock = 2;
const int ledPlayerPaper = 3;
const int ledPlayerScissors = 4;
const int buttonRock = 5;
const int buttonPaper = 6;
const int buttonScissors = 7;
const int ledArduinoRock = 8;
const int ledArduinoPaper = 9;
const int ledArduinoScissors = 10;
const int ledRGBResultRed = 11;
const int ledRGBResultGreen = 12;
const int ledRGBResultBlue = 13;
const int triggerPin1 = A0;
const int echoPin1 = A1;
const int triggerPin2 = A2;
const int echoPin2 = A3;
const int motorPin = A4;
// Define task intervals
const unsigned long distanceCheckInterval = 500;
// Initialize Scheduler
Scheduler scheduler;
// Define tasks
Task distanceCheckTask(distanceCheckInterval, TASK_FOREVER, &distanceCheck);
// Define HC-SR04 sensors
NewPing sonar1(triggerPin1, echoPin1);
NewPing sonar2(triggerPin2, echoPin2);
void setup() {
// Initialize pin modes
pinMode(ledPlayerRock, OUTPUT);
pinMode(ledPlayerPaper, OUTPUT);
pinMode(ledPlayerScissors, OUTPUT);
pinMode(buttonRock, INPUT_PULLUP);
pinMode(buttonPaper, INPUT_PULLUP);
pinMode(buttonScissors, INPUT_PULLUP);
pinMode(ledArduinoRock, OUTPUT);
pinMode(ledArduinoPaper, OUTPUT);
pinMode(ledArduinoScissors, OUTPUT);
pinMode(ledRGBResultRed, OUTPUT);
pinMode(ledRGBResultGreen, OUTPUT);
pinMode(ledRGBResultBlue, OUTPUT);
pinMode(motorPin, OUTPUT);
// Start tasks
scheduler.init();
scheduler.addTask(distanceCheckTask);
distanceCheckTask.enable();
Serial.begin(9600);
pinMode(motorPin, OUTPUT);
}
void loop() {
scheduler.execute();
checkPlayerInput();
}
void distanceCheck() {
unsigned int distance1 = sonar1.ping_cm();
unsigned int distance2 = sonar2.ping_cm();
if (distance1 < 40 || distance2 < 40) {
int motorSpeed = map(min(distance1, distance2), 0, 40, 255, 0); // Inverse mapping
analogWrite(motorPin, motorSpeed);
Serial.print("Motor Speed: ");
Serial.println(motorSpeed);
} else {
analogWrite(motorPin, 0); // Arrêter le moteur
}
delay(100); // Laisser du temps entre les lectures
}
void checkPlayerInput() {
if (digitalRead(buttonRock) == LOW) {
digitalWrite(ledPlayerRock, HIGH);
delay(500);
digitalWrite(ledPlayerRock, LOW);
playerChoice(0); // Rock
}
if (digitalRead(buttonPaper) == LOW) {
digitalWrite(ledPlayerPaper, HIGH);
delay(500);
digitalWrite(ledPlayerPaper, LOW);
playerChoice(1); // Paper
}
if (digitalRead(buttonScissors) == LOW) {
digitalWrite(ledPlayerScissors, HIGH);
delay(500);
digitalWrite(ledPlayerScissors, LOW);
playerChoice(2); // Scissors
}
}
void playerChoice(int choice) {
// Allumer la LED correspondant au choix du joueur
switch (choice) {
case 0: // Rock
digitalWrite(ledPlayerRock, HIGH);
digitalWrite(ledPlayerPaper, LOW);
digitalWrite(ledPlayerScissors, LOW);
break;
case 1: // Paper
digitalWrite(ledPlayerRock, LOW);
digitalWrite(ledPlayerPaper, HIGH);
digitalWrite(ledPlayerScissors, LOW);
break;
case 2: // Scissors
digitalWrite(ledPlayerRock, LOW);
digitalWrite(ledPlayerPaper, LOW);
digitalWrite(ledPlayerScissors, HIGH);
break;
}
// Attendre un court instant pour éviter les faux déclenchements
delay(100);
// Laisser le joueur relâcher le bouton
while (digitalRead(buttonRock) == LOW || digitalRead(buttonPaper) == LOW || digitalRead(buttonScissors) == LOW);
// L'Arduino choisit aléatoirement sa réponse
int arduinoChoice = random(3); // 0: Rock, 1: Paper, 2: Scissors
// Afficher les choix sur les LED
displayChoices(choice, arduinoChoice);
// Déterminer le résultat
int result = determineWinner(choice, arduinoChoice);
// Afficher le résultat sur la LED RVB
displayResult(result);
}
void displayChoices(int playerChoice, int arduinoChoice) {
// Allumer la LED correspondant au choix de l'Arduino
switch (arduinoChoice) {
case 0: // Rock
digitalWrite(ledArduinoRock, HIGH);
digitalWrite(ledArduinoPaper, LOW);
digitalWrite(ledArduinoScissors, LOW);
break;
case 1: // Paper
digitalWrite(ledArduinoRock, LOW);
digitalWrite(ledArduinoPaper, HIGH);
digitalWrite(ledArduinoScissors, LOW);
break;
case 2: // Scissors
digitalWrite(ledArduinoRock, LOW);
digitalWrite(ledArduinoPaper, LOW);
digitalWrite(ledArduinoScissors, HIGH);
break;
}
}
int determineWinner(int playerChoice, int arduinoChoice) {
// Pierre bat ciseaux, ciseaux bat papier, papier bat pierre
if (playerChoice == arduinoChoice) {
return 0; // Égalité
} else if ((playerChoice == 0 && arduinoChoice == 2) ||
(playerChoice == 1 && arduinoChoice == 0) ||
(playerChoice == 2 && arduinoChoice == 1)) {
return 1; // Le joueur gagne
} else {
return -1; // L'Arduino gagne
}
}
void displayResult(int result) {
// Éteindre la LED RVB
analogWrite(ledRGBResultRed, 0);
analogWrite(ledRGBResultGreen, 0);
analogWrite(ledRGBResultBlue, 0);
// Afficher le résultat sur la LED RVB
if (result == 0) {
// Égalité (blanc)
analogWrite(ledRGBResultRed, 255);
analogWrite(ledRGBResultGreen, 255);
analogWrite(ledRGBResultBlue, 255);
} else if (result == 1) {
// Le joueur gagne (vert)
analogWrite(ledRGBResultGreen, 255);
} else {
// L'Arduino gagne (rouge)
analogWrite(ledRGBResultRed, 255);
}
}