#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <Stepper.h>
#include <Servo.h>
// lcd and stepper
LiquidCrystal_I2C lcd(0x27, 16, 2);
const int steps = 200;
Stepper myStepper(steps, 4, 5, 6, 7);
// rgb pins
const int redd = 3;
const int greenn = 2;
const int bluee = 1;
// button pins
const int t = A2;
const int f = A3;
// ultrasonic pins
const int trigPin = 8;
const int echoPin = A0;
// servo pins
Servo eyelid;
const int servoPin = 9;
// for quiz
String questions[] = {"Pogi si butlig?", "Mabait si butlig?", "Is 1 + 1 = 2?", "cute ba me?", "is 3 x 5 = 20?"};
int index[5] = {0, 1, 2, 3, 4};
int ques = 0;
int points = 0;
bool quizz = false;
bool endG = false;
unsigned long blink = 0;
void setup() {
lcd.begin(16, 2);
lcd.noBacklight();
lcd.clear();
pinMode(redd, OUTPUT);
pinMode(greenn, OUTPUT);
pinMode(bluee, OUTPUT);
pinMode(t, INPUT);
pinMode(f, INPUT);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
setRGB(0, 0, 0);
eyelid.attach(servoPin);
eyelid.write(0);
randomq();
myStepper.setSpeed(60);
}
void loop() {
bool isClose = ultra();
if (isClose && !quizz && !endG) {
quizz = true;
lcd.backlight();
displayQuestion();
} else if (!isClose && quizz) {
quizz = false;
lcd.noBacklight();
lcd.clear();
setRGB(0, 0, 0);
}
if (quizz && !endG) {
eyelidBlink();
if (digitalRead(t) == LOW || digitalRead(f) == LOW) {
Answer(digitalRead(t) == LOW);
delay(1000);
ques++;
if (ques >= 5) {
pts();
playagain();
} else {
displayQuestion();
}
}
}
}
void playagain() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Play again?");
lcd.setCursor(0, 1);
lcd.print("T: Yes F: No");
while (true) {
if (digitalRead(t) == LOW) {
delay(200);
points = 0;
ques = 0;
randomq();
lcd.clear();
displayQuestion();
endG = false;
break;
}
else if (digitalRead(f) == LOW) {
delay(200);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("End of the game");
setRGB(255, 255, 255);
delay(2000);
endG = true;
break;
}
}
}
// Shuffle the questions
void randomq() {
for (int i = 0; i < 5; i++) {
int r = random(i, 5);
int temp = index[i];
index[i] = index[r];
index[r] = temp;
}
}
// for ultrasonic sensor
bool ultra() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
long duration = pulseIn(echoPin, HIGH);
float distance = (duration * 0.034) / 2;
return distance < 50;
}
// answers
void Answer(bool answer) {
bool correct = false;
if ((index[ques] == 0 && !answer) || (index[ques] == 1 && answer) ||
(index[ques] == 2 && answer) || (index[ques] == 3 && answer) ||
(index[ques] == 4 && !answer)) {
correct = true;
}
if (correct) {
points++;
setRGB(0, 255, 0);
displayResult("Correct");
} else {
setRGB(255, 0, 0);
displayResult("Incorrect");
setRGB(255, 0, 0);
myStepper.step(steps);
delay(500);
myStepper.step(-steps);
}
}
void displayQuestion() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(questions[index[ques]]);
setRGB(0, 0, 255);
}
void displayResult(const char* result) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(result);
delay(500);
}
void pts() {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("My Points:");
lcd.setCursor(0, 1);
lcd.print(points);
setRGB(255, 255, 255);
}
// blink ng eyelid
void eyelidBlink() {
unsigned long time = millis();
if (time - blink >= 3000) {
eyelid.write(0); // close eyelid
delay(200);
eyelid.write(90); // open eyelid
blink = time;
}
}
// Set RGB LED color
void setRGB(int red, int green, int blue) {
analogWrite(redd, red);
analogWrite(greenn, green);
analogWrite(bluee, blue);
}