Code for Mbed Dashboard project. http://developer.mbed.org/users/julieefreeman/notebook/mbed-dashboard---obdii/
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed-rtos mbed
main.cpp@0:2fa4b8d8fbd0, 2014-12-09 (annotated)
- Committer:
- julieefreeman
- Date:
- Tue Dec 09 18:12:57 2014 +0000
- Revision:
- 0:2fa4b8d8fbd0
First stable version of dashboard project implementing CAN bus and OBDII
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
julieefreeman | 0:2fa4b8d8fbd0 | 1 | /* |
julieefreeman | 0:2fa4b8d8fbd0 | 2 | mbed Dashboard trip computer |
julieefreeman | 0:2fa4b8d8fbd0 | 3 | December 2014 |
julieefreeman | 0:2fa4b8d8fbd0 | 4 | ******************************************************************************** |
julieefreeman | 0:2fa4b8d8fbd0 | 5 | WARNING: Use at your own risk, sadly this software comes with no guarantees. |
julieefreeman | 0:2fa4b8d8fbd0 | 6 | This software is provided 'free' and in good faith, but the author does not |
julieefreeman | 0:2fa4b8d8fbd0 | 7 | accept liability for any damage arising from its use. |
julieefreeman | 0:2fa4b8d8fbd0 | 8 | ******************************************************************************** |
julieefreeman | 0:2fa4b8d8fbd0 | 9 | */ |
julieefreeman | 0:2fa4b8d8fbd0 | 10 | |
julieefreeman | 0:2fa4b8d8fbd0 | 11 | #include "mbed.h" |
julieefreeman | 0:2fa4b8d8fbd0 | 12 | #include "ecu_reader.h" |
julieefreeman | 0:2fa4b8d8fbd0 | 13 | #include "globals.h" |
julieefreeman | 0:2fa4b8d8fbd0 | 14 | #include "rtos.h" |
julieefreeman | 0:2fa4b8d8fbd0 | 15 | #include "SDFileSystem.h" |
julieefreeman | 0:2fa4b8d8fbd0 | 16 | |
julieefreeman | 0:2fa4b8d8fbd0 | 17 | Mutex stdio_mutex; |
julieefreeman | 0:2fa4b8d8fbd0 | 18 | ecu_reader obdii1(CANSPEED_125); //supports different CAN speeds |
julieefreeman | 0:2fa4b8d8fbd0 | 19 | ecu_reader obdii2(CANSPEED_250); |
julieefreeman | 0:2fa4b8d8fbd0 | 20 | ecu_reader obdii3(CANSPEED_500); |
julieefreeman | 0:2fa4b8d8fbd0 | 21 | InterruptIn switch_reading(p8); |
julieefreeman | 0:2fa4b8d8fbd0 | 22 | SDFileSystem sd(p5, p6, p7, p12, "sd"); |
julieefreeman | 0:2fa4b8d8fbd0 | 23 | DigitalOut myled4(LED4); |
julieefreeman | 0:2fa4b8d8fbd0 | 24 | DigitalOut myled3(LED3); |
julieefreeman | 0:2fa4b8d8fbd0 | 25 | |
julieefreeman | 0:2fa4b8d8fbd0 | 26 | int flag; //indicates which reading to get from vehicle |
julieefreeman | 0:2fa4b8d8fbd0 | 27 | int change; //signifies that the system is switching readings |
julieefreeman | 0:2fa4b8d8fbd0 | 28 | char temp_buffer[20]; //buffers for readings from vehicle |
julieefreeman | 0:2fa4b8d8fbd0 | 29 | char rpm_buffer[20]; |
julieefreeman | 0:2fa4b8d8fbd0 | 30 | char speed_buffer[20]; |
julieefreeman | 0:2fa4b8d8fbd0 | 31 | char time_buff[32]; |
julieefreeman | 0:2fa4b8d8fbd0 | 32 | char buffer[20]; |
julieefreeman | 0:2fa4b8d8fbd0 | 33 | float dial_len; |
julieefreeman | 0:2fa4b8d8fbd0 | 34 | int ui_temp, ui_rpm; |
julieefreeman | 0:2fa4b8d8fbd0 | 35 | float ui_speed; |
julieefreeman | 0:2fa4b8d8fbd0 | 36 | int dist_init; |
julieefreeman | 0:2fa4b8d8fbd0 | 37 | float dist; |
julieefreeman | 0:2fa4b8d8fbd0 | 38 | time_t seconds; |
julieefreeman | 0:2fa4b8d8fbd0 | 39 | int testing_temp; //not connected to car |
julieefreeman | 0:2fa4b8d8fbd0 | 40 | int testing_rpm; //not connected to car |
julieefreeman | 0:2fa4b8d8fbd0 | 41 | int testing_speed; |
julieefreeman | 0:2fa4b8d8fbd0 | 42 | |
julieefreeman | 0:2fa4b8d8fbd0 | 43 | void display_coolant_temp(); |
julieefreeman | 0:2fa4b8d8fbd0 | 44 | void display_rpm(); |
julieefreeman | 0:2fa4b8d8fbd0 | 45 | void draw_tachometer(); |
julieefreeman | 0:2fa4b8d8fbd0 | 46 | void draw_thermometer(); |
julieefreeman | 0:2fa4b8d8fbd0 | 47 | void display_speed(); |
julieefreeman | 0:2fa4b8d8fbd0 | 48 | void draw_speedometer(); |
julieefreeman | 0:2fa4b8d8fbd0 | 49 | void display_trip(); |
julieefreeman | 0:2fa4b8d8fbd0 | 50 | |
julieefreeman | 0:2fa4b8d8fbd0 | 51 | void pb_hit_interrupt (void) { |
julieefreeman | 0:2fa4b8d8fbd0 | 52 | myled4 = 1; |
julieefreeman | 0:2fa4b8d8fbd0 | 53 | flag = flag+1; |
julieefreeman | 0:2fa4b8d8fbd0 | 54 | if (flag>3) { |
julieefreeman | 0:2fa4b8d8fbd0 | 55 | flag = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 56 | ui_temp = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 57 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 58 | else if (flag == 1) |
julieefreeman | 0:2fa4b8d8fbd0 | 59 | ui_rpm = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 60 | else if (flag == 2) |
julieefreeman | 0:2fa4b8d8fbd0 | 61 | ui_speed = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 62 | wait(0.5); |
julieefreeman | 0:2fa4b8d8fbd0 | 63 | myled4 = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 64 | change = 1; |
julieefreeman | 0:2fa4b8d8fbd0 | 65 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 66 | void testingThread(void const *args) { // run this thread and set main OBD request conditions to 0 to test UI |
julieefreeman | 0:2fa4b8d8fbd0 | 67 | ui_temp = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 68 | ui_rpm = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 69 | testing_temp = 100; |
julieefreeman | 0:2fa4b8d8fbd0 | 70 | testing_rpm = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 71 | dist_init = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 72 | testing_speed = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 73 | while(1){ |
julieefreeman | 0:2fa4b8d8fbd0 | 74 | // --- TESTING ONLY - WITHOUT CAR --- |
julieefreeman | 0:2fa4b8d8fbd0 | 75 | sprintf(temp_buffer,"%d",testing_temp); |
julieefreeman | 0:2fa4b8d8fbd0 | 76 | sprintf(rpm_buffer,"%d",testing_rpm); |
julieefreeman | 0:2fa4b8d8fbd0 | 77 | sprintf(speed_buffer,"%d", testing_speed); |
julieefreeman | 0:2fa4b8d8fbd0 | 78 | dist += 0.1; |
julieefreeman | 0:2fa4b8d8fbd0 | 79 | testing_temp -= 1; |
julieefreeman | 0:2fa4b8d8fbd0 | 80 | testing_rpm += 100; |
julieefreeman | 0:2fa4b8d8fbd0 | 81 | testing_speed +=5; |
julieefreeman | 0:2fa4b8d8fbd0 | 82 | if (testing_temp<5) { |
julieefreeman | 0:2fa4b8d8fbd0 | 83 | testing_temp = 100; |
julieefreeman | 0:2fa4b8d8fbd0 | 84 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 85 | if (testing_rpm>5000) { |
julieefreeman | 0:2fa4b8d8fbd0 | 86 | testing_rpm = 900; |
julieefreeman | 0:2fa4b8d8fbd0 | 87 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 88 | // --- TESTING ONLY - WITHOUT CAR --- |
julieefreeman | 0:2fa4b8d8fbd0 | 89 | Thread::wait(1000); |
julieefreeman | 0:2fa4b8d8fbd0 | 90 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 91 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 92 | |
julieefreeman | 0:2fa4b8d8fbd0 | 93 | void sdThread(void const *args) { |
julieefreeman | 0:2fa4b8d8fbd0 | 94 | dist = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 95 | dist_init = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 96 | set_time(0); |
julieefreeman | 0:2fa4b8d8fbd0 | 97 | char file[35]; |
julieefreeman | 0:2fa4b8d8fbd0 | 98 | char buffer[32]; |
julieefreeman | 0:2fa4b8d8fbd0 | 99 | char hours[5]; |
julieefreeman | 0:2fa4b8d8fbd0 | 100 | char minutes[5]; |
julieefreeman | 0:2fa4b8d8fbd0 | 101 | float hrs = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 102 | FILE *fp; |
julieefreeman | 0:2fa4b8d8fbd0 | 103 | |
julieefreeman | 0:2fa4b8d8fbd0 | 104 | mkdir("/sd/tripStats",0777); |
julieefreeman | 0:2fa4b8d8fbd0 | 105 | sprintf(file, "/sd/tripStats/log.txt"); |
julieefreeman | 0:2fa4b8d8fbd0 | 106 | while (dist_init == -1){ // |
julieefreeman | 0:2fa4b8d8fbd0 | 107 | stdio_mutex.lock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 108 | if(obdii3.request(DIST_SINCE_CLR, buffer) == 1){ |
julieefreeman | 0:2fa4b8d8fbd0 | 109 | dist_init = atoi(buffer); |
julieefreeman | 0:2fa4b8d8fbd0 | 110 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 111 | stdio_mutex.unlock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 112 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 113 | |
julieefreeman | 0:2fa4b8d8fbd0 | 114 | while (1){ |
julieefreeman | 0:2fa4b8d8fbd0 | 115 | fp = fopen(file, "w"); |
julieefreeman | 0:2fa4b8d8fbd0 | 116 | myled3 = 1; |
julieefreeman | 0:2fa4b8d8fbd0 | 117 | seconds = time(NULL); |
julieefreeman | 0:2fa4b8d8fbd0 | 118 | strftime(time_buff, 32, "%R:%S", localtime(&seconds)); |
julieefreeman | 0:2fa4b8d8fbd0 | 119 | strftime(hours, 5, "%H", localtime(&seconds)); |
julieefreeman | 0:2fa4b8d8fbd0 | 120 | strftime(minutes, 5, "%M", localtime(&seconds)); |
julieefreeman | 0:2fa4b8d8fbd0 | 121 | hrs = atoi(hours) + ((float)atoi(minutes))/60; |
julieefreeman | 0:2fa4b8d8fbd0 | 122 | if(fp == NULL) { |
julieefreeman | 0:2fa4b8d8fbd0 | 123 | error("Could not open file for write\n"); |
julieefreeman | 0:2fa4b8d8fbd0 | 124 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 125 | stdio_mutex.lock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 126 | if(obdii3.request(DIST_SINCE_CLR, buffer) == 1){ |
julieefreeman | 0:2fa4b8d8fbd0 | 127 | dist = ((float)atoi(buffer)-dist_init)*0.62; |
julieefreeman | 0:2fa4b8d8fbd0 | 128 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 129 | stdio_mutex.unlock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 130 | fprintf(fp, "Time since mbed start: %s\n\n", time_buff); |
julieefreeman | 0:2fa4b8d8fbd0 | 131 | fprintf(fp, "Distance Traveled: %2.2f miles\n", dist); |
julieefreeman | 0:2fa4b8d8fbd0 | 132 | fprintf(fp, "Average Speed: %2.2f mph\n", dist/hrs); |
julieefreeman | 0:2fa4b8d8fbd0 | 133 | fclose(fp); |
julieefreeman | 0:2fa4b8d8fbd0 | 134 | myled3 = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 135 | Thread::wait(30000); //write to SD card every 30 seconds |
julieefreeman | 0:2fa4b8d8fbd0 | 136 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 137 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 138 | |
julieefreeman | 0:2fa4b8d8fbd0 | 139 | int main() { |
julieefreeman | 0:2fa4b8d8fbd0 | 140 | ui_temp = -1; //initialize default values |
julieefreeman | 0:2fa4b8d8fbd0 | 141 | ui_rpm = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 142 | ui_speed = -1; |
julieefreeman | 0:2fa4b8d8fbd0 | 143 | change = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 144 | flag = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 145 | dial_len = 60.0; |
julieefreeman | 0:2fa4b8d8fbd0 | 146 | lcd.cls(); |
julieefreeman | 0:2fa4b8d8fbd0 | 147 | lcd.baudrate(3000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 148 | switch_reading.mode(PullUp); |
julieefreeman | 0:2fa4b8d8fbd0 | 149 | wait(0.2); |
julieefreeman | 0:2fa4b8d8fbd0 | 150 | switch_reading.fall(&pb_hit_interrupt); |
julieefreeman | 0:2fa4b8d8fbd0 | 151 | Thread t2(sdThread); |
julieefreeman | 0:2fa4b8d8fbd0 | 152 | //Thread test(testingThread); //run this thread and change OBD request conditions to 0 to test UI |
julieefreeman | 0:2fa4b8d8fbd0 | 153 | |
julieefreeman | 0:2fa4b8d8fbd0 | 154 | while (1) { //main thread |
julieefreeman | 0:2fa4b8d8fbd0 | 155 | if (change == 0) { //update LCD only when not in process of switching screens |
julieefreeman | 0:2fa4b8d8fbd0 | 156 | switch (flag){ |
julieefreeman | 0:2fa4b8d8fbd0 | 157 | case 0: //engine coolant temperature |
julieefreeman | 0:2fa4b8d8fbd0 | 158 | if(obdii3.request(ENGINE_COOLANT_TEMP, temp_buffer) == 1){ //set to 1 for car, 0 for testing UI |
julieefreeman | 0:2fa4b8d8fbd0 | 159 | stdio_mutex.lock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 160 | display_coolant_temp(); |
julieefreeman | 0:2fa4b8d8fbd0 | 161 | stdio_mutex.unlock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 162 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 163 | else { |
julieefreeman | 0:2fa4b8d8fbd0 | 164 | can2.reset(); |
julieefreeman | 0:2fa4b8d8fbd0 | 165 | wait(0.5); |
julieefreeman | 0:2fa4b8d8fbd0 | 166 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 167 | break; |
julieefreeman | 0:2fa4b8d8fbd0 | 168 | case 1: //engine rpm |
julieefreeman | 0:2fa4b8d8fbd0 | 169 | if (obdii3.request(ENGINE_RPM, rpm_buffer) == 1){ //set to 1 for car, 0 for testing UI |
julieefreeman | 0:2fa4b8d8fbd0 | 170 | stdio_mutex.lock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 171 | display_rpm(); |
julieefreeman | 0:2fa4b8d8fbd0 | 172 | stdio_mutex.unlock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 173 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 174 | else { |
julieefreeman | 0:2fa4b8d8fbd0 | 175 | can2.reset(); |
julieefreeman | 0:2fa4b8d8fbd0 | 176 | wait(0.5); |
julieefreeman | 0:2fa4b8d8fbd0 | 177 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 178 | break; |
julieefreeman | 0:2fa4b8d8fbd0 | 179 | case 2: //vehicle speed |
julieefreeman | 0:2fa4b8d8fbd0 | 180 | if (obdii3.request(VEHICLE_SPEED, speed_buffer) == 1){ //set to 1 for car, 0 for testing UI |
julieefreeman | 0:2fa4b8d8fbd0 | 181 | stdio_mutex.lock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 182 | display_speed(); |
julieefreeman | 0:2fa4b8d8fbd0 | 183 | stdio_mutex.unlock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 184 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 185 | else { |
julieefreeman | 0:2fa4b8d8fbd0 | 186 | can2.reset(); |
julieefreeman | 0:2fa4b8d8fbd0 | 187 | wait(0.5); |
julieefreeman | 0:2fa4b8d8fbd0 | 188 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 189 | break; |
julieefreeman | 0:2fa4b8d8fbd0 | 190 | case 3: //distance since codes last cleared |
julieefreeman | 0:2fa4b8d8fbd0 | 191 | if(obdii3.request(DIST_SINCE_CLR, buffer) == 1){ |
julieefreeman | 0:2fa4b8d8fbd0 | 192 | dist = ((float)atoi(buffer)-(float)dist_init)*0.62; |
julieefreeman | 0:2fa4b8d8fbd0 | 193 | stdio_mutex.lock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 194 | display_trip(); |
julieefreeman | 0:2fa4b8d8fbd0 | 195 | stdio_mutex.unlock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 196 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 197 | else { |
julieefreeman | 0:2fa4b8d8fbd0 | 198 | stdio_mutex.lock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 199 | display_trip(); |
julieefreeman | 0:2fa4b8d8fbd0 | 200 | stdio_mutex.unlock(); |
julieefreeman | 0:2fa4b8d8fbd0 | 201 | can2.reset(); |
julieefreeman | 0:2fa4b8d8fbd0 | 202 | wait(0.5); |
julieefreeman | 0:2fa4b8d8fbd0 | 203 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 204 | break; |
julieefreeman | 0:2fa4b8d8fbd0 | 205 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 206 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 207 | else { |
julieefreeman | 0:2fa4b8d8fbd0 | 208 | lcd.cls(); |
julieefreeman | 0:2fa4b8d8fbd0 | 209 | change = 0; |
julieefreeman | 0:2fa4b8d8fbd0 | 210 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 211 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 212 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 213 | |
julieefreeman | 0:2fa4b8d8fbd0 | 214 | void display_coolant_temp(){ //displays temperature |
julieefreeman | 0:2fa4b8d8fbd0 | 215 | float farenheit = atoi(temp_buffer) * 9/5 +32; |
julieefreeman | 0:2fa4b8d8fbd0 | 216 | draw_thermometer(); |
julieefreeman | 0:2fa4b8d8fbd0 | 217 | lcd.color(0x909090); |
julieefreeman | 0:2fa4b8d8fbd0 | 218 | lcd.text_width(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 219 | lcd.text_height(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 220 | lcd.locate(1,0); |
julieefreeman | 0:2fa4b8d8fbd0 | 221 | lcd.printf("%s\n\r", "COOLANT\n TEMP."); |
julieefreeman | 0:2fa4b8d8fbd0 | 222 | lcd.color(0x66CCFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 223 | lcd.locate(0,3); |
julieefreeman | 0:2fa4b8d8fbd0 | 224 | lcd.printf("%3.0f \n\r", farenheit); |
julieefreeman | 0:2fa4b8d8fbd0 | 225 | lcd.locate(0,4); |
julieefreeman | 0:2fa4b8d8fbd0 | 226 | lcd.printf("oF\n\r"); |
julieefreeman | 0:2fa4b8d8fbd0 | 227 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 228 | |
julieefreeman | 0:2fa4b8d8fbd0 | 229 | void draw_thermometer(){ //draws temperature animation |
julieefreeman | 0:2fa4b8d8fbd0 | 230 | lcd.rectangle(73,47,119,128,0xFFFFFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 231 | int new_temp = atoi(temp_buffer); |
julieefreeman | 0:2fa4b8d8fbd0 | 232 | int height = 128-ceil((float)new_temp*.8); |
julieefreeman | 0:2fa4b8d8fbd0 | 233 | |
julieefreeman | 0:2fa4b8d8fbd0 | 234 | if (new_temp > 100 && ui_temp!=new_temp) { //red |
julieefreeman | 0:2fa4b8d8fbd0 | 235 | lcd.filled_rectangle(74,48,118,67,0xFF0000); |
julieefreeman | 0:2fa4b8d8fbd0 | 236 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 237 | else if (new_temp > 75 && ui_temp!=new_temp) { |
julieefreeman | 0:2fa4b8d8fbd0 | 238 | if (ui_temp>new_temp) lcd.filled_rectangle(74,48,118,height,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 239 | lcd.filled_rectangle(74,height,118,67,0xFF0000); |
julieefreeman | 0:2fa4b8d8fbd0 | 240 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 241 | else lcd.filled_rectangle(74,48,118,67,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 242 | if (new_temp > 75 && ui_temp!=new_temp) { //dark orange |
julieefreeman | 0:2fa4b8d8fbd0 | 243 | lcd.filled_rectangle(74,68,118,87,0xFF4719); |
julieefreeman | 0:2fa4b8d8fbd0 | 244 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 245 | else if (new_temp > 50 && ui_temp!=new_temp) { |
julieefreeman | 0:2fa4b8d8fbd0 | 246 | if (ui_temp>new_temp) lcd.filled_rectangle(74,68,118,height,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 247 | lcd.filled_rectangle(74,height,118,87,0xFF4719); |
julieefreeman | 0:2fa4b8d8fbd0 | 248 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 249 | else lcd.filled_rectangle(74,68,118,87,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 250 | if (new_temp > 50 && ui_temp!=new_temp) { //orange |
julieefreeman | 0:2fa4b8d8fbd0 | 251 | lcd.filled_rectangle(74,88,118,107,0xFF9933); |
julieefreeman | 0:2fa4b8d8fbd0 | 252 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 253 | else if (new_temp > 25 && ui_temp!=new_temp) { |
julieefreeman | 0:2fa4b8d8fbd0 | 254 | if (ui_temp>new_temp) lcd.filled_rectangle(74,88,118,height,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 255 | lcd.filled_rectangle(74,height,118,107,0xFF9933); |
julieefreeman | 0:2fa4b8d8fbd0 | 256 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 257 | else lcd.filled_rectangle(74,88,118,107,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 258 | if (new_temp > 25 && ui_temp!=new_temp) { //yellow |
julieefreeman | 0:2fa4b8d8fbd0 | 259 | lcd.filled_rectangle(74,108,118,128,0xFFFF99); |
julieefreeman | 0:2fa4b8d8fbd0 | 260 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 261 | else if (new_temp > 0 && ui_temp!=new_temp) { |
julieefreeman | 0:2fa4b8d8fbd0 | 262 | if (ui_temp>new_temp) lcd.filled_rectangle(74,108,118,height,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 263 | lcd.filled_rectangle(74,height,118,128,0xFFFF99); |
julieefreeman | 0:2fa4b8d8fbd0 | 264 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 265 | else lcd.filled_rectangle(74,108,118,128,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 266 | ui_temp = new_temp; |
julieefreeman | 0:2fa4b8d8fbd0 | 267 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 268 | |
julieefreeman | 0:2fa4b8d8fbd0 | 269 | void display_rpm(){ //displays rpm |
julieefreeman | 0:2fa4b8d8fbd0 | 270 | draw_tachometer(); |
julieefreeman | 0:2fa4b8d8fbd0 | 271 | lcd.color(0x909090); |
julieefreeman | 0:2fa4b8d8fbd0 | 272 | lcd.text_width(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 273 | lcd.text_height(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 274 | lcd.locate(1,0); |
julieefreeman | 0:2fa4b8d8fbd0 | 275 | lcd.printf("%s\n\r", "ENG RPM"); |
julieefreeman | 0:2fa4b8d8fbd0 | 276 | lcd.color(0x66CCFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 277 | lcd.text_width(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 278 | lcd.text_height(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 279 | lcd.locate(1,1); |
julieefreeman | 0:2fa4b8d8fbd0 | 280 | lcd.printf("%s \n\r", rpm_buffer); |
julieefreeman | 0:2fa4b8d8fbd0 | 281 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 282 | |
julieefreeman | 0:2fa4b8d8fbd0 | 283 | void draw_tachometer(){ //draws rpm gauge |
julieefreeman | 0:2fa4b8d8fbd0 | 284 | lcd.circle(64,120,60,0xFFFFFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 285 | int new_rpm = atoi(rpm_buffer); |
julieefreeman | 0:2fa4b8d8fbd0 | 286 | int x = int(cos(float(new_rpm)*0.00041887902)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 287 | int y = int(sin(float(new_rpm)*0.00041887902)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 288 | if (ui_rpm!=new_rpm && ui_rpm!=-1) { |
julieefreeman | 0:2fa4b8d8fbd0 | 289 | int old_x = int(cos(float(ui_rpm)*0.00041887902)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 290 | int old_y = int(sin(float(ui_rpm)*0.00041887902)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 291 | lcd.line(64-old_x,120-old_y,64,120,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 292 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 293 | lcd.line(64-x,120-y,64,120,0xFF8C00); |
julieefreeman | 0:2fa4b8d8fbd0 | 294 | ui_rpm = new_rpm; |
julieefreeman | 0:2fa4b8d8fbd0 | 295 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 296 | |
julieefreeman | 0:2fa4b8d8fbd0 | 297 | void display_speed() { //displays speed |
julieefreeman | 0:2fa4b8d8fbd0 | 298 | draw_speedometer(); |
julieefreeman | 0:2fa4b8d8fbd0 | 299 | lcd.color(0x909090); |
julieefreeman | 0:2fa4b8d8fbd0 | 300 | lcd.text_width(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 301 | lcd.text_height(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 302 | lcd.locate(1,0); |
julieefreeman | 0:2fa4b8d8fbd0 | 303 | lcd.printf("%s\n\r", "SPEED"); |
julieefreeman | 0:2fa4b8d8fbd0 | 304 | lcd.color(0x66CCFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 305 | lcd.text_width(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 306 | lcd.text_height(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 307 | lcd.locate(1,1); |
julieefreeman | 0:2fa4b8d8fbd0 | 308 | lcd.printf("%3.0f \n\r", (((float)atoi(speed_buffer))*0.62)); |
julieefreeman | 0:2fa4b8d8fbd0 | 309 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 310 | |
julieefreeman | 0:2fa4b8d8fbd0 | 311 | void draw_speedometer(){ //draws gauge for speed |
julieefreeman | 0:2fa4b8d8fbd0 | 312 | lcd.circle(64,120,60,0xFFFFFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 313 | float new_speed = atoi(speed_buffer) * 0.62; |
julieefreeman | 0:2fa4b8d8fbd0 | 314 | int x = int(cos(new_speed*0.0314159265)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 315 | int y = int(sin(new_speed*0.0314159265)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 316 | if (ui_speed!=new_speed && ui_speed!=-1) { |
julieefreeman | 0:2fa4b8d8fbd0 | 317 | int old_x = int(cos(ui_speed*0.0314159265)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 318 | int old_y = int(sin(ui_speed*0.0314159265)*dial_len); |
julieefreeman | 0:2fa4b8d8fbd0 | 319 | lcd.line(64-old_x,120-old_y,64,120,0x000000); |
julieefreeman | 0:2fa4b8d8fbd0 | 320 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 321 | lcd.line(64-x,120-y,64,120,0xFF8C00); |
julieefreeman | 0:2fa4b8d8fbd0 | 322 | ui_speed = new_speed; |
julieefreeman | 0:2fa4b8d8fbd0 | 323 | } |
julieefreeman | 0:2fa4b8d8fbd0 | 324 | |
julieefreeman | 0:2fa4b8d8fbd0 | 325 | void display_trip() { //displays data being output to SD card |
julieefreeman | 0:2fa4b8d8fbd0 | 326 | lcd.color(0x909090); |
julieefreeman | 0:2fa4b8d8fbd0 | 327 | lcd.text_width(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 328 | lcd.text_height(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 329 | lcd.locate(0,0); |
julieefreeman | 0:2fa4b8d8fbd0 | 330 | lcd.printf("%s\n\r", "TOTALTIME"); |
julieefreeman | 0:2fa4b8d8fbd0 | 331 | lcd.color(0x66CCFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 332 | lcd.text_width(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 333 | lcd.text_height(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 334 | lcd.locate(0,1); |
julieefreeman | 0:2fa4b8d8fbd0 | 335 | strftime(time_buff, 32, "%R", localtime(&seconds)); |
julieefreeman | 0:2fa4b8d8fbd0 | 336 | lcd.printf("%s \n\r", time_buff); |
julieefreeman | 0:2fa4b8d8fbd0 | 337 | |
julieefreeman | 0:2fa4b8d8fbd0 | 338 | lcd.color(0x909090); |
julieefreeman | 0:2fa4b8d8fbd0 | 339 | lcd.text_width(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 340 | lcd.text_height(2); |
julieefreeman | 0:2fa4b8d8fbd0 | 341 | lcd.locate(0,4); |
julieefreeman | 0:2fa4b8d8fbd0 | 342 | lcd.printf("%s\n\r", "DISTANCE"); |
julieefreeman | 0:2fa4b8d8fbd0 | 343 | lcd.color(0x66CCFF); |
julieefreeman | 0:2fa4b8d8fbd0 | 344 | lcd.text_width(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 345 | lcd.text_height(3); |
julieefreeman | 0:2fa4b8d8fbd0 | 346 | lcd.locate(0,4); |
julieefreeman | 0:2fa4b8d8fbd0 | 347 | lcd.printf("%3.1f \n\r", dist); |
julieefreeman | 0:2fa4b8d8fbd0 | 348 | } |