## ~josealberto4444/arduino-quiz

e27b6062bcd9e89991fec277bc81ca5c66edbed0 — josealberto4444 6 years ago
```Add answering functions
```
```1 files changed, 90 insertions(+), 32 deletions(-)

M quiz/quiz.ino
```
`M quiz/quiz.ino => quiz/quiz.ino +90 -32`
```@@ 66,31 66,10 @@ byte qaCounter = 0;
// Remote-command variabes
const unsigned long remoteSwitchScroll = 0x1fe48b7;
const unsigned long remotePause = 0x1fee817;
-
-
-char buffer[256]; // Maximum length of any question or answer.
-
-const char q_0[] PROGMEM = "What is the number of electrons going through the normal section of a wire whose current is 0.2 A during 16 s?";
-const char a_00[] PROGMEM = "Answer 1: 10^16";
-const char a_01[] PROGMEM = "Answer 2: 10^19";
-const char a_02[] PROGMEM = "Answer 3: 1.6 * 10^19";
-const char a_03[] PROGMEM = "Answer 4: 2.0 * 10^19";
-
-const char q_1[] PROGMEM = "A particle's trajectory is given by the parametric equations x = t, y = t^2 / 2. What is its curvature radius?";
-const char a_10[] PROGMEM = "Answer 1: (1+t^2)^(3/2)";
-const char a_11[] PROGMEM = "Answer 2: (1+t^3)^(1/2)";
-const char a_12[] PROGMEM = "Answer 3: (1+t)^(3/2)";
-const char a_13[] PROGMEM = "Answer 4: (1+t)^(1/2)";
-
-const char* const qa[] PROGMEM = {q_0, a_00, a_01, a_02, a_03, q_1, a_10, a_11, a_12, a_13};
-
-const byte numberOfQuestions = sizeof(qa)/10;
-
-char* getQA(byte qaNumber) {
-  return buffer;
-}
+const unsigned long remoteOne = 0x1fe807f;
+const unsigned long remoteTwo = 0x1fe40bf;
+const unsigned long remoteThree = 0x1fec03f;
+const unsigned long remoteFour = 0x1fe20df;

// Scrolling class

@@ 195,6 174,72 @@ class Scroller {
};

+char buffer[256]; // Maximum length of any question or answer.
+
+const char q_0[] PROGMEM = "What is the number of electrons going through the normal section of a wire whose current is 0.2 A during 16 s?";
+const char a_00[] PROGMEM = "Answer 1: 10^16";
+const char a_01[] PROGMEM = "Answer 2: 10^19";
+const char a_02[] PROGMEM = "Answer 3: 1.6 * 10^19";
+const char a_03[] PROGMEM = "Answer 4: 2.0 * 10^19";
+
+const char q_1[] PROGMEM = "A particle's trajectory is given by the parametric equations x = t, y = t^2 / 2. What is its curvature radius?";
+const char a_10[] PROGMEM = "Answer 1: (1+t^2)^(3/2)";
+const char a_11[] PROGMEM = "Answer 2: (1+t^3)^(1/2)";
+const char a_12[] PROGMEM = "Answer 3: (1+t)^(3/2)";
+const char a_13[] PROGMEM = "Answer 4: (1+t)^(1/2)";
+
+const char* const qa[] PROGMEM = {q_0, a_00, a_01, a_02, a_03, q_1, a_10, a_11, a_12, a_13};
+
+const byte correctAnswers[] = {3, 0};
+
+const byte numberOfQuestions = sizeof(qa)/10;
+
+char* getQA(byte qaNumber) {
+  return buffer;
+}
+
+Scroller currentQA(getQA(qaCounter), 'H');
+
+void isCorrect(byte ans) {
+  unsigned short confirmationDelay = 1000;
+  if (ans == correctAnswers[questionCounter]) {
+    questionCounter++;
+    if (questionCounter >= numberOfQuestions) {
+      questionCounter = 0;
+    }
+    qaCounter = 5*questionCounter;
+    currentQA.reset(getQA(qaCounter));
+    #ifdef _DEBUG
+    #endif
+    lcd.clear();
+    lcd.print(F("Correct!"));
+    lcd.setCursor(0,1);
+    lcd.print(F("Go for the next!"));
+    tone(8, 392, 160);
+    delay(160);
+    tone(8, 523, 400);
+    delay(confirmationDelay);
+    lcd.clear();
+  } else {
+    #ifdef _DEBUG
+    #endif
+    lcd.clear();
+    lcd.setCursor(0,1);
+    lcd.print(F("Keep trying!"));
+    tone(8, 196, 160);
+    delay(160);
+    tone(8, 65, 400);
+    delay(confirmationDelay);
+    lcd.clear();
+  }
+}
+
+
// Interruption-related functions
void detectMotion() {
motion = true;

@@ 212,9 257,6 @@ void updateActiveMillis() {

-// Set-up
-Scroller currentQA(getQA(qaCounter), 'H');
-
void setup() {
pinMode(motionPin, INPUT);
attachInterrupt(digitalPinToInterrupt(motionPin), detectMotion, RISING);

@@ 280,7 322,7 @@ void loop() {
case 4:
lcd.backlight();
lcd.setCursor(0, 0);
-          lcd.print("Hello!");
+          lcd.print(F("Hello!"));
screenStep = 2000;
screenCounter++;
prevScreenMillis = millis();

@@ 305,19 347,19 @@ void loop() {
if (!(currentQA.completelyDisplayed)) {
currentQA.scroll();
#ifdef _DEBUG
-        Serial.println("scroll");
+        Serial.println(F("Scrolling message"));
#endif
} else {
qaCounter++;
if (qaCounter >= 5*(questionCounter+1)) {
qaCounter = 5*questionCounter;
#ifdef _DEBUG
-          Serial.println("qaCounter overflow");
+          Serial.println(F("Variable qaCounter overflowed > restarted"));
#endif
}
currentQA.reset(getQA(qaCounter));
#ifdef _DEBUG
-        Serial.println("QAreset");
+        Serial.println(F("Scrolling class reset with new message"));
#endif
}
if (irrecv.decode(&results)) {

@@ 330,6 372,22 @@ void loop() {
currentQA.pauseOrResume();
updateActiveMillis();
break;
+          case remoteOne:
+            isCorrect(0);
+            updateActiveMillis();
+            break;
+          case remoteTwo:
+            isCorrect(1);
+            updateActiveMillis();
+            break;
+          case remoteThree:
+            isCorrect(2);
+            updateActiveMillis();
+            break;
+          case remoteFour:
+            isCorrect(3);
+            updateActiveMillis();
+            break;
}
irrecv.resume();
}

```