Distance Sensor Project using the SRF02 ultrasonic distance sensor and N5110 lcd display.
Dependencies: N5110 PowerControl SRF02 mbed
main.cpp@3:bf56dab11abc, 2015-05-08 (annotated)
- Committer:
- el13jar
- Date:
- Fri May 08 09:08:58 2015 +0000
- Revision:
- 3:bf56dab11abc
- Parent:
- 1:d7cfd0e55682
Final Commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
el13jar | 1:d7cfd0e55682 | 1 | /** |
el13jar | 1:d7cfd0e55682 | 2 | @file main.cpp |
el13jar | 1:d7cfd0e55682 | 3 | @brief Program implementation |
el13jar | 1:d7cfd0e55682 | 4 | */ |
el13jar | 0:bc54502de2bb | 5 | |
el13jar | 1:d7cfd0e55682 | 6 | #include "mbed.h" |
el13jar | 1:d7cfd0e55682 | 7 | #include "main.h" |
el13jar | 0:bc54502de2bb | 8 | |
el13jar | 0:bc54502de2bb | 9 | int main() |
el13jar | 0:bc54502de2bb | 10 | { |
el13jar | 1:d7cfd0e55682 | 11 | // Initialise; pwm output,timers,interrupts,power saving functions,buffers |
el13jar | 0:bc54502de2bb | 12 | P21.period(0.0005); |
el13jar | 1:d7cfd0e55682 | 13 | |
el13jar | 1:d7cfd0e55682 | 14 | timer.attach(&timerexpired,1); //attach ISR expiring every 1 second(s) |
el13jar | 1:d7cfd0e55682 | 15 | serial.attach(&serialISR); //attach serial ISR |
el13jar | 1:d7cfd0e55682 | 16 | LocalFileSystem local("local"); // create local filesystem |
el13jar | 1:d7cfd0e55682 | 17 | P17.rise(&MButtonPressed);//interrupt for mode change |
el13jar | 1:d7cfd0e55682 | 18 | P16.rise(&LButtonPressed);//interrupt for log change |
el13jar | 1:d7cfd0e55682 | 19 | |
el13jar | 1:d7cfd0e55682 | 20 | char buffer[30]; //buffer used to store time string |
el13jar | 1:d7cfd0e55682 | 21 | char buf[10];//buffer used to store distance string |
el13jar | 1:d7cfd0e55682 | 22 | |
el13jar | 0:bc54502de2bb | 23 | PHY_PowerDown(); |
el13jar | 1:d7cfd0e55682 | 24 | //semihost_powerdown(); |
el13jar | 1:d7cfd0e55682 | 25 | |
el13jar | 1:d7cfd0e55682 | 26 | //set_time(0); |
el13jar | 0:bc54502de2bb | 27 | |
el13jar | 0:bc54502de2bb | 28 | lcd.init(); |
el13jar | 0:bc54502de2bb | 29 | |
el13jar | 1:d7cfd0e55682 | 30 | //lcd.printString("-- -- -- --",0,0); |
el13jar | 0:bc54502de2bb | 31 | lcd.printString("DISTANCE",18,1); |
el13jar | 1:d7cfd0e55682 | 32 | lcd.printString("SENSOR",24,2); |
el13jar | 1:d7cfd0e55682 | 33 | //lcd.printString(" -- -- -- ",0,3); |
el13jar | 0:bc54502de2bb | 34 | lcd.printString("James Robinson",0,4); |
el13jar | 0:bc54502de2bb | 35 | lcd.printString("200775267",16,5); |
el13jar | 0:bc54502de2bb | 36 | wait(3); |
el13jar | 0:bc54502de2bb | 37 | |
el13jar | 0:bc54502de2bb | 38 | lcd.clear(); |
el13jar | 0:bc54502de2bb | 39 | |
el13jar | 0:bc54502de2bb | 40 | while(1) { |
el13jar | 0:bc54502de2bb | 41 | |
el13jar | 0:bc54502de2bb | 42 | if (timerflag) { |
el13jar | 0:bc54502de2bb | 43 | timerflag = 0; |
el13jar | 1:d7cfd0e55682 | 44 | |
el13jar | 1:d7cfd0e55682 | 45 | backlight(); |
el13jar | 1:d7cfd0e55682 | 46 | GetDistance(); |
el13jar | 1:d7cfd0e55682 | 47 | |
el13jar | 0:bc54502de2bb | 48 | time_t seconds = time(NULL); // get current time |
el13jar | 0:bc54502de2bb | 49 | |
el13jar | 0:bc54502de2bb | 50 | strftime(buffer, 30 , "%X %d/%m/%y", localtime(&seconds)); |
el13jar | 1:d7cfd0e55682 | 51 | //format time into a string (time and date) |
el13jar | 1:d7cfd0e55682 | 52 | |
el13jar | 1:d7cfd0e55682 | 53 | serial.printf("%s , Distance = %dcm\n",buffer,distance);//print over serial |
el13jar | 1:d7cfd0e55682 | 54 | |
el13jar | 1:d7cfd0e55682 | 55 | if (LogFlag==1) { //if flag log |
el13jar | 1:d7cfd0e55682 | 56 | writeDataToFile(buffer,distance); //write to disk |
el13jar | 1:d7cfd0e55682 | 57 | serial.printf("LOGGED\n"); |
el13jar | 1:d7cfd0e55682 | 58 | } |
el13jar | 1:d7cfd0e55682 | 59 | |
el13jar | 1:d7cfd0e55682 | 60 | if (setTimeFlag) { //if updated time has been sent |
el13jar | 1:d7cfd0e55682 | 61 | setTimeFlag = 0; //clear flag |
el13jar | 1:d7cfd0e55682 | 62 | setTime(); //update time |
el13jar | 1:d7cfd0e55682 | 63 | } |
el13jar | 0:bc54502de2bb | 64 | |
el13jar | 1:d7cfd0e55682 | 65 | //printing to lcd |
el13jar | 1:d7cfd0e55682 | 66 | lcd.clear(); |
el13jar | 1:d7cfd0e55682 | 67 | float A=distance*0.2; |
el13jar | 1:d7cfd0e55682 | 68 | lcd.drawRect(0,0,84,A,1); |
el13jar | 1:d7cfd0e55682 | 69 | |
el13jar | 1:d7cfd0e55682 | 70 | sprintf(buf, "%dcm",distance); //function to convert int to string |
el13jar | 1:d7cfd0e55682 | 71 | lcd.printString(buf,28,5);//print converted string |
el13jar | 1:d7cfd0e55682 | 72 | lcd.refresh(); |
el13jar | 0:bc54502de2bb | 73 | |
el13jar | 1:d7cfd0e55682 | 74 | if (MFlag) { //if flag change mode |
el13jar | 1:d7cfd0e55682 | 75 | MFlag=0; |
el13jar | 1:d7cfd0e55682 | 76 | modeChange(); |
el13jar | 1:d7cfd0e55682 | 77 | } |
el13jar | 1:d7cfd0e55682 | 78 | |
el13jar | 1:d7cfd0e55682 | 79 | if(distance<40) { |
el13jar | 1:d7cfd0e55682 | 80 | volume(); |
el13jar | 1:d7cfd0e55682 | 81 | } else { |
el13jar | 1:d7cfd0e55682 | 82 | P21=1; |
el13jar | 0:bc54502de2bb | 83 | } |
el13jar | 0:bc54502de2bb | 84 | } |
el13jar | 0:bc54502de2bb | 85 | Sleep(); |
el13jar | 0:bc54502de2bb | 86 | } |
el13jar | 0:bc54502de2bb | 87 | } |
el13jar | 0:bc54502de2bb | 88 | |
el13jar | 1:d7cfd0e55682 | 89 | |
el13jar | 1:d7cfd0e55682 | 90 | //functions |
el13jar | 1:d7cfd0e55682 | 91 | |
el13jar | 1:d7cfd0e55682 | 92 | void GetDistance() |
el13jar | 1:d7cfd0e55682 | 93 | { |
el13jar | 1:d7cfd0e55682 | 94 | /// read sensor distance 10 times take an average, return distance |
el13jar | 1:d7cfd0e55682 | 95 | int d0 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 96 | int d1 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 97 | int d2 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 98 | int d3 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 99 | int d4 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 100 | int d5 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 101 | int d6 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 102 | int d7 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 103 | int d8 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 104 | int d9 = sensor.getDistanceCm(); |
el13jar | 1:d7cfd0e55682 | 105 | int dt=d0+d1+d2+d3+d4+d5+d6+d7+d8+d9; |
el13jar | 1:d7cfd0e55682 | 106 | distance=dt/10; |
el13jar | 1:d7cfd0e55682 | 107 | } |
el13jar | 1:d7cfd0e55682 | 108 | |
el13jar | 0:bc54502de2bb | 109 | void MButtonPressed() |
el13jar | 0:bc54502de2bb | 110 | { |
el13jar | 1:d7cfd0e55682 | 111 | MFlag=1;///flag for mode set to 1 |
el13jar | 0:bc54502de2bb | 112 | } |
el13jar | 0:bc54502de2bb | 113 | |
el13jar | 0:bc54502de2bb | 114 | void LButtonPressed() |
el13jar | 0:bc54502de2bb | 115 | { |
el13jar | 1:d7cfd0e55682 | 116 | LogFlag=!LogFlag;///inverse flag |
el13jar | 0:bc54502de2bb | 117 | serial.printf("LOG BUTTON PRESSED\n"); |
el13jar | 0:bc54502de2bb | 118 | wait(0.5); |
el13jar | 0:bc54502de2bb | 119 | } |
el13jar | 0:bc54502de2bb | 120 | |
el13jar | 0:bc54502de2bb | 121 | void modeChange() |
el13jar | 0:bc54502de2bb | 122 | { |
el13jar | 0:bc54502de2bb | 123 | M++; |
el13jar | 0:bc54502de2bb | 124 | if (M==2) { |
el13jar | 0:bc54502de2bb | 125 | M=0; |
el13jar | 0:bc54502de2bb | 126 | } |
el13jar | 0:bc54502de2bb | 127 | if (M==0) { |
el13jar | 0:bc54502de2bb | 128 | lcd.normalMode(); |
el13jar | 0:bc54502de2bb | 129 | serial.printf("NORMAL MODE\n"); |
el13jar | 0:bc54502de2bb | 130 | } else if (M==1) { |
el13jar | 0:bc54502de2bb | 131 | lcd.inverseMode(); |
el13jar | 0:bc54502de2bb | 132 | serial.printf("INVERSE MODE\n"); |
el13jar | 0:bc54502de2bb | 133 | } else {} |
el13jar | 0:bc54502de2bb | 134 | } |
el13jar | 0:bc54502de2bb | 135 | |
el13jar | 0:bc54502de2bb | 136 | void backlight() |
el13jar | 0:bc54502de2bb | 137 | { |
el13jar | 1:d7cfd0e55682 | 138 | P20.read(); ///check backlight potentiometer value |
el13jar | 1:d7cfd0e55682 | 139 | P26=1-P20; ///adjust backlight pwm output according to the value |
el13jar | 0:bc54502de2bb | 140 | } |
el13jar | 0:bc54502de2bb | 141 | |
el13jar | 0:bc54502de2bb | 142 | void volume() |
el13jar | 0:bc54502de2bb | 143 | { |
el13jar | 1:d7cfd0e55682 | 144 | P19.read(); ///check volume potentiometer value |
el13jar | 1:d7cfd0e55682 | 145 | float V=(P19/5); ///assign variable 1/5 of the read p19 value |
el13jar | 0:bc54502de2bb | 146 | //serial.printf("%f\n",V); |
el13jar | 1:d7cfd0e55682 | 147 | P21=(0.8+V);///adjust volume pwm output according to variable V value |
el13jar | 0:bc54502de2bb | 148 | //serial.printf("%f\n",P21); |
el13jar | 0:bc54502de2bb | 149 | } |
el13jar | 0:bc54502de2bb | 150 | |
el13jar | 0:bc54502de2bb | 151 | void setTime() |
el13jar | 0:bc54502de2bb | 152 | { |
el13jar | 1:d7cfd0e55682 | 153 | serial.printf("set_time - %s",rxString);/// print time for debugging |
el13jar | 1:d7cfd0e55682 | 154 | int time = atoi(rxString);/// atoi() converts a string to an integer |
el13jar | 1:d7cfd0e55682 | 155 | set_time(time);/// update the time |
el13jar | 0:bc54502de2bb | 156 | } |
el13jar | 0:bc54502de2bb | 157 | |
el13jar | 0:bc54502de2bb | 158 | void serialISR() |
el13jar | 0:bc54502de2bb | 159 | { |
el13jar | 1:d7cfd0e55682 | 160 | serial.gets(rxString,16);/// when a serial interrupt occurs, read rx string into buffer |
el13jar | 1:d7cfd0e55682 | 161 | setTimeFlag = 1;/// set flag |
el13jar | 0:bc54502de2bb | 162 | } |
el13jar | 0:bc54502de2bb | 163 | |
el13jar | 1:d7cfd0e55682 | 164 | |
el13jar | 0:bc54502de2bb | 165 | void writeDataToFile(char* bufferdata,float distancedata) |
el13jar | 0:bc54502de2bb | 166 | { |
el13jar | 1:d7cfd0e55682 | 167 | leds = 15; /// turn on LEDs for feedback |
el13jar | 1:d7cfd0e55682 | 168 | FILE *fp = fopen("/local/log.csv", "a"); /// open 'log.csv' for appending |
el13jar | 1:d7cfd0e55682 | 169 | /// if the file doesn't exist it is created, if it exists, data is appended to the end |
el13jar | 1:d7cfd0e55682 | 170 | fprintf(fp," %s , %f\n",bufferdata,distancedata); /// print string to file |
el13jar | 1:d7cfd0e55682 | 171 | fclose(fp); /// close file |
el13jar | 1:d7cfd0e55682 | 172 | leds = 0; /// turn off LEDs to signify file access has finished |
el13jar | 0:bc54502de2bb | 173 | } |
el13jar | 0:bc54502de2bb | 174 | |
el13jar | 0:bc54502de2bb | 175 | void timerexpired () |
el13jar | 0:bc54502de2bb | 176 | { |
el13jar | 0:bc54502de2bb | 177 | timerflag=1; |
el13jar | 0:bc54502de2bb | 178 | } |