Working laser maze comparator. Solar cells need to be connected with ground and the +ve line connected to A0 - A4. These correspond to the output on D6-D2 respectively. Reseting the nucleo takes a base reading of the solar cells. This base reading is used, along with the #define OFFSET value to either output a 0 or a 1 if the solar cell value is over the first reading + offset.
main.cpp@2:87c34bb330c2, 2018-11-29 (annotated)
- Committer:
- ADIJake
- Date:
- Thu Nov 29 12:43:39 2018 +0000
- Revision:
- 2:87c34bb330c2
- Parent:
- 1:59475336cb66
Comparator for the Lazer maze game;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ADIJake | 0:465fb31c5651 | 1 | #include "mbed.h" |
ADIJake | 0:465fb31c5651 | 2 | |
ADIJake | 0:465fb31c5651 | 3 | #define CHANNEL_COUNT 5 |
ADIJake | 0:465fb31c5651 | 4 | #define OFFSET 200 //mV |
ADIJake | 0:465fb31c5651 | 5 | |
ADIJake | 0:465fb31c5651 | 6 | //initial values + offset for thresholds |
ADIJake | 0:465fb31c5651 | 7 | float initialValues[CHANNEL_COUNT]; |
ADIJake | 0:465fb31c5651 | 8 | |
ADIJake | 0:465fb31c5651 | 9 | //analog in channels for reading solar cells |
ADIJake | 0:465fb31c5651 | 10 | AnalogIn Ain0(A0); |
ADIJake | 0:465fb31c5651 | 11 | AnalogIn Ain1(A1); |
ADIJake | 0:465fb31c5651 | 12 | AnalogIn Ain2(A2); |
ADIJake | 0:465fb31c5651 | 13 | AnalogIn Ain3(A3); |
ADIJake | 0:465fb31c5651 | 14 | AnalogIn Ain4(A4); |
ADIJake | 0:465fb31c5651 | 15 | |
ADIJake | 0:465fb31c5651 | 16 | //array of analog channels |
ADIJake | 0:465fb31c5651 | 17 | AnalogIn ainChannels[CHANNEL_COUNT] = {Ain0, Ain1, Ain2, Ain3, Ain4}; |
ADIJake | 0:465fb31c5651 | 18 | |
ADIJake | 0:465fb31c5651 | 19 | //digital out channels for signaling to pi |
ADIJake | 1:59475336cb66 | 20 | DigitalOut Dout0(D6); |
ADIJake | 1:59475336cb66 | 21 | DigitalOut Dout1(D5); |
ADIJake | 0:465fb31c5651 | 22 | DigitalOut Dout2(D4); |
ADIJake | 1:59475336cb66 | 23 | DigitalOut Dout3(D3); |
ADIJake | 1:59475336cb66 | 24 | DigitalOut Dout4(D2); |
ADIJake | 0:465fb31c5651 | 25 | |
ADIJake | 0:465fb31c5651 | 26 | //array of digital channels |
ADIJake | 0:465fb31c5651 | 27 | DigitalOut doutChannels[CHANNEL_COUNT] = {Dout0, Dout1, Dout2, Dout3, Dout4}; |
ADIJake | 0:465fb31c5651 | 28 | |
ADIJake | 2:87c34bb330c2 | 29 | Serial pc(PA_11, PA_12); |
ADIJake | 0:465fb31c5651 | 30 | |
ADIJake | 0:465fb31c5651 | 31 | int main() { |
ADIJake | 0:465fb31c5651 | 32 | //read value of analog channels |
ADIJake | 0:465fb31c5651 | 33 | float meas; |
ADIJake | 2:87c34bb330c2 | 34 | pc.printf("Hello World !\n"); |
ADIJake | 0:465fb31c5651 | 35 | //calibrate to ambient light, adding offset to find the thresholds |
ADIJake | 0:465fb31c5651 | 36 | for(int i = 0; i < CHANNEL_COUNT; i++) { |
ADIJake | 0:465fb31c5651 | 37 | initialValues[i] = (ainChannels[i].read() * 3300) + OFFSET; |
ADIJake | 2:87c34bb330c2 | 38 | //pc.printf("initial %d = %.0f mV\n", i, initialValues[i]); |
ADIJake | 0:465fb31c5651 | 39 | } |
ADIJake | 0:465fb31c5651 | 40 | |
ADIJake | 0:465fb31c5651 | 41 | while(1) { |
ADIJake | 0:465fb31c5651 | 42 | //check all analog channels and set digital channels appropriately |
ADIJake | 0:465fb31c5651 | 43 | for(int i = 0; i < CHANNEL_COUNT; i++) { |
ADIJake | 0:465fb31c5651 | 44 | //find channels current value |
ADIJake | 0:465fb31c5651 | 45 | meas = ainChannels[i].read(); // Converts and read the analog input value (value from 0.0 to 1.0) |
ADIJake | 0:465fb31c5651 | 46 | meas = meas * 3300; // Change the value to be in the 0 to 3300 range |
ADIJake | 2:87c34bb330c2 | 47 | pc.printf("measure %d = %.0f mV\n", i, meas); |
ADIJake | 0:465fb31c5651 | 48 | if (meas > initialValues[i]) { // If the value is greater than 2V then switch the LED on |
ADIJake | 0:465fb31c5651 | 49 | doutChannels[i] = 1; |
ADIJake | 0:465fb31c5651 | 50 | } |
ADIJake | 0:465fb31c5651 | 51 | else { |
ADIJake | 0:465fb31c5651 | 52 | doutChannels[i] = 0; |
ADIJake | 0:465fb31c5651 | 53 | } |
ADIJake | 0:465fb31c5651 | 54 | } |
ADIJake | 0:465fb31c5651 | 55 | } |
ADIJake | 0:465fb31c5651 | 56 | } |