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:
Mon Jan 08 18:19:51 2018 +0000
Revision:
1:59475336cb66
Parent:
0:465fb31c5651
Child:
2:87c34bb330c2
Updated digital output pins.

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 0:465fb31c5651 29
ADIJake 0:465fb31c5651 30 int main() {
ADIJake 0:465fb31c5651 31 //read value of analog channels
ADIJake 0:465fb31c5651 32 float meas;
ADIJake 0:465fb31c5651 33
ADIJake 0:465fb31c5651 34 //calibrate to ambient light, adding offset to find the thresholds
ADIJake 0:465fb31c5651 35 for(int i = 0; i < CHANNEL_COUNT; i++) {
ADIJake 0:465fb31c5651 36 initialValues[i] = (ainChannels[i].read() * 3300) + OFFSET;
ADIJake 0:465fb31c5651 37 }
ADIJake 0:465fb31c5651 38
ADIJake 0:465fb31c5651 39 while(1) {
ADIJake 0:465fb31c5651 40 //check all analog channels and set digital channels appropriately
ADIJake 0:465fb31c5651 41 for(int i = 0; i < CHANNEL_COUNT; i++) {
ADIJake 0:465fb31c5651 42 //find channels current value
ADIJake 0:465fb31c5651 43 meas = ainChannels[i].read(); // Converts and read the analog input value (value from 0.0 to 1.0)
ADIJake 0:465fb31c5651 44 meas = meas * 3300; // Change the value to be in the 0 to 3300 range
ADIJake 0:465fb31c5651 45 printf("measure %d = %.0f mV\n", i, meas);
ADIJake 0:465fb31c5651 46 if (meas > initialValues[i]) { // If the value is greater than 2V then switch the LED on
ADIJake 0:465fb31c5651 47 doutChannels[i] = 1;
ADIJake 0:465fb31c5651 48 }
ADIJake 0:465fb31c5651 49 else {
ADIJake 0:465fb31c5651 50 doutChannels[i] = 0;
ADIJake 0:465fb31c5651 51 }
ADIJake 0:465fb31c5651 52 }
ADIJake 0:465fb31c5651 53 }
ADIJake 0:465fb31c5651 54 }