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.

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }