Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed MCP23017 mbed-rtos WattBob_TextLCD
main.cpp@10:5f6d15f8fc79, 2018-03-28 (annotated)
- Committer:
- Steaar
- Date:
- Wed Mar 28 13:36:53 2018 +0000
- Revision:
- 10:5f6d15f8fc79
- Parent:
- 9:c3c90e137cfb
- Child:
- 11:7a8cfd29b124
All functional
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Steaar | 0:1580a6dbd6a9 | 1 | #include "mbed.h" |
| Steaar | 0:1580a6dbd6a9 | 2 | #include "rtos.h" |
| Steaar | 0:1580a6dbd6a9 | 3 | |
| Steaar | 0:1580a6dbd6a9 | 4 | #include "MCP23017.h" |
| Steaar | 0:1580a6dbd6a9 | 5 | #include "WattBob_TextLCD.h" |
| Steaar | 0:1580a6dbd6a9 | 6 | |
| Steaar | 0:1580a6dbd6a9 | 7 | #define BACK_LIGHT_ON(INTERFACE) INTERFACE->write_bit(1,BL_BIT) |
| Steaar | 0:1580a6dbd6a9 | 8 | #define BACK_LIGHT_OFF(INTERFACE) INTERFACE->write_bit(0,BL_BIT) |
| Steaar | 0:1580a6dbd6a9 | 9 | |
| Steaar | 4:72c487215487 | 10 | MCP23017 *par_port; // pointer to 16-bit parallel I/O object |
| Steaar | 4:72c487215487 | 11 | WattBob_TextLCD *lcd; // pointer to 2*16 chacater LCD object |
| Steaar | 0:1580a6dbd6a9 | 12 | |
| Steaar | 10:5f6d15f8fc79 | 13 | AnalogIn accel(p15); // Analog in |
| Steaar | 0:1580a6dbd6a9 | 14 | AnalogIn brake(p16); |
| Steaar | 10:5f6d15f8fc79 | 15 | |
| Steaar | 10:5f6d15f8fc79 | 16 | float speed; // IO values |
| Steaar | 5:e62e0e3084fc | 17 | float kmph; |
| Steaar | 1:c2c4bd530112 | 18 | float aveSpeed; |
| Steaar | 5:e62e0e3084fc | 19 | float acc; |
| Steaar | 5:e62e0e3084fc | 20 | float br; |
| Steaar | 1:c2c4bd530112 | 21 | float distance = 0; |
| Steaar | 0:1580a6dbd6a9 | 22 | |
| Steaar | 4:72c487215487 | 23 | DigitalOut sideLights(LED1); // mbed out |
| Steaar | 1:c2c4bd530112 | 24 | DigitalOut lIndicator(LED2); |
| Steaar | 1:c2c4bd530112 | 25 | DigitalOut rIndicator(LED3); |
| Steaar | 0:1580a6dbd6a9 | 26 | DigitalOut engLight(LED4); |
| Steaar | 0:1580a6dbd6a9 | 27 | |
| Steaar | 4:72c487215487 | 28 | DigitalOut brakeLights(p6); // redbox out |
| Steaar | 0:1580a6dbd6a9 | 29 | DigitalOut fluxCapacitor(p7); |
| Steaar | 0:1580a6dbd6a9 | 30 | |
| Steaar | 10:5f6d15f8fc79 | 31 | DigitalIn engine(p5); // switches in |
| Steaar | 7:84c2156e1ace | 32 | DigitalIn lightSwitch(p8); |
| Steaar | 5:e62e0e3084fc | 33 | DigitalIn lIndicate(p11); |
| Steaar | 5:e62e0e3084fc | 34 | DigitalIn rIndicate(p12); |
| Steaar | 0:1580a6dbd6a9 | 35 | |
| Steaar | 10:5f6d15f8fc79 | 36 | int l, r, lr; // indicator values |
| Steaar | 7:84c2156e1ace | 37 | |
| Steaar | 4:72c487215487 | 38 | Serial pc(USBTX, USBRX); // serial tx, rx |
| Steaar | 2:51a06b9a52d1 | 39 | |
| Steaar | 10:5f6d15f8fc79 | 40 | Thread sp; // threads. Speed |
| Steaar | 1:c2c4bd530112 | 41 | Thread task1; |
| Steaar | 8:09b78bc5551f | 42 | Thread task246; |
| Steaar | 1:c2c4bd530112 | 43 | Thread task3; |
| Steaar | 8:09b78bc5551f | 44 | Thread task59; |
| Steaar | 1:c2c4bd530112 | 45 | Thread task7; |
| Steaar | 1:c2c4bd530112 | 46 | Thread task8; |
| Steaar | 1:c2c4bd530112 | 47 | Thread task10; |
| Steaar | 10:5f6d15f8fc79 | 48 | Thread indi; // indicators |
| Steaar | 1:c2c4bd530112 | 49 | |
| Steaar | 10:5f6d15f8fc79 | 50 | typedef struct { // mail |
| Steaar | 2:51a06b9a52d1 | 51 | float m_speed; |
| Steaar | 2:51a06b9a52d1 | 52 | float m_acc; |
| Steaar | 2:51a06b9a52d1 | 53 | float m_br; |
| Steaar | 2:51a06b9a52d1 | 54 | } mail_t; |
| Steaar | 2:51a06b9a52d1 | 55 | |
| Steaar | 2:51a06b9a52d1 | 56 | Mail<mail_t, 100> mail_box; |
| Steaar | 2:51a06b9a52d1 | 57 | |
| Steaar | 9:c3c90e137cfb | 58 | void acceleration() // 1. read brake and accelerator 10 |
| Steaar | 4:72c487215487 | 59 | { |
| Steaar | 4:72c487215487 | 60 | while (1) { |
| Steaar | 4:72c487215487 | 61 | acc = accel.read()*3.3; |
| Steaar | 4:72c487215487 | 62 | br = brake.read()*3.3; |
| Steaar | 9:c3c90e137cfb | 63 | |
| Steaar | 5:e62e0e3084fc | 64 | Thread::wait(100); |
| Steaar | 4:72c487215487 | 65 | } |
| Steaar | 4:72c487215487 | 66 | } |
| Steaar | 9:c3c90e137cfb | 67 | void getSpeed() // calculation for speed & distance thread 20 |
| Steaar | 4:72c487215487 | 68 | { |
| Steaar | 4:72c487215487 | 69 | while (1) { |
| Steaar | 9:c3c90e137cfb | 70 | speed = (acc - br)*16.835; // speed in m/s. Max = 55 |
| Steaar | 4:72c487215487 | 71 | if (speed < 0) { |
| Steaar | 4:72c487215487 | 72 | speed = 0; |
| Steaar | 4:72c487215487 | 73 | } |
| Steaar | 9:c3c90e137cfb | 74 | kmph = speed*3.6; // convert speed to km/ph. Change to *2.24 for ~mph |
| Steaar | 9:c3c90e137cfb | 75 | distance = distance + (speed*0.05)/1000; // distance = speed*time /1000 for m to km (/1609.34 for miles) |
| Steaar | 9:c3c90e137cfb | 76 | |
| Steaar | 5:e62e0e3084fc | 77 | Thread::wait(50); |
| Steaar | 4:72c487215487 | 78 | } |
| Steaar | 4:72c487215487 | 79 | } |
| Steaar | 9:c3c90e137cfb | 80 | void ignition() // 2. Read engine on/off show LED subroutine 2 |
| Steaar | 8:09b78bc5551f | 81 | { |
| Steaar | 9:c3c90e137cfb | 82 | if (engine.read() > 0) { |
| Steaar | 9:c3c90e137cfb | 83 | engLight = 1; |
| Steaar | 9:c3c90e137cfb | 84 | } else { |
| Steaar | 9:c3c90e137cfb | 85 | engLight = 0; |
| Steaar | 9:c3c90e137cfb | 86 | aveSpeed = 0; |
| Steaar | 10:5f6d15f8fc79 | 87 | acc = 0; |
| Steaar | 10:5f6d15f8fc79 | 88 | br = 0; |
| Steaar | 4:72c487215487 | 89 | } |
| Steaar | 4:72c487215487 | 90 | } |
| Steaar | 9:c3c90e137cfb | 91 | void speedo() // 3. Average last n speed readings thread 5 |
| Steaar | 4:72c487215487 | 92 | { |
| Steaar | 4:72c487215487 | 93 | while (1) { |
| Steaar | 4:72c487215487 | 94 | for (int i = 0; i<3; i++) { |
| Steaar | 9:c3c90e137cfb | 95 | aveSpeed = kmph + aveSpeed; // in km/h |
| Steaar | 4:72c487215487 | 96 | } |
| Steaar | 6:a026e0651ad5 | 97 | aveSpeed = aveSpeed/4; |
| Steaar | 4:72c487215487 | 98 | |
| Steaar | 4:72c487215487 | 99 | Thread::wait(200); |
| Steaar | 4:72c487215487 | 100 | } |
| Steaar | 4:72c487215487 | 101 | } |
| Steaar | 9:c3c90e137cfb | 102 | void braking() // 4. Brake indicated by LED subroutine 2 |
| Steaar | 1:c2c4bd530112 | 103 | { |
| Steaar | 9:c3c90e137cfb | 104 | if ( br > 0) { |
| Steaar | 9:c3c90e137cfb | 105 | brakeLights = 1; |
| Steaar | 9:c3c90e137cfb | 106 | } else { |
| Steaar | 9:c3c90e137cfb | 107 | brakeLights = 0; |
| Steaar | 0:1580a6dbd6a9 | 108 | } |
| Steaar | 0:1580a6dbd6a9 | 109 | } |
| Steaar | 9:c3c90e137cfb | 110 | void greatScott() // 5. if speed > 88 LED on subroutine 1 |
| Steaar | 8:09b78bc5551f | 111 | { |
| Steaar | 9:c3c90e137cfb | 112 | if (kmph > 141.6) { // 141.6 km = 88 miles |
| Steaar | 9:c3c90e137cfb | 113 | fluxCapacitor = 1; |
| Steaar | 9:c3c90e137cfb | 114 | } else { |
| Steaar | 9:c3c90e137cfb | 115 | fluxCapacitor = 0; |
| Steaar | 8:09b78bc5551f | 116 | } |
| Steaar | 8:09b78bc5551f | 117 | } |
| Steaar | 9:c3c90e137cfb | 118 | void LCD() // 6. display odometer and speed subroutine 2 |
| Steaar | 9:c3c90e137cfb | 119 | { |
| Steaar | 9:c3c90e137cfb | 120 | lcd->locate(0,0); |
| Steaar | 9:c3c90e137cfb | 121 | lcd->printf("KM:%0.1f",distance); |
| Steaar | 9:c3c90e137cfb | 122 | lcd->locate(1,0); |
| Steaar | 9:c3c90e137cfb | 123 | lcd->printf("KM/H:%.1f",aveSpeed); |
| Steaar | 9:c3c90e137cfb | 124 | } |
| Steaar | 9:c3c90e137cfb | 125 | void send_thread (void) // 7. speed, acc, brake MAILq thread 0.2 |
| Steaar | 8:09b78bc5551f | 126 | { |
| Steaar | 8:09b78bc5551f | 127 | while (true) { |
| Steaar | 8:09b78bc5551f | 128 | mail_t *mail = mail_box.alloc(); |
| Steaar | 10:5f6d15f8fc79 | 129 | mail->m_speed = aveSpeed; |
| Steaar | 8:09b78bc5551f | 130 | mail->m_acc = acc; |
| Steaar | 8:09b78bc5551f | 131 | mail->m_br = br; |
| Steaar | 8:09b78bc5551f | 132 | mail_box.put(mail); |
| Steaar | 8:09b78bc5551f | 133 | |
| Steaar | 8:09b78bc5551f | 134 | Thread::wait(5000); |
| Steaar | 8:09b78bc5551f | 135 | } |
| Steaar | 8:09b78bc5551f | 136 | } |
| Steaar | 10:5f6d15f8fc79 | 137 | void toSerial() // 8. MAILq to serial PC thread 0.05 |
| Steaar | 8:09b78bc5551f | 138 | { |
| Steaar | 8:09b78bc5551f | 139 | while (1) { |
| Steaar | 8:09b78bc5551f | 140 | osEvent evt = mail_box.get(); |
| Steaar | 8:09b78bc5551f | 141 | mail_t *mail = (mail_t*)evt.value.p; |
| Steaar | 8:09b78bc5551f | 142 | pc.printf("\nSpeed: %.2f \n\r", mail->m_speed); |
| Steaar | 8:09b78bc5551f | 143 | pc.printf("Acceleration: %.2f \n\r", mail->m_acc); |
| Steaar | 8:09b78bc5551f | 144 | pc.printf("Braking: %.2f \n\r", mail->m_br); |
| Steaar | 9:c3c90e137cfb | 145 | |
| Steaar | 8:09b78bc5551f | 146 | Thread::wait(20000); |
| Steaar | 8:09b78bc5551f | 147 | } |
| Steaar | 8:09b78bc5551f | 148 | } |
| Steaar | 9:c3c90e137cfb | 149 | void lights() // 9. set side lights subroutine 1 |
| Steaar | 9:c3c90e137cfb | 150 | { |
| Steaar | 10:5f6d15f8fc79 | 151 | if (lightSwitch.read() == 1) { // If light switch on |
| Steaar | 10:5f6d15f8fc79 | 152 | sideLights = 1; // turn on side lights |
| Steaar | 9:c3c90e137cfb | 153 | } else { |
| Steaar | 9:c3c90e137cfb | 154 | sideLights = 0; |
| Steaar | 9:c3c90e137cfb | 155 | } |
| Steaar | 9:c3c90e137cfb | 156 | } |
| Steaar | 9:c3c90e137cfb | 157 | void indicators() // 10. check indicators thread 0.5 |
| Steaar | 1:c2c4bd530112 | 158 | { |
| Steaar | 1:c2c4bd530112 | 159 | while (1) { |
| Steaar | 7:84c2156e1ace | 160 | |
| Steaar | 4:72c487215487 | 161 | if ((lIndicate == 1) && (rIndicate == 1)) { // If both switch on |
| Steaar | 7:84c2156e1ace | 162 | lr = 1; // both LED at 2Hz |
| Steaar | 7:84c2156e1ace | 163 | } else if ((lIndicate == 1) && (rIndicate == 0)) { // if left switch on |
| Steaar | 7:84c2156e1ace | 164 | l = 1; // left LED at 1Hz |
| Steaar | 7:84c2156e1ace | 165 | r = 0; |
| Steaar | 7:84c2156e1ace | 166 | lr = 0; |
| Steaar | 7:84c2156e1ace | 167 | } else if ((lIndicate == 0) && (rIndicate == 1)) { // if right switch on |
| Steaar | 7:84c2156e1ace | 168 | r = 1; // right LED at 1Hz |
| Steaar | 7:84c2156e1ace | 169 | l = 0; |
| Steaar | 7:84c2156e1ace | 170 | lr = 0; |
| Steaar | 7:84c2156e1ace | 171 | } else if ((lIndicate == 0) && (rIndicate == 0)) { // both off |
| Steaar | 7:84c2156e1ace | 172 | r = 0; |
| Steaar | 7:84c2156e1ace | 173 | l = 0; |
| Steaar | 7:84c2156e1ace | 174 | lr = 0; |
| Steaar | 1:c2c4bd530112 | 175 | } |
| Steaar | 1:c2c4bd530112 | 176 | |
| Steaar | 1:c2c4bd530112 | 177 | Thread::wait(2000); |
| Steaar | 0:1580a6dbd6a9 | 178 | } |
| Steaar | 0:1580a6dbd6a9 | 179 | } |
| Steaar | 4:72c487215487 | 180 | |
| Steaar | 7:84c2156e1ace | 181 | void indicate() // flash indicators |
| Steaar | 7:84c2156e1ace | 182 | { |
| Steaar | 7:84c2156e1ace | 183 | while (1) { |
| Steaar | 7:84c2156e1ace | 184 | int x = 1000; |
| Steaar | 7:84c2156e1ace | 185 | if (lr == 1) { // If both switch on |
| Steaar | 7:84c2156e1ace | 186 | lIndicator = !lIndicator; // both LED at 2Hz |
| Steaar | 7:84c2156e1ace | 187 | rIndicator = !rIndicator; |
| Steaar | 7:84c2156e1ace | 188 | x = 500; |
| Steaar | 7:84c2156e1ace | 189 | } else if (l == 1) { // if left switch on |
| Steaar | 7:84c2156e1ace | 190 | lIndicator = !lIndicator; // left LED at 1Hz |
| Steaar | 7:84c2156e1ace | 191 | rIndicator = 0; |
| Steaar | 7:84c2156e1ace | 192 | x = 1000; |
| Steaar | 7:84c2156e1ace | 193 | } else if (r == 1) { // if right switch on |
| Steaar | 7:84c2156e1ace | 194 | rIndicator = !rIndicator; // right LED at 1Hz |
| Steaar | 7:84c2156e1ace | 195 | lIndicator = 0; |
| Steaar | 7:84c2156e1ace | 196 | x = 1000; |
| Steaar | 7:84c2156e1ace | 197 | } |
| Steaar | 7:84c2156e1ace | 198 | |
| Steaar | 7:84c2156e1ace | 199 | Thread::wait(x); |
| Steaar | 7:84c2156e1ace | 200 | } |
| Steaar | 7:84c2156e1ace | 201 | } |
| Steaar | 9:c3c90e137cfb | 202 | void t59() // thread for 5 & 9 1Hz |
| Steaar | 9:c3c90e137cfb | 203 | { |
| Steaar | 9:c3c90e137cfb | 204 | while (1) { |
| Steaar | 9:c3c90e137cfb | 205 | greatScott(); |
| Steaar | 9:c3c90e137cfb | 206 | lights(); |
| Steaar | 7:84c2156e1ace | 207 | |
| Steaar | 9:c3c90e137cfb | 208 | Thread::wait(1000); |
| Steaar | 9:c3c90e137cfb | 209 | } |
| Steaar | 9:c3c90e137cfb | 210 | } |
| Steaar | 9:c3c90e137cfb | 211 | void t246() // thread for 2, 4, & 6 2Hz |
| Steaar | 9:c3c90e137cfb | 212 | { |
| Steaar | 9:c3c90e137cfb | 213 | while (1) { |
| Steaar | 9:c3c90e137cfb | 214 | ignition(); |
| Steaar | 9:c3c90e137cfb | 215 | LCD(); |
| Steaar | 9:c3c90e137cfb | 216 | braking(); |
| Steaar | 9:c3c90e137cfb | 217 | |
| Steaar | 9:c3c90e137cfb | 218 | Thread::wait(500); |
| Steaar | 9:c3c90e137cfb | 219 | } |
| Steaar | 9:c3c90e137cfb | 220 | } |
| Steaar | 0:1580a6dbd6a9 | 221 | |
| Steaar | 0:1580a6dbd6a9 | 222 | int main() |
| Steaar | 0:1580a6dbd6a9 | 223 | { |
| Steaar | 0:1580a6dbd6a9 | 224 | par_port = new MCP23017(p9, p10, 0x40); // initialise 16-bit I/O chip |
| Steaar | 0:1580a6dbd6a9 | 225 | lcd = new WattBob_TextLCD(par_port); // initialise 2*26 char display |
| Steaar | 0:1580a6dbd6a9 | 226 | par_port->write_bit(1,BL_BIT); // turn LCD backlight ON |
| Steaar | 9:c3c90e137cfb | 227 | //Hz |
| Steaar | 9:c3c90e137cfb | 228 | sp.start(getSpeed); //20 |
| Steaar | 9:c3c90e137cfb | 229 | task1.start(acceleration); //10 |
| Steaar | 9:c3c90e137cfb | 230 | task246.start(t246); //2 |
| Steaar | 9:c3c90e137cfb | 231 | task3.start(speedo); //5 |
| Steaar | 9:c3c90e137cfb | 232 | task59.start(t59); //1 |
| Steaar | 8:09b78bc5551f | 233 | task7.start(callback(send_thread)); //0.2 |
| Steaar | 8:09b78bc5551f | 234 | task8.start(toSerial); //0.05 |
| Steaar | 9:c3c90e137cfb | 235 | task10.start(indicators); //0.5 |
| Steaar | 9:c3c90e137cfb | 236 | indi.start(indicate); // 1-2 |
| Steaar | 5:e62e0e3084fc | 237 | |
| Steaar | 0:1580a6dbd6a9 | 238 | } |
| Steaar | 0:1580a6dbd6a9 | 239 | |
| Steaar | 0:1580a6dbd6a9 | 240 | |
| Steaar | 1:c2c4bd530112 | 241 |