Display text on screen.

Dependencies:   TextLCD mbed MaxSonar RTC-DS1307

Fork of TextLCD_HelloWorld by Simon Ford

Committer:
aueangpanit
Date:
Thu May 25 09:15:49 2017 +0000
Revision:
8:8ce2ab8191cf
Parent:
7:f00ddf85cacc
Child:
9:39190ed25585
Working multi-choice quiz

Who changed what in which revision?

UserRevisionLine numberNew contents of line
simon 1:7418a52375a0 1 // Hello World! for the TextLCD
simon 1:7418a52375a0 2
simon 0:334327d1a416 3 #include "mbed.h"
aueangpanit 4:c669026b6f6e 4 #include <string>
simon 0:334327d1a416 5 #include "TextLCD.h"
aueangpanit 5:2f13ec8efe0b 6 #include "MaxSonar.h"
aueangpanit 5:2f13ec8efe0b 7 using std::string;
simon 0:334327d1a416 8
aueangpanit 3:5e0ba6e35849 9 TextLCD lcd(PTE30, PTE29, PTE23, PTE22, PTE21, PTE20); // rs, e, d4-d7
aueangpanit 3:5e0ba6e35849 10
aueangpanit 7:f00ddf85cacc 11 DigitalOut questionScreen(PTE3);
aueangpanit 4:c669026b6f6e 12 DigitalOut screen1(PTE5);
aueangpanit 4:c669026b6f6e 13 DigitalOut screen2(PTE4);
aueangpanit 4:c669026b6f6e 14
aueangpanit 4:c669026b6f6e 15 void UpdateScreen(DigitalOut screen, string text);
aueangpanit 5:2f13ec8efe0b 16 void UpdateScreen(DigitalOut screen, char text[1024]);
aueangpanit 8:8ce2ab8191cf 17 void DisplayNewQuestion();
aueangpanit 8:8ce2ab8191cf 18 bool CheckCorrect(int screenNumber);
aueangpanit 8:8ce2ab8191cf 19
aueangpanit 8:8ce2ab8191cf 20 string questions[4] = {"What is 2*2?",
aueangpanit 8:8ce2ab8191cf 21 "What is 5*2?",
aueangpanit 8:8ce2ab8191cf 22 "what is 2+2?",
aueangpanit 8:8ce2ab8191cf 23 "What is 5*4?"};
aueangpanit 8:8ce2ab8191cf 24
aueangpanit 8:8ce2ab8191cf 25 string screen1Answers[4] = {"4 ", "10 ", "5 ", "18 "};
aueangpanit 8:8ce2ab8191cf 26 string screen2Answers[4] = {"5 ", "8 ", "4 ", "20 "};
aueangpanit 8:8ce2ab8191cf 27 int correctScreen[4] = {1, 1, 2, 2}; //1 = screen1; 2 = screen2;
aueangpanit 8:8ce2ab8191cf 28
aueangpanit 8:8ce2ab8191cf 29 int questionCount = 0;
simon 0:334327d1a416 30
simon 0:334327d1a416 31 int main() {
aueangpanit 8:8ce2ab8191cf 32 UpdateScreen(screen2, "Hello!");
aueangpanit 5:2f13ec8efe0b 33
aueangpanit 5:2f13ec8efe0b 34 MaxSonar *range1;
aueangpanit 5:2f13ec8efe0b 35 float r1;
aueangpanit 6:fa30f8383b99 36
aueangpanit 6:fa30f8383b99 37 MaxSonar *range2;
aueangpanit 6:fa30f8383b99 38 float r2;
aueangpanit 5:2f13ec8efe0b 39
aueangpanit 5:2f13ec8efe0b 40 // Create and configure object for 3.3V powered LV-series device,
aueangpanit 5:2f13ec8efe0b 41 // accessed with analog reads (in cm) on p16, triggered by p7.
aueangpanit 5:2f13ec8efe0b 42 range1 = new MaxSonar(MS_LV, MS_ANALOG, PTB8, PTC2);
aueangpanit 5:2f13ec8efe0b 43 range1->setVoltage(3.3);
aueangpanit 5:2f13ec8efe0b 44 range1->setUnits(MS_CM);
aueangpanit 5:2f13ec8efe0b 45
aueangpanit 6:fa30f8383b99 46 range2 = new MaxSonar(MS_LV, MS_ANALOG, PTB9, PTB3);
aueangpanit 6:fa30f8383b99 47 range2->setVoltage(3.3);
aueangpanit 6:fa30f8383b99 48 range2->setUnits(MS_CM);
aueangpanit 5:2f13ec8efe0b 49
aueangpanit 5:2f13ec8efe0b 50 while(1) {
aueangpanit 5:2f13ec8efe0b 51 // Trigger read, wait 49ms until ranger finder has
aueangpanit 5:2f13ec8efe0b 52 // finished, then read.
aueangpanit 5:2f13ec8efe0b 53 range1->triggerRead();
aueangpanit 5:2f13ec8efe0b 54 wait_ms(49);
aueangpanit 5:2f13ec8efe0b 55 r1 = range1->read();
aueangpanit 6:fa30f8383b99 56
aueangpanit 6:fa30f8383b99 57 range2->triggerRead();
aueangpanit 6:fa30f8383b99 58 wait_ms(49);
aueangpanit 6:fa30f8383b99 59 r2 = range2->read();
aueangpanit 5:2f13ec8efe0b 60
aueangpanit 8:8ce2ab8191cf 61 if(r1 < 20)
aueangpanit 8:8ce2ab8191cf 62 {
aueangpanit 8:8ce2ab8191cf 63 if(CheckCorrect(1))
aueangpanit 8:8ce2ab8191cf 64 {
aueangpanit 8:8ce2ab8191cf 65 UpdateScreen(questionScreen, "Correct!");
aueangpanit 8:8ce2ab8191cf 66 wait(1);
aueangpanit 8:8ce2ab8191cf 67 DisplayNewQuestion();
aueangpanit 8:8ce2ab8191cf 68 }
aueangpanit 8:8ce2ab8191cf 69 else
aueangpanit 8:8ce2ab8191cf 70 {
aueangpanit 8:8ce2ab8191cf 71 UpdateScreen(questionScreen, "Try Again!");
aueangpanit 8:8ce2ab8191cf 72 wait(1);
aueangpanit 8:8ce2ab8191cf 73 UpdateScreen(questionScreen, questions[questionCount]);
aueangpanit 8:8ce2ab8191cf 74 }
aueangpanit 8:8ce2ab8191cf 75 }
aueangpanit 8:8ce2ab8191cf 76 if(r2 < 20)
aueangpanit 8:8ce2ab8191cf 77 {
aueangpanit 8:8ce2ab8191cf 78 if(CheckCorrect(2))
aueangpanit 8:8ce2ab8191cf 79 {
aueangpanit 8:8ce2ab8191cf 80 UpdateScreen(questionScreen, "Correct!");
aueangpanit 8:8ce2ab8191cf 81 wait(1);
aueangpanit 8:8ce2ab8191cf 82 DisplayNewQuestion();
aueangpanit 8:8ce2ab8191cf 83 }
aueangpanit 8:8ce2ab8191cf 84 else
aueangpanit 8:8ce2ab8191cf 85 {
aueangpanit 8:8ce2ab8191cf 86 UpdateScreen(questionScreen, "Try Again!");
aueangpanit 8:8ce2ab8191cf 87 wait(1);
aueangpanit 8:8ce2ab8191cf 88 UpdateScreen(questionScreen, questions[questionCount]);
aueangpanit 8:8ce2ab8191cf 89 }
aueangpanit 8:8ce2ab8191cf 90 }
aueangpanit 8:8ce2ab8191cf 91
aueangpanit 8:8ce2ab8191cf 92 /*
aueangpanit 5:2f13ec8efe0b 93 // Print and delay 0.5s.
aueangpanit 6:fa30f8383b99 94 char range1_char_array[1024];
aueangpanit 6:fa30f8383b99 95 char range2_char_array[1024];
aueangpanit 6:fa30f8383b99 96 sprintf (range1_char_array, "Range: %.3f cm\n", r1);
aueangpanit 6:fa30f8383b99 97 sprintf (range2_char_array, "Range: %.3f cm\n", r2);
aueangpanit 7:f00ddf85cacc 98 UpdateScreen(questionScreen, range1_char_array);
aueangpanit 6:fa30f8383b99 99 UpdateScreen(screen2, range2_char_array);
aueangpanit 8:8ce2ab8191cf 100 */
aueangpanit 5:2f13ec8efe0b 101
aueangpanit 5:2f13ec8efe0b 102 wait(0.5);
aueangpanit 5:2f13ec8efe0b 103 }
aueangpanit 4:c669026b6f6e 104 }
aueangpanit 4:c669026b6f6e 105
aueangpanit 8:8ce2ab8191cf 106 void DisplayNewQuestion()
aueangpanit 8:8ce2ab8191cf 107 {
aueangpanit 8:8ce2ab8191cf 108 if(questionCount >= 3)
aueangpanit 8:8ce2ab8191cf 109 {
aueangpanit 8:8ce2ab8191cf 110 questionCount = 0;
aueangpanit 8:8ce2ab8191cf 111 }
aueangpanit 8:8ce2ab8191cf 112 else
aueangpanit 8:8ce2ab8191cf 113 {
aueangpanit 8:8ce2ab8191cf 114 questionCount++;
aueangpanit 8:8ce2ab8191cf 115 }
aueangpanit 8:8ce2ab8191cf 116
aueangpanit 8:8ce2ab8191cf 117 UpdateScreen(questionScreen, questions[questionCount]);
aueangpanit 8:8ce2ab8191cf 118 UpdateScreen(screen1, screen1Answers[questionCount]);
aueangpanit 8:8ce2ab8191cf 119 UpdateScreen(screen2, screen2Answers[questionCount]);
aueangpanit 8:8ce2ab8191cf 120 }
aueangpanit 8:8ce2ab8191cf 121
aueangpanit 8:8ce2ab8191cf 122 bool CheckCorrect(int screenNumber)
aueangpanit 8:8ce2ab8191cf 123 {
aueangpanit 8:8ce2ab8191cf 124 if(screenNumber == correctScreen[questionCount])
aueangpanit 8:8ce2ab8191cf 125 {
aueangpanit 8:8ce2ab8191cf 126 return true;
aueangpanit 8:8ce2ab8191cf 127 }
aueangpanit 8:8ce2ab8191cf 128 else
aueangpanit 8:8ce2ab8191cf 129 {
aueangpanit 8:8ce2ab8191cf 130 return false;
aueangpanit 8:8ce2ab8191cf 131 }
aueangpanit 8:8ce2ab8191cf 132 }
aueangpanit 8:8ce2ab8191cf 133
aueangpanit 4:c669026b6f6e 134 void UpdateScreen(DigitalOut screen, string text)
aueangpanit 4:c669026b6f6e 135 {
aueangpanit 4:c669026b6f6e 136 //disable all E pin for all screens
aueangpanit 8:8ce2ab8191cf 137 questionScreen = 0;
aueangpanit 4:c669026b6f6e 138 screen1 = 0;
aueangpanit 4:c669026b6f6e 139 screen2 = 0;
aueangpanit 4:c669026b6f6e 140
aueangpanit 4:c669026b6f6e 141 //enable E pin for the scrren that we want to update
aueangpanit 4:c669026b6f6e 142 screen = 1;
aueangpanit 4:c669026b6f6e 143
aueangpanit 5:2f13ec8efe0b 144 //convert text to char array
aueangpanit 5:2f13ec8efe0b 145 char text_char_array[1024];
aueangpanit 5:2f13ec8efe0b 146 strcpy(text_char_array, text.c_str());
aueangpanit 4:c669026b6f6e 147 //some weird behaviour after disabling the E pin once means that we need to update the screen several times for it to display properly
aueangpanit 5:2f13ec8efe0b 148 for(int i = 0; i < 10; i++)
aueangpanit 4:c669026b6f6e 149 {
aueangpanit 3:5e0ba6e35849 150 lcd.cls();
aueangpanit 4:c669026b6f6e 151 lcd.printf(text_char_array);
aueangpanit 3:5e0ba6e35849 152 }
aueangpanit 5:2f13ec8efe0b 153 }
aueangpanit 5:2f13ec8efe0b 154
aueangpanit 5:2f13ec8efe0b 155 void UpdateScreen(DigitalOut screen, char text[1024])
aueangpanit 5:2f13ec8efe0b 156 {
aueangpanit 5:2f13ec8efe0b 157 //disable all E pin for all screens
aueangpanit 8:8ce2ab8191cf 158 questionScreen = 0;
aueangpanit 5:2f13ec8efe0b 159 screen1 = 0;
aueangpanit 5:2f13ec8efe0b 160 screen2 = 0;
aueangpanit 4:c669026b6f6e 161
aueangpanit 5:2f13ec8efe0b 162 //enable E pin for the scrren that we want to update
aueangpanit 5:2f13ec8efe0b 163 screen = 1;
aueangpanit 4:c669026b6f6e 164
aueangpanit 5:2f13ec8efe0b 165 //some weird behaviour after disabling the E pin once means that we need to update the screen several times for it to display properly
aueangpanit 5:2f13ec8efe0b 166 for(int i = 0; i < 10; i++)
aueangpanit 5:2f13ec8efe0b 167 {
aueangpanit 5:2f13ec8efe0b 168 lcd.cls();
aueangpanit 5:2f13ec8efe0b 169 lcd.printf(text);
aueangpanit 5:2f13ec8efe0b 170 }
simon 0:334327d1a416 171 }