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.
FinalV1/ColourSensor.cpp@0:270ea1abdd2d, 2019-03-21 (annotated)
- Committer:
- Nicolaemf
- Date:
- Thu Mar 21 19:43:09 2019 +0000
- Revision:
- 0:270ea1abdd2d
Final Code implementation;
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| Nicolaemf | 0:270ea1abdd2d | 1 | // ColourSensor.cpp |
| Nicolaemf | 0:270ea1abdd2d | 2 | |
| Nicolaemf | 0:270ea1abdd2d | 3 | #include "ColourSensor_H.h" |
| Nicolaemf | 0:270ea1abdd2d | 4 | #include "mbed.h" |
| Nicolaemf | 0:270ea1abdd2d | 5 | |
| Nicolaemf | 0:270ea1abdd2d | 6 | ColourSensor::ColourSensor(PinName sensor1, PinName sensor2, PinName Out): |
| Nicolaemf | 0:270ea1abdd2d | 7 | inOne(sensor1), inTwo(sensor2), solenoid(Out) { |
| Nicolaemf | 0:270ea1abdd2d | 8 | // Class constructor for colour sensor & solenoid |
| Nicolaemf | 0:270ea1abdd2d | 9 | // Sets initial conditions of operation |
| Nicolaemf | 0:270ea1abdd2d | 10 | |
| Nicolaemf | 0:270ea1abdd2d | 11 | initialConditions(); |
| Nicolaemf | 0:270ea1abdd2d | 12 | } |
| Nicolaemf | 0:270ea1abdd2d | 13 | |
| Nicolaemf | 0:270ea1abdd2d | 14 | void ColourSensor::initialConditions() { |
| Nicolaemf | 0:270ea1abdd2d | 15 | // set initial conditions & variables |
| Nicolaemf | 0:270ea1abdd2d | 16 | //printf("Setting Initial Conditions\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 17 | sensorOne = inOne.read(); |
| Nicolaemf | 0:270ea1abdd2d | 18 | sensorOneOld = inOne.read(); |
| Nicolaemf | 0:270ea1abdd2d | 19 | sensorOneCheck = inOne.read(); |
| Nicolaemf | 0:270ea1abdd2d | 20 | sensorTwo = inTwo.read(); |
| Nicolaemf | 0:270ea1abdd2d | 21 | sensorTwoOld = inTwo.read(); |
| Nicolaemf | 0:270ea1abdd2d | 22 | sensorTwoCheck = inTwo.read(); |
| Nicolaemf | 0:270ea1abdd2d | 23 | |
| Nicolaemf | 0:270ea1abdd2d | 24 | |
| Nicolaemf | 0:270ea1abdd2d | 25 | newDetection = 0; |
| Nicolaemf | 0:270ea1abdd2d | 26 | diskHave = 0; |
| Nicolaemf | 0:270ea1abdd2d | 27 | |
| Nicolaemf | 0:270ea1abdd2d | 28 | solenoidState = 0; |
| Nicolaemf | 0:270ea1abdd2d | 29 | |
| Nicolaemf | 0:270ea1abdd2d | 30 | toggleA = 0; |
| Nicolaemf | 0:270ea1abdd2d | 31 | toggleB = 0; |
| Nicolaemf | 0:270ea1abdd2d | 32 | toggleC = 0; |
| Nicolaemf | 0:270ea1abdd2d | 33 | toggleConst = 1; |
| Nicolaemf | 0:270ea1abdd2d | 34 | |
| Nicolaemf | 0:270ea1abdd2d | 35 | flagColour = 0; |
| Nicolaemf | 0:270ea1abdd2d | 36 | |
| Nicolaemf | 0:270ea1abdd2d | 37 | solenoidSet(0); |
| Nicolaemf | 0:270ea1abdd2d | 38 | } |
| Nicolaemf | 0:270ea1abdd2d | 39 | |
| Nicolaemf | 0:270ea1abdd2d | 40 | void ColourSensor::solenoidOn() { |
| Nicolaemf | 0:270ea1abdd2d | 41 | // Interrupt (software): Turn ON solenoid |
| Nicolaemf | 0:270ea1abdd2d | 42 | //printf("Turning solenoid back ON\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 43 | |
| Nicolaemf | 0:270ea1abdd2d | 44 | solenoidSet(0); |
| Nicolaemf | 0:270ea1abdd2d | 45 | } |
| Nicolaemf | 0:270ea1abdd2d | 46 | |
| Nicolaemf | 0:270ea1abdd2d | 47 | void ColourSensor::solenoidSet(bool state) { |
| Nicolaemf | 0:270ea1abdd2d | 48 | // Turns solenoid on/off, sets solenoid's pull strength |
| Nicolaemf | 0:270ea1abdd2d | 49 | // state: pass 1 or 0 for solenoid ON or OFF respectively |
| Nicolaemf | 0:270ea1abdd2d | 50 | |
| Nicolaemf | 0:270ea1abdd2d | 51 | solenoid.write(state); |
| Nicolaemf | 0:270ea1abdd2d | 52 | |
| Nicolaemf | 0:270ea1abdd2d | 53 | //printf("Solenoid has been set to %i\n\r", state); |
| Nicolaemf | 0:270ea1abdd2d | 54 | |
| Nicolaemf | 0:270ea1abdd2d | 55 | solenoidState = state; |
| Nicolaemf | 0:270ea1abdd2d | 56 | } |
| Nicolaemf | 0:270ea1abdd2d | 57 | |
| Nicolaemf | 0:270ea1abdd2d | 58 | void ColourSensor::readSensor() { |
| Nicolaemf | 0:270ea1abdd2d | 59 | // Interrupt function (software): reads in colour detection state |
| Nicolaemf | 0:270ea1abdd2d | 60 | |
| Nicolaemf | 0:270ea1abdd2d | 61 | // Update variables |
| Nicolaemf | 0:270ea1abdd2d | 62 | sensorOneOld = sensorOne; |
| Nicolaemf | 0:270ea1abdd2d | 63 | sensorTwoOld = sensorTwo; |
| Nicolaemf | 0:270ea1abdd2d | 64 | |
| Nicolaemf | 0:270ea1abdd2d | 65 | //printf("Reading colour detection state\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 66 | |
| Nicolaemf | 0:270ea1abdd2d | 67 | sensorOne = inOne.read(); |
| Nicolaemf | 0:270ea1abdd2d | 68 | sensorTwo = inTwo.read(); |
| Nicolaemf | 0:270ea1abdd2d | 69 | |
| Nicolaemf | 0:270ea1abdd2d | 70 | toggleA = 1; |
| Nicolaemf | 0:270ea1abdd2d | 71 | } |
| Nicolaemf | 0:270ea1abdd2d | 72 | |
| Nicolaemf | 0:270ea1abdd2d | 73 | void ColourSensor::convert() { |
| Nicolaemf | 0:270ea1abdd2d | 74 | // Converts sensor logic to sensible logic |
| Nicolaemf | 0:270ea1abdd2d | 75 | |
| Nicolaemf | 0:270ea1abdd2d | 76 | sensorIfOld = sensorIf; // Transfer variable states |
| Nicolaemf | 0:270ea1abdd2d | 77 | newDetection = 0; |
| Nicolaemf | 0:270ea1abdd2d | 78 | |
| Nicolaemf | 0:270ea1abdd2d | 79 | sensorIf = !(sensorOne xor sensorTwo); |
| Nicolaemf | 0:270ea1abdd2d | 80 | |
| Nicolaemf | 0:270ea1abdd2d | 81 | if(sensorIf && !sensorIfOld) { |
| Nicolaemf | 0:270ea1abdd2d | 82 | sensorColour = sensorOne & sensorTwo; |
| Nicolaemf | 0:270ea1abdd2d | 83 | newDetection = 1; |
| Nicolaemf | 0:270ea1abdd2d | 84 | toggleB = 1; |
| Nicolaemf | 0:270ea1abdd2d | 85 | } |
| Nicolaemf | 0:270ea1abdd2d | 86 | if(!diskHave)solenoidSet(0); |
| Nicolaemf | 0:270ea1abdd2d | 87 | } |
| Nicolaemf | 0:270ea1abdd2d | 88 | |
| Nicolaemf | 0:270ea1abdd2d | 89 | void ColourSensor::ColourCheck(){ |
| Nicolaemf | 0:270ea1abdd2d | 90 | sensorOneCheck = inOne.read(); |
| Nicolaemf | 0:270ea1abdd2d | 91 | sensorTwoCheck = inTwo.read(); |
| Nicolaemf | 0:270ea1abdd2d | 92 | bool sensorColourCheck = sensorOneCheck & sensorTwoCheck; |
| Nicolaemf | 0:270ea1abdd2d | 93 | if( sensorColour == sensorColourCheck )toggleC = 1; |
| Nicolaemf | 0:270ea1abdd2d | 94 | else toggleB = 0; |
| Nicolaemf | 0:270ea1abdd2d | 95 | |
| Nicolaemf | 0:270ea1abdd2d | 96 | } |
| Nicolaemf | 0:270ea1abdd2d | 97 | |
| Nicolaemf | 0:270ea1abdd2d | 98 | |
| Nicolaemf | 0:270ea1abdd2d | 99 | |
| Nicolaemf | 0:270ea1abdd2d | 100 | |
| Nicolaemf | 0:270ea1abdd2d | 101 | |
| Nicolaemf | 0:270ea1abdd2d | 102 | void ColourSensor::makeColourActive() { |
| Nicolaemf | 0:270ea1abdd2d | 103 | // Interrupt function (software): reactivates colour processing |
| Nicolaemf | 0:270ea1abdd2d | 104 | toggleConst = 1; |
| Nicolaemf | 0:270ea1abdd2d | 105 | |
| Nicolaemf | 0:270ea1abdd2d | 106 | //printf("Colour processing Activated\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 107 | } |
| Nicolaemf | 0:270ea1abdd2d | 108 | |
| Nicolaemf | 0:270ea1abdd2d | 109 | void ColourSensor::process() { |
| Nicolaemf | 0:270ea1abdd2d | 110 | // Processes change of state in colour detection |
| Nicolaemf | 0:270ea1abdd2d | 111 | //printf("Colour process() called\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 112 | |
| Nicolaemf | 0:270ea1abdd2d | 113 | if (!diskHave && newDetection) { |
| Nicolaemf | 0:270ea1abdd2d | 114 | // If: No disk & colour newly detected, turn on solenoid |
| Nicolaemf | 0:270ea1abdd2d | 115 | //printf("Colour detected; collecting disk\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 116 | |
| Nicolaemf | 0:270ea1abdd2d | 117 | solenoidSet(1); |
| Nicolaemf | 0:270ea1abdd2d | 118 | diskHave = 1; |
| Nicolaemf | 0:270ea1abdd2d | 119 | diskColour = sensorColour; |
| Nicolaemf | 0:270ea1abdd2d | 120 | } |
| Nicolaemf | 0:270ea1abdd2d | 121 | |
| Nicolaemf | 0:270ea1abdd2d | 122 | else if ((diskHave && newDetection) && (diskColour == sensorColour)) { |
| Nicolaemf | 0:270ea1abdd2d | 123 | // If: Have disk & colour newly detected & disk colour is same as detected colour, turn off solenoid |
| Nicolaemf | 0:270ea1abdd2d | 124 | //printf("Correct colour detected; depositing disk\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 125 | |
| Nicolaemf | 0:270ea1abdd2d | 126 | solenoidSet(0); |
| Nicolaemf | 0:270ea1abdd2d | 127 | flagColour = 1; |
| Nicolaemf | 0:270ea1abdd2d | 128 | diskHave = 0; |
| Nicolaemf | 0:270ea1abdd2d | 129 | } |
| Nicolaemf | 0:270ea1abdd2d | 130 | |
| Nicolaemf | 0:270ea1abdd2d | 131 | /*else if ((diskHave && newDetection) && (sensorTwo != diskColour)) { |
| Nicolaemf | 0:270ea1abdd2d | 132 | // If: Have disk & colour newly detected & disk colour is NOT same as detected colour, update variables |
| Nicolaemf | 0:270ea1abdd2d | 133 | //printf("Wrong colour detected; keeping disk\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 134 | }*/ |
| Nicolaemf | 0:270ea1abdd2d | 135 | |
| Nicolaemf | 0:270ea1abdd2d | 136 | else { |
| Nicolaemf | 0:270ea1abdd2d | 137 | //printf("Cool (y)\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 138 | } |
| Nicolaemf | 0:270ea1abdd2d | 139 | |
| Nicolaemf | 0:270ea1abdd2d | 140 | // Temporarily disable colour processing |
| Nicolaemf | 0:270ea1abdd2d | 141 | //printf("Disabling colour processing\n\r"); |
| Nicolaemf | 0:270ea1abdd2d | 142 | toggleConst = 0; |
| Nicolaemf | 0:270ea1abdd2d | 143 | toggleC = 0; |
| Nicolaemf | 0:270ea1abdd2d | 144 | } |