├── Schematic And Design ├── Diptrace Board Routed └── Eagle Board Unrouted.brd ├── README.md └── Code ├── AccelGraph_Original.ino └── AccelGraph_MCP3008.ino /Schematic And Design/Diptrace Board Routed: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hyderhasnain/arduino_touchscreen_controller/HEAD/Schematic And Design/Diptrace Board Routed -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **Arduino Touchscreen LCD Wireless Controller Project** 2 | ========================================================= 3 | 4 | You can see this project in action here: http://www.youtube.com/watch?v=bEqvmakN07w 5 | 6 | ##Background 7 | 8 | I designed and built this project during summer 2013, as an upgrade to a previous wireless controller I built the previous summer to control a small robot. That controller used an LED ring to display orientation and driving direction, communicating via XBee, but I needed a wireless controller with more functionality and input options. 9 | So I found this LCD via Adafruit (https://www.adafruit.com/products/335). Perfect! 10 | 11 | >Turns out a newer version came out soon afterwards, that uses SPI instead of a parallel connection. Much fewer pins, easier to use, etc. Bummer, *lots* of my design decisions and compromises revolved around the limited IO on the Arduino... Oh well. 12 | 13 | I wanted the board to have many features, including: accelerometer control, wireless communication, wireless programming, real time clock, onboard battery charging, joysticks, microSD card, light sensor, advanced math computation, etc. Of course, this meant I had to design a custom PCB. 14 | 15 | ##Design 16 | 17 | During this process, I made a number of Eagle library parts for many components, including the Adafruit LCD, microSD card breakout, ADXL345 accelerometer, MCP3008, uM-FPU chip, and Arduino Fio by transplanting designs from datasheets and PCB designs. I've included my library because I personally couldn't find these parts online, and maybe these will help somebody. I planned to design the entire schematic/board in Cadsoft Eagle, but after completing the schematic realized that the free version of Eagle limits the maximum size of the board, and my board wouldn't fit. After much frustration and fiddling, I decided to use DipTrace to layout the PCB. I exported my schematic and un-routed board from Eagle into DipTrace, and after managed to get all the parts showing up properly. The only huge problem was that I wouldn't be able to modify my circuit because the schematic was in Eagle and the PCB was in DipTrace. My first "real" PCB I designed, pretty good job I guess. Manufactured by OSHPark, great quality and price. 18 | 19 | ##Code 20 | 21 | ###Graphing Program 22 | 23 | Adafruit wrote awesome driver and graphics libraries for their LCDs, which you can find on the LCD product pages. 24 | I wrote many programs for this board, the highlight of which is currently an accelerometer graphing program. Unfortunately, there isn't enough flash memory to use both the SD library and TouchScreen library. So you can't both log data *and* have on-screen controls. The program reads accelerometer data from the ADXL345, and displays it on the LCD via an interactive, color-coded interface. 25 | The graphing code works by storing two variables for each accelerometer axis(XYZ), a "old" value and "new" value. A line is drawn between the values, which are updated each time data is read. 26 | The code is heavily commented. 27 | The code also contains snippets to enable drawing circles. Lots of other stuff is commented out, for example if you want to enable SD card logging, comment out the touchscreen code and un-comment the SD card code. Read Adafruit's writeup of their graphics library! :) 28 | 29 | There are *two* versions of the code, one without any input from the MCP3008 (joysticks, voltage sensor, light sensor) and one with. The one without is faster. 30 | 31 | This code probably contains lots of stuff that I need specifically for this board, but you can probably figure it out. 32 | 33 | -------------------------------------------------------------------------------- /Code/AccelGraph_Original.ino: -------------------------------------------------------------------------------- 1 | //----------Touchscreen Controller Accel XYZ Graphing Program----------\\ 2 | //----------------Hyder Hasnain; Started July 27, 2013-----------------\\ 3 | //------------------Also records data on microSD card------------------\\ 4 | //-------------!!!CODE FOR SD CARD TAKES UP A LOT OF SPACE...----------\\ 5 | //-------------...SO IT IS COMMENTED-OUT IN THIS VERSION...------------\\ 6 | //---------------...TO MAKE ROOM FOR TOUCHSCREEN CODE!!!---------------\\ 7 | //--------!!!IF YOU WANT SD LOGGING, REMOVE TOUCHSCREEN CODE!!!--------\\ 8 | 9 | //--------ALL THE EXTRA COMMENTED CODE IS EXTRA, IF YOU WANT IT--------\\ 10 | 11 | //--------------------------------LIBRARIES----------------------------\\ 12 | 13 | #include 14 | #include 15 | #include 16 | #include 17 | #include 18 | #include 19 | //#include 20 | #include 21 | #include 22 | 23 | //-------------------------------DEFINITIONS---------------------------\\ 24 | 25 | #define LCD_CS A3 26 | #define LCD_CD A2 27 | #define LCD_WR A1 28 | #define LCD_RD A0 29 | //!!!***!!! 30 | #define LCD_RESET A3 //!!!change in your own code to something else!!!; I don't use this personally, so mine doesn't matter!!! 31 | //!!!***!!! 32 | #define YP A3 // must be an analog pin, use "An" notation! 33 | #define XM A2 // must be an analog pin, use "An" notation! 34 | #define YM 9 // can be a digital pin 35 | #define XP 8 // can be a digital pin 36 | 37 | #define TS_MINX 115 //min/max values for touchscreen 38 | #define TS_MINY 124 //!!!THIS IS UNIQUE FOR EVERY TOUCHSCREEN!!! 39 | #define TS_MAXX 914 40 | #define TS_MAXY 934 41 | 42 | #define MINPRESSURE 10 //min/max pressure for touchscreen 43 | #define MAXPRESSURE 1000 44 | 45 | Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); //assign ID to our accelerometer 46 | 47 | Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //define LCD connection pins 48 | TouchScreen ts = TouchScreen(XP, YP, XM, YM, 372); //define touchscreen connection pins 49 | 50 | //-------------------------------VARIABLES-----------------------------\\ 51 | 52 | int x_pos; //position along the graph x axis 53 | float y_pos_x; //current graph y axis position of X value 54 | float y_pos_x_old = 120; //old y axis position of X value 55 | float y_pos_y; //current graph y axis position of Y value 56 | float y_pos_y_old = 120; //old y axis position of Y value 57 | float y_pos_z; //current graph y axis position of Z value 58 | float y_pos_z_old = 120; //old y axis position of Z value 59 | byte x_scale = 1; //scale of graph x axis, controlled by touchscreen buttons 60 | byte y_scale = 1; 61 | int accel_x; //the XYZ values stored on the SD card 62 | int accel_y; 63 | int accel_z; 64 | byte displayHour; 65 | byte displayMinute; 66 | byte displaySecond; 67 | byte displayAMPM = 0; 68 | 69 | byte SD_CS = 10; //SPI CS pin for SD card 70 | 71 | //---------------------------------SETUP-------------------------------\\ 72 | 73 | void setup() 74 | { 75 | 76 | Serial.begin(57600); //for debugging 77 | 78 | //begin the LCD 79 | tft.reset(); 80 | tft.begin(); 81 | tft.setRotation(1); 82 | tft.fillScreen(TFTLCD_BLACK); 83 | 84 | //sync time with RTC 85 | setSyncProvider(RTC.get); 86 | 87 | if(!accel.begin()) //begin accel, check if it's working 88 | { 89 | tft.setCursor(150, 50); tft.setTextColor(TFTLCD_WHITE); 90 | tft.print("No ADXL345 detected"); 91 | while(1); 92 | } 93 | 94 | accel.setRange(ADXL345_RANGE_2_G); //set resolution of accelerometer 95 | 96 | /* 97 | //begin SD card 98 | pinMode(SD_CS, OUTPUT); 99 | SD.begin(SD_CS); 100 | 101 | //Place a new header on the log file each time the program runs 102 | File logFile = SD.open("LOG.csv", FILE_WRITE); 103 | if (logFile) 104 | { 105 | logFile.println(", , , ,"); 106 | String header = "Time, X, Y, Z"; 107 | logFile.println(header); 108 | logFile.close(); 109 | } 110 | */ 111 | 112 | tftDrawGraphObjects(); //draw graph objects 113 | tftDrawColorKey(); 114 | tftDrawXScaleButtons(); 115 | tftDrawYScaleButtons(); 116 | 117 | 118 | 119 | } 120 | 121 | //------------------------------MAIN PROGRAM--------------------------\\ 122 | 123 | void loop() 124 | { 125 | //---------MAIN 'FOR' LOOP! THIS IS WHERE ALL THE ACTION HAPPENS! HAS TO BE FAST!!!!!---------\\ 126 | 127 | 128 | for (x_pos = (11 + x_scale); x_pos <= 320; x_pos += x_scale) //go along every point on the x axis and do something, start over when finished 129 | { 130 | 131 | Point p = ts.getPoint(); //get touch point! 132 | pinMode(XM, OUTPUT); 133 | pinMode(YP, OUTPUT); 134 | p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.height()); //remap p.x and p.y to usable values 135 | p.y = map(p.y, TS_MINY, TS_MAXY, tft.width(), 0); 136 | 137 | if (p.z > MINPRESSURE && p.z < MAXPRESSURE) //if pressed enough 138 | { 139 | //!!!!!!!! X SCALE BUTTONS !!!!!!!! 140 | if ( (p.y >= 210 && p.y <= 230) && (p.x >= 0 && p.x <= 20) ) //if x "-" button pressed! 141 | { 142 | if (x_scale > 1) 143 | { 144 | x_scale --; //decrement x scale 145 | delay(70); 146 | tft.fillRect(256, 21, 6, 8, TFTLCD_BLACK); tft.setCursor(254, 21); tft.setTextSize(1); tft.setTextColor(TFTLCD_WHITE); tft.print(x_scale); //print the current x scale value 147 | break; //restart 'for' loop 148 | } 149 | } 150 | if ( (p.y >= 239 && p.y <= 259) && (p.x >= 0 && p.x <= 20) ) //if x "+" button pressed! 151 | { 152 | if (x_scale < 6) 153 | { 154 | x_scale ++; //increment x scale 155 | delay(70); 156 | tft.fillRect(256, 21, 6, 8, TFTLCD_BLACK); tft.setCursor(254, 21); tft.setTextSize(1); tft.setTextColor(TFTLCD_WHITE); tft.print(x_scale); //print the current x scale value 157 | break; //restart 'for' loop 158 | } 159 | } 160 | //!!!!!!!! Y SCALE BUTTONS !!!!!!!! 161 | if ( (p.y >= 266 && p.y <= 286) && (p.x >= 0 && p.x <= 20) ) //if x "-" button pressed! 162 | { 163 | if (y_scale > 1) 164 | { 165 | y_scale --; //decrement x scale 166 | delay(70); 167 | tft.fillRect(312, 21, 6, 8, TFTLCD_BLACK); tft.setCursor(311, 21); tft.setTextSize(1); tft.setTextColor(TFTLCD_WHITE); tft.print(y_scale); //print the current y scale value 168 | break; //restart 'for' loop 169 | } 170 | } 171 | if ( (p.y >= 295 && p.y <= 315) && (p.x >= 0 && p.x <= 20) ) //if x "+" button pressed! 172 | { 173 | if (y_scale < 8) 174 | { 175 | y_scale ++; //increment x scale 176 | delay(70); 177 | tft.fillRect(312, 21, 6, 8, TFTLCD_BLACK); tft.setCursor(310, 21); tft.setTextSize(1); tft.setTextColor(TFTLCD_WHITE); tft.print(y_scale); //print the current y scale value 178 | break; //restart 'for' loop 179 | } 180 | } 181 | } 182 | 183 | //get accel data 184 | sensors_event_t event; 185 | accel.getEvent(&event); 186 | //store accel data, convert 187 | /* accel_x = event.acceleration.x; //values to store onto SD card, these can only be ints, not floats, so we need separate variables! 188 | accel_y = event.acceleration.y; 189 | accel_z = event.acceleration.z; */ 190 | y_pos_x = ((-event.acceleration.x * (y_scale * 10)) + 120); //values to use when displaying on LCD, these are floats, for more precision! 191 | y_pos_y = ((-event.acceleration.y * (y_scale * 10)) + 120); // 120 is axis, so value is displacement from axis, scaled for better visisility! 192 | y_pos_z = ((-event.acceleration.z * (y_scale * 10)) + 120); 193 | 194 | /* //------------------------LCD DISPLAY CODE----------------------\\ 195 | //display accel data to LCD 196 | tft.setTextColor(TFTLCD_WHITE); tft.setTextSize(1); 197 | tft.setCursor(200, 30); 198 | tft.print("X New:"); tft.print(event.acceleration.x); 199 | tft.setCursor(200, 38); 200 | tft.print("Y New:"); tft.print(event.acceleration.y); 201 | tft.setCursor(200, 46); 202 | tft.print("Z New:"); tft.print(event.acceleration.z); 203 | */ 204 | 205 | /* 206 | //CODE FOR PLOTTING POINTS 207 | //plot "X" value 208 | tft.drawPixel(x_pos, y_pos_x, TFTLCD_GREEN); //plot single point 209 | tft.drawFastVLine(x_pos+1, y_pos_x-3, 6, TFTLCD_GREEN); //draw 'cursor' in front of point 210 | //plot "Y" value 211 | tft.drawPixel(x_pos, y_pos_y, TFTLCD_PINK); 212 | tft.drawFastVLine(x_pos+1, y_pos_y-3, 6, TFTLCD_PINK); 213 | //plot "Z" value 214 | tft.drawPixel(x_pos, y_pos_z, TFTLCD_RED); 215 | tft.drawFastVLine(x_pos+1, y_pos_z-3, 6, TFTLCD_RED); 216 | delay(150); 217 | //clear 'cursor' in front of point 218 | tft.drawFastVLine(x_pos+1, y_pos_x-3, 6, TFTLCD_BLACK); 219 | tft.drawFastVLine(x_pos+1, y_pos_y-3, 6, TFTLCD_BLACK); 220 | tft.drawFastVLine(x_pos+1, y_pos_z-3, 6, TFTLCD_BLACK); 221 | */ 222 | 223 | /* 224 | //CODE FOR PLOTTING CIRCLES 225 | //plot "X" value 226 | tft.drawCircle(x_pos, y_pos_x, 1, TFTLCD_GREEN); 227 | //plot "Y" value 228 | tft.drawCircle(x_pos, y_pos_y, 1, TFTLCD_PINK); 229 | //plot "Z" value 230 | tft.drawCircle(x_pos, y_pos_z, 1, TFTLCD_RED); 231 | delay(50); 232 | */ 233 | 234 | //CODE FOR PLOTTING CONTINUOUS LINES!!!!!!!!!!!! 235 | //Plot "X" value 236 | tft.drawLine(x_pos - x_scale, y_pos_x_old, x_pos, y_pos_x, TFTLCD_GREEN); 237 | //Plot "Y" value 238 | tft.drawLine(x_pos - x_scale, y_pos_y_old, x_pos, y_pos_y, TFTLCD_RED); 239 | //Plot "Z" value 240 | tft.drawLine(x_pos - x_scale, y_pos_z_old, x_pos, y_pos_z, TFTLCD_BLUE); 241 | 242 | //Draw preceding black 'boxes' to erase old plot lines, !!!WEIRD CODE TO COMPENSATE FOR BUTTONS AND COLOR KEY SO 'ERASER' DOESN'T ERASE BUTTONS AND COLOR KEY!!! 243 | if ((x_pos >= 198) && (x_pos <= 320)) //above x axis 244 | { 245 | tft.fillRect(x_pos+1, 28, 10, 92, TFTLCD_BLACK); //compensate for buttons! 246 | } 247 | else 248 | { 249 | tft.fillRect(x_pos+1, 0, 10, 120, TFTLCD_BLACK); //don't compensate for buttons! 250 | } 251 | if ((x_pos >= 254) && (x_pos <= 320)) //below x axis 252 | { 253 | tft.fillRect(x_pos+1, 121, 10, 88, TFTLCD_BLACK); 254 | } 255 | else 256 | { 257 | tft.fillRect(x_pos+1, 121, 10, 119, TFTLCD_BLACK); 258 | } 259 | 260 | tftDisplayTime(); 261 | 262 | if ( (y_pos_x == 120) || (y_pos_y == 120) || (y_pos_z == 120) ) 263 | { 264 | tft.drawFastHLine(10, 120, 310, TFTLCD_WHITE); // x axis 265 | } 266 | 267 | y_pos_x_old = y_pos_x; //set old y pos values to current y pos values 268 | y_pos_y_old = y_pos_y; 269 | y_pos_z_old = y_pos_z; 270 | 271 | //tft.fillRect(230, 30, 50, 24, TFTLCD_BLACK); //clear displayed accel data from LCD 272 | 273 | //tft.fillRect(230, 200, 70, 8, TFTLCD_BLACK); //clear displayed time 274 | 275 | /* 276 | //Record XYZ data to SD card 277 | String DataString = String(hour()) + ":" + String(minute()) + ":" + String(second()) + " , " + String(accel_x) + " , " + String(accel_y) + " , " + String(accel_z); 278 | File logFile = SD.open("LOG.csv", FILE_WRITE); //open log file on SD card 279 | if (logFile) 280 | { 281 | logFile.println(DataString); //print log date to file 282 | logFile.close(); //close log file 283 | } 284 | */ 285 | 286 | float rX = (event.acceleration.x / 10); 287 | float rY = (event.acceleration.y / 10); 288 | float rZ = (event.acceleration.z / 10); 289 | /* 290 | Serial.print("xValue= "); Serial.print(rX); 291 | Serial.print(" yValue= "); Serial.print(rY); 292 | Serial.print(" zValue= "); Serial.println(rZ); 293 | //delay(50); 294 | */ 295 | 296 | //delay(50); 297 | 298 | } 299 | 300 | tft.fillRect(208, 0, 112, 28, TFTLCD_BLACK); //erase XY buttons and any lines behind them 301 | tft.fillRect(254, 208, 66, 32, TFTLCD_BLACK); //erase time and color key and any stray lines behind them 302 | 303 | tftDrawXScaleButtons(); //redraw stuff 304 | tftDrawYScaleButtons(); 305 | tftDrawColorKey(); 306 | tftDrawGraphObjects(); 307 | 308 | //Completely clear out old plot points/lines 309 | //tft.fillRect(21, 0, 299, 119, TFTLCD_BLACK); 310 | //tft.fillRect(21, 111, 299, 119, TFTLCD_BLACK); 311 | 312 | 313 | } 314 | 315 | //-------------------------------FUNCTIONS---------------------------\\ 316 | 317 | void printDigits(int digits) // utility function for digital clock display: prints preceding colon and leading 0 318 | { 319 | tft.print(":"); 320 | if(digits < 10) 321 | tft.print('0'); 322 | tft.print(digits); 323 | } 324 | 325 | void tftDrawXScaleButtons() 326 | { 327 | //draw touch controls to change x axis resolution 328 | tft.fillRect(210, 0, 20, 20, TFTLCD_WHITE); //draw "-" box 329 | tft.fillRect(239, 0, 20, 20, TFTLCD_WHITE); //draw "+" box 330 | tft.setCursor(215, 3); tft.setTextColor(TFTLCD_GREEN); tft.setTextSize(2); tft.print("-"); //print "-" 331 | tft.setCursor(244, 3); tft.print("+"); 332 | tft.drawFastVLine(234, 0, 20, TFTLCD_WHITE); 333 | tft.setCursor(208, 21); tft.setTextColor(TFTLCD_WHITE); tft.setTextSize(1); tft.print("X Scale:"); tft.print(x_scale); 334 | } 335 | 336 | void tftDrawYScaleButtons() 337 | { 338 | //draw touch controls to change x axis resolution 339 | tft.fillRect(266, 0, 20, 20, TFTLCD_WHITE); //draw "-" box 340 | tft.fillRect(295, 0, 20, 20, TFTLCD_WHITE); //draw "+" box 341 | tft.setCursor(271, 3); tft.setTextColor(TFTLCD_RED); tft.setTextSize(2); tft.print("-"); //print "-" 342 | tft.setCursor(300, 3); tft.print("+"); 343 | tft.drawFastVLine(290, 0, 20, TFTLCD_WHITE); 344 | tft.setCursor(265, 21); tft.setTextColor(TFTLCD_WHITE); tft.setTextSize(1); tft.print("Y Scale:"); tft.print(y_scale); 345 | } 346 | 347 | 348 | void tftDrawColorKey() 349 | { 350 | //Display color key 351 | tft.setTextSize(1); tft.setTextColor(TFTLCD_WHITE); 352 | tft.fillRect(280, 216, 15, 8, TFTLCD_GREEN); tft.setCursor(296, 216); tft.print(" - X"); 353 | tft.fillRect(280, 224, 15, 8, TFTLCD_RED); tft.setCursor(296, 224); tft.print(" - Y"); 354 | tft.fillRect(280, 232, 15, 8, TFTLCD_BLUE); tft.setCursor(296, 232); tft.print(" - Z"); 355 | } 356 | 357 | void tftDrawGraphObjects() 358 | { 359 | //draw the graph objects 360 | tft.fillRect(11, 5, x_scale+1, 120, TFTLCD_BLACK); 361 | tft.fillRect(11, 121, x_scale+1, 119, TFTLCD_BLACK); 362 | tft.drawFastVLine(10, 5, 230, TFTLCD_WHITE); // y axis 363 | tft.drawFastHLine(10, 120, 310, TFTLCD_WHITE); // x axis 364 | tft.setTextColor(TFTLCD_YELLOW); tft.setTextSize(1); // set parameters for y axis labels 365 | tft.setCursor(3, 116); tft.print("0"); // "0" at center of ya axis 366 | tft.setCursor(3, 6); tft.print("+"); // "+' at top of y axis 367 | tft.setCursor(3, 228); tft.print("-"); // "-" at bottom of y axis 368 | 369 | } 370 | 371 | void tftDisplayTime() 372 | { 373 | //Display current time 374 | if (displayHour != hour()) //if hour has updated 375 | { 376 | tft.fillRect(254, 208, 18, 8, TFTLCD_BLACK); //clear out old hour 377 | if (hour() > 12) //since RTC reports time in 24 hour format, if greater than 12... 378 | { 379 | displayHour = hour() - 12; //set for PM 380 | } 381 | if (hour() >= 12) 382 | { 383 | displayAMPM = 1; //set for PM 384 | } 385 | if (hour() <= 12) 386 | { 387 | displayHour = hour(); //update hour //set for AM 388 | displayAMPM = 0; 389 | } 390 | } 391 | 392 | if (displayMinute != minute()) //if minute has updated 393 | { 394 | tft.fillRect(266, 208, 18, 8, TFTLCD_BLACK); //clear out old minute 395 | displayMinute = minute(); //update minute 396 | } 397 | 398 | if (displaySecond != second()) //if second has updated 399 | { 400 | tft.fillRect(284, 208, 18, 8, TFTLCD_BLACK); //clear out old second 401 | displaySecond = second(); //update second 402 | tft.drawFastVLine(x_pos, 117, 6, TFTLCD_PINK); 403 | } 404 | 405 | tft.setCursor(254, 208); tft.setTextColor(TFTLCD_WHITE); tft.setTextSize(1); //Set text position, color 406 | tft.print(displayHour); printDigits(displayMinute); printDigits(displaySecond); 407 | if (displayAMPM == 0) //if AM 408 | { 409 | tft.print(" AM"); 410 | } 411 | if (displayAMPM == 1) //if PM 412 | { 413 | tft.print(" PM"); 414 | } 415 | } 416 | -------------------------------------------------------------------------------- /Code/AccelGraph_MCP3008.ino: -------------------------------------------------------------------------------- 1 | //----------Touchscreen Controller Accel XYZ Graphing Program----------\\ 2 | //----------------Hyder Hasnain; Started July 27, 2013-----------------\\ 3 | //------------------Also records data on microSD card------------------\\ 4 | //-------------!!!CODE FOR SD CARD TAKES UP A LOT OF SPACE...----------\\ 5 | //-------------...SO IT IS COMMENTED-OUT IN THIS VERSION...------------\\ 6 | //---------------...TO MAKE ROOM FOR TOUCHSCREEN CODE!!!---------------\\ 7 | //--------!!!IF YOU WANT SD LOGGING, REMOVE TOUCHSCREEN CODE!!!--------\\ 8 | 9 | //--------ALL THE EXTRA COMMENTED CODE IS EXTRA, IF YOU WANT IT--------\\ 10 | 11 | //--------------------------------NOTES--------------------------------\\ 12 | //TFT Characters are 6x8 pixels 13 | //tft.fillRect(x, y, width, height, color); 14 | 15 | //--------------------------------LIBRARIES----------------------------\\ 16 | 17 | #include 18 | #include 19 | #include 20 | #include 21 | #include 22 | #include 23 | //#include 24 | #include 25 | #include 26 | #include 27 | 28 | //-------------------------------DEFINITIONS---------------------------\\ 29 | 30 | #define LCD_CS A3 31 | #define LCD_CD A2 32 | #define LCD_WR A1 33 | #define LCD_RD A0 34 | #define LCD_RESET A3 //change in your own code to something else!!!; I don't use this personally, so mine doesn't matter!!! 35 | #define YP A3 // must be an analog pin, use "AN" notation! 36 | #define XM A2 // must be an analog pin, use "AN" notation! 37 | #define YM 9 // can be a digital pin 38 | #define XP 8 // can be a digital pin 39 | 40 | #define TS_MINX 115 //min/max values for touchscreen 41 | #define TS_MINY 124 //!!!Unique for every touchscreen!!! 42 | #define TS_MAXX 914 43 | #define TS_MAXY 934 44 | 45 | #define MINPRESSURE 10 //min/max pressure for touchscreen 46 | #define MAXPRESSURE 1000 47 | 48 | //MCP3008 (analog port expander) stuff 49 | #define ADC_CS_PIN A1 50 | #define ADC_CLOCK_PIN 13 51 | #define ADC_MOSI_PIN 11 52 | #define ADC_MISO_PIN 12 53 | 54 | MCP3008 adc(ADC_CLOCK_PIN, ADC_MOSI_PIN, ADC_MISO_PIN, ADC_CS_PIN); 55 | 56 | Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345); //assign ID to our accelerometer 57 | 58 | Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); //define LCD connection pins 59 | TouchScreen ts = TouchScreen(XP, YP, XM, YM, 372); //define touchscreen connection pins 60 | 61 | //-------------------------------VARIABLES-----------------------------\\ 62 | 63 | int x_pos; //position along the graph x axis 64 | float y_pos_x; //current graph y axis position of X value 65 | float y_pos_x_old = 120; //old y axis position of X value 66 | float y_pos_y; //current graph y axis position of Y value 67 | float y_pos_y_old = 120; //old y axis position of Y value 68 | float y_pos_z; //current graph y axis position of Z value 69 | float y_pos_z_old = 120; //old y axis position of Z value 70 | byte x_scale = 1; //scale of graph x axis, controlled by touchscreen buttons 71 | byte y_scale = 1; 72 | int accel_x; //the XYZ values stored on the SD card 73 | int accel_y; 74 | int accel_z; 75 | byte displayHour; 76 | byte displayMinute; 77 | byte displaySecond; 78 | byte displayAMPM = 0; 79 | int displayADC1; 80 | int displayADC2; 81 | int displayADC3; 82 | int displayADC4; 83 | int displayADC5; 84 | int displayADC6; 85 | int displayADC7; 86 | int displayADC8; 87 | 88 | byte SD_CS = 10; //SPI CS pin for SD card 89 | 90 | //---------------------------------SETUP-------------------------------\\ 91 | 92 | void setup() 93 | { 94 | Serial.begin(57600); //for debugging 95 | 96 | //begin the LCD 97 | tft.reset(); 98 | tft.begin(); 99 | tft.setRotation(1); 100 | tft.fillScreen(TFTLCD_BLACK); 101 | 102 | //sync time with RTC 103 | setSyncProvider(RTC.get); 104 | 105 | if(!accel.begin()) //begin accel, check if it's working 106 | { 107 | tft.setCursor(150, 50); 108 | tft.setTextColor(TFTLCD_WHITE); 109 | tft.print("No ADXL345 detected"); 110 | while(1); 111 | } 112 | 113 | accel.setRange(ADXL345_RANGE_2_G); //set resolution of accelerometer 114 | 115 | /* 116 | //begin SD card 117 | pinMode(SD_CS, OUTPUT); 118 | SD.begin(SD_CS); 119 | 120 | //Place a new header on the log file each time the program runs 121 | File logFile = SD.open("LOG.csv", FILE_WRITE); 122 | if (logFile) 123 | { 124 | logFile.println(", , , ,"); 125 | String header = "Time, X, Y, Z"; 126 | logFile.println(header); 127 | logFile.close(); 128 | } 129 | */ 130 | 131 | tftDrawGraphObjects(); //draw graph objects 132 | tftDrawColorKey(); 133 | tftDrawXScaleButtons(); 134 | tftDrawYScaleButtons(); 135 | } 136 | 137 | //------------------------------MAIN PROGRAM--------------------------\\ 138 | 139 | void loop() 140 | { 141 | //---------MAIN 'FOR' LOOP! THIS IS WHERE ALL THE ACTION HAPPENS! HAS TO BE FAST!!!!!---------\\ 142 | 143 | for (x_pos = (11 + x_scale); x_pos <= 320; x_pos += x_scale) //go along every point on the x axis and do something, start over when finished 144 | { 145 | 146 | Point p = ts.getPoint(); //get touch point! 147 | pinMode(XM, OUTPUT); 148 | pinMode(YP, OUTPUT); 149 | p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.height()); //remap p.x and p.y to usable values 150 | p.y = map(p.y, TS_MINY, TS_MAXY, tft.width(), 0); 151 | 152 | if (p.z > MINPRESSURE && p.z < MAXPRESSURE) //if pressed enough 153 | { 154 | //!!!!!!!! X SCALE BUTTONS !!!!!!!! 155 | if ( (p.y >= 210 && p.y <= 230) && (p.x >= 0 && p.x <= 20) ) //if x "-" button pressed! 156 | { 157 | if (x_scale > 1) 158 | { 159 | x_scale --; //decrement x scale 160 | delay(30); 161 | tft.fillRect(256, 21, 6, 8, TFTLCD_BLACK); 162 | tft.setCursor(254, 21); 163 | tft.setTextSize(1); 164 | tft.setTextColor(TFTLCD_WHITE); 165 | tft.print(x_scale); //print the current x scale value 166 | break; //restart 'for' loop 167 | } 168 | } 169 | if ( (p.y >= 239 && p.y <= 259) && (p.x >= 0 && p.x <= 20) ) //if x "+" button pressed! 170 | { 171 | if (x_scale < 6) 172 | { 173 | x_scale ++; //increment x scale 174 | delay(30); 175 | tft.fillRect(256, 21, 6, 8, TFTLCD_BLACK); 176 | tft.setCursor(254, 21); 177 | tft.setTextSize(1); 178 | tft.setTextColor(TFTLCD_WHITE); 179 | tft.print(x_scale); //print the current x scale value 180 | break; //restart 'for' loop 181 | } 182 | } 183 | //!!!!!!!! Y SCALE BUTTONS !!!!!!!! 184 | if ( (p.y >= 266 && p.y <= 286) && (p.x >= 0 && p.x <= 20) ) //if x "-" button pressed! 185 | { 186 | if (y_scale > 1) 187 | { 188 | y_scale --; //decrement x scale 189 | delay(30); 190 | tft.fillRect(312, 21, 6, 8, TFTLCD_BLACK); 191 | tft.setCursor(311, 21); 192 | tft.setTextSize(1); 193 | tft.setTextColor(TFTLCD_WHITE); 194 | tft.print(y_scale); //print the current y scale value 195 | break; //restart 'for' loop 196 | } 197 | } 198 | if ( (p.y >= 295 && p.y <= 315) && (p.x >= 0 && p.x <= 20) ) //if x "+" button pressed! 199 | { 200 | if (y_scale < 8) 201 | { 202 | y_scale ++; //increment x scale 203 | delay(30); 204 | tft.fillRect(312, 21, 6, 8, TFTLCD_BLACK); 205 | tft.setCursor(310, 21); 206 | tft.setTextSize(1); 207 | tft.setTextColor(TFTLCD_WHITE); 208 | tft.print(y_scale); //print the current y scale value 209 | break; //restart 'for' loop 210 | } 211 | } 212 | } 213 | 214 | //get accel data 215 | sensors_event_t event; 216 | accel.getEvent(&event); 217 | //store accel data, convert 218 | /* accel_x = event.acceleration.x; //values to store onto SD card, these can only be ints, not floats, so we need separate variables! 219 | accel_y = event.acceleration.y; 220 | accel_z = event.acceleration.z; */ 221 | y_pos_x = ((-event.acceleration.x * (y_scale * 10)) + 120); //values to use when displaying on LCD, these are floats, for more precision! 222 | y_pos_y = ((-event.acceleration.y * (y_scale * 10)) + 120); // 120 is axis, so value is displacement from axis, scaled for better visisility! 223 | y_pos_z = ((-event.acceleration.z * (y_scale * 10)) + 120); 224 | 225 | /* //------------------------LCD DISPLAY CODE----------------------\\ 226 | //display accel data to LCD 227 | tft.setTextColor(TFTLCD_WHITE); tft.setTextSize(1); 228 | tft.setCursor(200, 30); 229 | tft.print("X New:"); tft.print(event.acceleration.x); 230 | tft.setCursor(200, 38); 231 | tft.print("Y New:"); tft.print(event.acceleration.y); 232 | tft.setCursor(200, 46); 233 | tft.print("Z New:"); tft.print(event.acceleration.z); 234 | */ 235 | 236 | /* 237 | //CODE FOR PLOTTING POINTS 238 | //plot "X" value 239 | tft.drawPixel(x_pos, y_pos_x, TFTLCD_GREEN); //plot single point 240 | tft.drawFastVLine(x_pos+1, y_pos_x-3, 6, TFTLCD_GREEN); //draw 'cursor' in front of point 241 | //plot "Y" value 242 | tft.drawPixel(x_pos, y_pos_y, TFTLCD_PINK); 243 | tft.drawFastVLine(x_pos+1, y_pos_y-3, 6, TFTLCD_PINK); 244 | //plot "Z" value 245 | tft.drawPixel(x_pos, y_pos_z, TFTLCD_RED); 246 | tft.drawFastVLine(x_pos+1, y_pos_z-3, 6, TFTLCD_RED); 247 | delay(150); 248 | //clear 'cursor' in front of point 249 | tft.drawFastVLine(x_pos+1, y_pos_x-3, 6, TFTLCD_BLACK); 250 | tft.drawFastVLine(x_pos+1, y_pos_y-3, 6, TFTLCD_BLACK); 251 | tft.drawFastVLine(x_pos+1, y_pos_z-3, 6, TFTLCD_BLACK); 252 | */ 253 | 254 | /* 255 | //CODE FOR PLOTTING CIRCLES 256 | //plot "X" value 257 | tft.drawCircle(x_pos, y_pos_x, 1, TFTLCD_GREEN); 258 | //plot "Y" value 259 | tft.drawCircle(x_pos, y_pos_y, 1, TFTLCD_PINK); 260 | //plot "Z" value 261 | tft.drawCircle(x_pos, y_pos_z, 1, TFTLCD_RED); 262 | delay(50); 263 | */ 264 | 265 | //CODE FOR PLOTTING CONTINUOUS LINES!!!!!!!!!!!! 266 | //Plot "X" value 267 | tft.drawLine(x_pos - x_scale, y_pos_x_old, x_pos, y_pos_x, TFTLCD_GREEN); 268 | //Plot "Y" value 269 | tft.drawLine(x_pos - x_scale, y_pos_y_old, x_pos, y_pos_y, TFTLCD_RED); 270 | //Plot "Z" value 271 | tft.drawLine(x_pos - x_scale, y_pos_z_old, x_pos, y_pos_z, TFTLCD_BLUE); 272 | 273 | //Draw preceding black 'boxes' to erase old plot lines, !!!WEIRD CODE TO COMPENSATE FOR BUTTONS AND COLOR KEY SO 'ERASER' DOESN'T ERASE BUTTONS AND COLOR KEY!!! 274 | if ((x_pos >= 198) && (x_pos <= 320)) //above x axis 275 | { 276 | tft.fillRect(x_pos+1, 28, 10, 92, TFTLCD_BLACK); //compensate for buttons! 277 | } 278 | else 279 | { 280 | tft.fillRect(x_pos+1, 0, 10, 120, TFTLCD_BLACK); //don't compensate for buttons! 281 | } 282 | if ((x_pos >= 254) && (x_pos <= 320)) //below x axis 283 | { 284 | tft.fillRect(x_pos+1, 121, 10, 88, TFTLCD_BLACK); 285 | } 286 | else 287 | { 288 | tft.fillRect(x_pos+1, 121, 10, 119, TFTLCD_BLACK); 289 | } 290 | 291 | tftDisplayTime(); 292 | 293 | if ( (y_pos_x == 120) || (y_pos_y == 120) || (y_pos_z == 120) ) 294 | { 295 | tft.drawFastHLine(10, 120, 310, TFTLCD_WHITE); // x axis 296 | } 297 | 298 | y_pos_x_old = y_pos_x; //set old y pos values to current y pos values 299 | y_pos_y_old = y_pos_y; 300 | y_pos_z_old = y_pos_z; 301 | 302 | //tft.fillRect(230, 30, 50, 24, TFTLCD_BLACK); //clear displayed accel data from LCD 303 | 304 | //tft.fillRect(230, 200, 70, 8, TFTLCD_BLACK); //clear displayed time 305 | 306 | /* 307 | //Record XYZ data to SD card 308 | String DataString = String(hour()) + ":" + String(minute()) + ":" + String(second()) + " , " + String(accel_x) + " , " + String(accel_y) + " , " + String(accel_z); 309 | File logFile = SD.open("LOG.csv", FILE_WRITE); //open log file on SD card 310 | if (logFile) 311 | { 312 | logFile.println(DataString); //print log date to file 313 | logFile.close(); //close log file 314 | } 315 | */ 316 | /* 317 | float rX = (event.acceleration.x / 10); 318 | float rY = (event.acceleration.y / 10); 319 | float rZ = (event.acceleration.z / 10); 320 | Serial.print("xValue= "); Serial.print(rX); 321 | Serial.print(" yValue= "); Serial.print(rY); 322 | Serial.print(" zValue= "); Serial.println(rZ); 323 | //delay(50); 324 | */ 325 | 326 | //CODE FOR PRINTING MCP3008 ANALOG VALUES!! 327 | int Ch1Val = adc.readADC(0); //Read all values 328 | int Ch2Val = adc.readADC(1); 329 | int Ch3Val = adc.readADC(2); 330 | int Ch4Val = adc.readADC(3); 331 | int Ch5Val = adc.readADC(4); 332 | int Ch6Val = adc.readADC(5); 333 | int Ch7Val = adc.readADC(6); 334 | int Ch8Val = adc.readADC(7); 335 | 336 | if (displayADC1 != Ch1Val) //Checking to see if displayed values should be updated... 337 | { 338 | tft.fillRect(25, 220, 30, 8, TFTLCD_BLACK); 339 | } 340 | 341 | if (displayADC2 != Ch2Val) 342 | { 343 | tft.fillRect(55, 220, 30, 8, TFTLCD_BLACK); 344 | } 345 | 346 | if (displayADC3 != Ch3Val) 347 | { 348 | tft.fillRect(85, 220, 30, 8, TFTLCD_BLACK); 349 | } 350 | 351 | if (displayADC4 != Ch4Val) 352 | { 353 | tft.fillRect(115, 220, 30, 8, TFTLCD_BLACK); 354 | } 355 | 356 | if (displayADC5 != Ch5Val) 357 | { 358 | tft.fillRect(145, 220, 30, 8, TFTLCD_BLACK); 359 | } 360 | 361 | if (displayADC6 != Ch6Val) 362 | { 363 | tft.fillRect(175, 220, 30, 8, TFTLCD_BLACK); 364 | } 365 | 366 | if (displayADC7 != Ch7Val) 367 | { 368 | tft.fillRect(205, 220, 30, 8, TFTLCD_BLACK); 369 | } 370 | 371 | if (displayADC8 != Ch8Val) 372 | { 373 | tft.fillRect(235, 220, 30, 8, TFTLCD_BLACK); 374 | } 375 | 376 | tft.setTextColor(TFTLCD_WHITE); //Actually Print all values! 377 | tft.setTextSize(1); 378 | tft.setCursor(25, 220); tft.print(Ch1Val); tft.print(" "); 379 | tft.setCursor(55, 220); tft.print(Ch2Val); tft.print(" "); 380 | tft.setCursor(85, 220); tft.print(Ch3Val); tft.print(" "); 381 | tft.setCursor(115, 220); tft.print(Ch4Val); tft.print(" "); 382 | tft.setCursor(145, 220); tft.print(Ch5Val); tft.print(" "); 383 | tft.setCursor(175, 220); tft.print(Ch6Val); tft.print(" "); 384 | tft.setCursor(205, 220); tft.print(Ch7Val); tft.print(" "); 385 | tft.setCursor(235, 220); tft.print(Ch8Val); 386 | 387 | //Set value to compare from 388 | displayADC1 = Ch1Val; displayADC2 = Ch2Val; displayADC3 = Ch3Val; displayADC4 = Ch4Val; 389 | displayADC5 = Ch5Val; displayADC6 = Ch6Val; displayADC7 = Ch7Val; displayADC8 = Ch8Val; 390 | 391 | delay(5); 392 | 393 | /* 394 | Serial.print("L Joystick U/D: "); Serial.print(Ch1Val); 395 | Serial.print(" L Joystick R/L: "); Serial.print(Ch2Val); 396 | Serial.print(" R Joystick U/D: "); Serial.print(Ch3Val); 397 | Serial.print(" L Joystick U/D: "); Serial.print(Ch4Val); 398 | Serial.print(" L Joystick Button: "); Serial.print(Ch5Val); 399 | Serial.print(" L Joystick Button: "); Serial.print(Ch6Val); 400 | Serial.print(" Light Sensor: "); Serial.print(Ch7Val); 401 | Serial.print(" Battery: "); Serial.println(Ch8Val); 402 | delay(5); 403 | */ 404 | 405 | } //END OF FOR LOOP 406 | 407 | tft.fillRect(208, 0, 112, 28, TFTLCD_BLACK); //erase XY buttons and any lines behind them 408 | tft.fillRect(254, 208, 66, 32, TFTLCD_BLACK); //erase time and color key and any stray lines behind them 409 | 410 | tftDrawXScaleButtons(); //redraw stuff 411 | tftDrawYScaleButtons(); 412 | tftDrawColorKey(); 413 | tftDrawGraphObjects(); 414 | 415 | //Completely clear out old plot points/lines 416 | //tft.fillRect(21, 0, 299, 119, TFTLCD_BLACK); 417 | //tft.fillRect(21, 111, 299, 119, TFTLCD_BLACK); 418 | 419 | 420 | } //END OF MAIN 421 | 422 | //-------------------------------FUNCTIONS---------------------------\\ 423 | 424 | void printDigits(int digits) // utility function for digital clock display: prints preceding colon and leading 0 425 | { 426 | tft.print(":"); 427 | if(digits < 10) 428 | tft.print('0'); 429 | tft.print(digits); 430 | } 431 | 432 | void tftDrawXScaleButtons() 433 | { 434 | //draw touch controls to change x axis resolution 435 | tft.fillRect(210, 0, 20, 20, TFTLCD_WHITE); //draw "-" box 436 | tft.fillRect(239, 0, 20, 20, TFTLCD_WHITE); //draw "+" box 437 | tft.setCursor(215, 3); 438 | tft.setTextColor(TFTLCD_GREEN); 439 | tft.setTextSize(2); 440 | tft.print("-"); //print "-" 441 | tft.setCursor(244, 3); 442 | tft.print("+"); 443 | tft.drawFastVLine(234, 0, 20, TFTLCD_WHITE); 444 | tft.setCursor(208, 21); 445 | tft.setTextColor(TFTLCD_WHITE); 446 | tft.setTextSize(1); 447 | tft.print("X Scale:"); 448 | tft.print(x_scale); 449 | } 450 | 451 | void tftDrawYScaleButtons() 452 | { 453 | //draw touch controls to change x axis resolution 454 | tft.fillRect(266, 0, 20, 20, TFTLCD_WHITE); //draw "-" box 455 | tft.fillRect(295, 0, 20, 20, TFTLCD_WHITE); //draw "+" box 456 | tft.setCursor(271, 3); 457 | tft.setTextColor(TFTLCD_RED); 458 | tft.setTextSize(2); 459 | tft.print("-"); //print "-" 460 | tft.setCursor(300, 3); 461 | tft.print("+"); 462 | tft.drawFastVLine(290, 0, 20, TFTLCD_WHITE); 463 | tft.setCursor(265, 21); 464 | tft.setTextColor(TFTLCD_WHITE); 465 | tft.setTextSize(1); 466 | tft.print("Y Scale:"); 467 | tft.print(y_scale); 468 | } 469 | 470 | 471 | void tftDrawColorKey() 472 | { 473 | //Display color key 474 | tft.setTextSize(1); 475 | tft.setTextColor(TFTLCD_WHITE); 476 | tft.fillRect(280, 216, 15, 8, TFTLCD_GREEN); 477 | tft.setCursor(296, 216); 478 | tft.print(" - X"); 479 | tft.fillRect(280, 224, 15, 8, TFTLCD_RED); 480 | tft.setCursor(296, 224); 481 | tft.print(" - Y"); 482 | tft.fillRect(280, 232, 15, 8, TFTLCD_BLUE); 483 | tft.setCursor(296, 232); 484 | tft.print(" - Z"); 485 | } 486 | 487 | void tftDrawGraphObjects() 488 | { 489 | //draw the graph objects 490 | tft.fillRect(11, 5, x_scale+1, 120, TFTLCD_BLACK); 491 | tft.fillRect(11, 121, x_scale+1, 119, TFTLCD_BLACK); 492 | tft.drawFastVLine(10, 5, 230, TFTLCD_WHITE); // y axis 493 | tft.drawFastHLine(10, 120, 310, TFTLCD_WHITE); // x axis 494 | tft.setTextColor(TFTLCD_YELLOW); 495 | tft.setTextSize(1); // set parameters for y axis labels 496 | tft.setCursor(3, 116); 497 | tft.print("0"); // "0" at center of ya axis 498 | tft.setCursor(3, 6); 499 | tft.print("+"); // "+' at top of y axis 500 | tft.setCursor(3, 228); 501 | tft.print("-"); // "-" at bottom of y axis 502 | 503 | } 504 | 505 | void tftDisplayTime() 506 | { 507 | //Display current time 508 | if (displayHour != hour()) //if hour has updated 509 | { 510 | tft.fillRect(254, 208, 18, 8, TFTLCD_BLACK); //clear out old hour 511 | if (hour() > 12) //since RTC reports time in 24 hour format, if greater than 12... 512 | { 513 | displayHour = hour() - 12; //set for PM 514 | } 515 | if (hour() >= 12) 516 | { 517 | displayAMPM = 1; //set for PM 518 | } 519 | if (hour() <= 12) 520 | { 521 | displayHour = hour(); //update hour //set for AM 522 | displayAMPM = 0; 523 | } 524 | } 525 | 526 | if (displayMinute != minute()) //if minute has updated 527 | { 528 | tft.fillRect(266, 208, 18, 8, TFTLCD_BLACK); //clear out old minute 529 | displayMinute = minute(); //update minute 530 | } 531 | 532 | if (displaySecond != second()) //if second has updated 533 | { 534 | tft.fillRect(284, 208, 18, 8, TFTLCD_BLACK); //clear out old second 535 | displaySecond = second(); //update second 536 | tft.drawFastVLine(x_pos, 117, 6, TFTLCD_PINK); 537 | } 538 | 539 | tft.setCursor(254, 208); 540 | tft.setTextColor(TFTLCD_WHITE); 541 | tft.setTextSize(1); //Set text position, color 542 | tft.print(displayHour); 543 | printDigits(displayMinute); 544 | printDigits(displaySecond); 545 | if (displayAMPM == 0) //if AM 546 | { 547 | tft.print(" AM"); 548 | } 549 | if (displayAMPM == 1) //if PM 550 | { 551 | tft.print(" PM"); 552 | } 553 | } 554 | 555 | -------------------------------------------------------------------------------- /Schematic And Design/Eagle Board Unrouted.brd: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | <h3>SparkFun Electronics' preferred foot prints</h3> 135 | In this library you'll find anything that moves- switches, relays, buttons, potentiometers. Also, anything that goes on a board but isn't electrical in nature- screws, standoffs, etc.<br><br> 136 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 137 | <br><br> 138 | <b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | 148 | 149 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 180 | >Name 181 | >Value 182 | 183 | 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 194 | 195 | 196 | 197 | <b>OMRON SWITCH</b> 198 | 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 222 | >NAME 223 | 224 | 225 | 226 | 227 | 228 | 229 | <b>SMALL OUTLINE INTEGRATED CIRCUIT</b><p> 230 | wide body 7.5 mm/JEDEC MS-013AA 231 | 232 | 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 248 | 249 | 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | >NAME 259 | >VALUE 260 | 261 | 262 | 263 | 264 | 265 | 266 | 267 | 268 | 269 | 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 278 | <b>Dual In Line Package</b> 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 291 | 292 | 293 | 294 | 295 | 296 | 297 | 298 | 299 | 300 | 301 | >NAME 302 | >VALUE 303 | 304 | 305 | 306 | 307 | <h3>SparkFun Electronics' preferred foot prints</h3> 308 | In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br> 309 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 310 | <br><br> 311 | <b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 312 | 313 | 314 | 1/4W Resistor, 0.4" wide<p> 315 | 316 | Yageo CFR series <a href="http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf">http://www.yageo.com/pdf/yageo/Leaded-R_CFR_2008.pdf</a> 317 | 318 | 319 | 320 | 321 | 322 | 323 | >Name 324 | >Value 325 | 326 | 327 | 328 | 329 | <b>Micromega Corporation</b><p> 330 | Footprints for uM-FPU V3.1, uM-FPU64, and uM-PWM1 coprocessor chips. 331 | <p> 332 | For additional information see:<br> 333 | 334 | www.micromegacorp.com<p> 335 | 336 | 337 | <B>Dual In Line</B><p> 338 | package type P 339 | 340 | 341 | 342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | >NAME 364 | >VALUE 365 | 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 374 | 375 | 376 | 377 | 378 | 379 | 380 | 381 | 382 | 383 | 384 | 385 | 386 | 387 | 388 | 389 | 390 | 391 | 392 | 393 | 394 | 395 | 396 | 397 | 398 | 399 | 400 | 401 | 402 | 403 | 404 | 405 | 406 | 407 | 408 | 409 | 410 | 411 | 412 | 413 | 414 | 415 | 416 | 417 | 418 | 419 | 420 | 421 | 422 | 423 | 424 | 425 | 426 | 427 | 428 | 429 | 430 | 431 | 432 | 433 | 434 | 435 | 436 | 437 | 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 456 | 457 | 458 | 459 | 460 | 461 | 462 | 463 | 464 | 465 | 466 | 467 | 468 | 469 | 470 | 471 | 472 | 473 | 474 | 475 | 476 | 477 | 478 | 479 | 480 | 481 | 482 | 483 | 484 | 485 | 486 | 487 | 488 | 489 | 490 | 491 | 492 | 493 | 494 | 495 | 496 | 497 | 498 | 499 | 500 | 501 | 502 | 503 | 504 | 505 | 506 | 507 | 508 | 509 | 510 | 511 | 512 | 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 528 | 529 | 530 | 531 | 532 | 533 | 534 | 535 | 536 | 537 | 538 | 539 | 540 | 541 | 542 | 543 | 544 | 545 | 546 | 547 | 548 | 549 | 550 | 551 | 552 | 553 | 554 | 555 | 556 | 557 | 558 | 559 | 560 | 561 | 562 | 563 | 564 | 565 | 566 | 567 | 568 | 569 | 570 | 571 | 572 | 573 | 574 | 575 | 576 | 577 | 578 | 579 | 580 | 581 | 582 | 583 | 584 | 585 | 586 | 587 | 588 | 589 | 590 | 591 | 592 | 593 | 594 | 595 | 596 | 597 | 598 | 599 | 600 | 601 | 602 | 603 | 604 | 605 | 606 | 607 | 608 | 609 | 610 | 611 | 612 | 613 | 614 | 615 | 616 | 617 | 618 | 619 | 620 | 621 | 622 | 623 | 624 | 625 | 626 | 627 | 628 | 629 | 630 | 631 | 632 | 633 | 634 | 635 | 636 | 637 | 638 | 639 | 640 | 641 | 642 | 643 | 644 | 645 | 646 | 647 | 648 | 649 | 650 | 651 | 652 | 653 | 654 | 655 | 656 | 657 | 658 | 659 | 660 | 661 | 662 | 663 | 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | 675 | 676 | 677 | 678 | 679 | 680 | 681 | 682 | 683 | 684 | 685 | 686 | 687 | 688 | 689 | 690 | 691 | 692 | 693 | 694 | 695 | 696 | 697 | 698 | 699 | 700 | 701 | 702 | 703 | 704 | 705 | 706 | 707 | 708 | 709 | 710 | 711 | 712 | 713 | 714 | 715 | 716 | 717 | 718 | 719 | 720 | 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 729 | 730 | 731 | 732 | 733 | 734 | 735 | 736 | 737 | 738 | 739 | 740 | 741 | 742 | 743 | 744 | 745 | 746 | 747 | 748 | 749 | 750 | 751 | 752 | 753 | 754 | 755 | 756 | 757 | 758 | 759 | 760 | 761 | 762 | 763 | 764 | 765 | 766 | 767 | 768 | 769 | 770 | 771 | 772 | 773 | 774 | 775 | 776 | 777 | 778 | 779 | 780 | 781 | 782 | ADXL345_Breakout 783 | 784 | 785 | 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | 804 | 805 | 806 | 807 | 808 | 809 | 810 | 811 | 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 820 | 821 | 822 | 823 | 824 | 825 | 826 | 827 | 828 | 829 | 830 | 831 | 832 | 833 | 834 | 835 | 836 | 837 | 838 | 839 | 840 | 841 | 842 | 843 | 844 | 845 | 846 | 847 | 848 | 849 | 850 | 851 | 852 | 853 | 854 | 855 | 856 | 857 | 858 | 859 | 860 | 861 | 862 | 863 | 864 | 865 | 866 | 867 | 868 | 869 | 870 | 871 | 872 | 873 | 874 | 875 | 876 | 877 | 878 | 879 | 880 | 881 | 882 | 883 | 884 | 885 | 886 | 887 | 888 | 889 | 890 | 891 | 892 | 893 | 894 | 895 | 896 | 897 | 898 | 899 | 900 | 901 | 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 915 | 916 | 917 | 918 | 919 | 920 | 921 | 922 | 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 931 | 932 | 933 | 934 | 935 | 936 | 937 | 938 | 939 | 940 | 941 | 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 950 | 951 | 952 | 953 | 954 | 955 | 956 | 957 | 958 | 959 | 960 | 961 | 962 | 963 | 964 | 965 | 966 | 967 | 968 | 969 | 970 | 971 | 972 | 973 | 974 | 975 | 976 | 977 | 978 | 979 | 980 | 981 | 982 | 983 | 984 | 985 | 986 | 987 | 988 | 989 | 990 | 991 | 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 1002 | 1003 | 1004 | 1005 | 1006 | 1007 | 1008 | 1009 | 1010 | 1011 | 1012 | 1013 | 1014 | 1015 | 1016 | 1017 | 1018 | 1019 | 1020 | 1021 | 1022 | 1023 | 1024 | 1025 | 1026 | 1027 | 1028 | 1029 | 1030 | 1031 | 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 1042 | 1043 | 1044 | 1045 | 1046 | 1047 | 1048 | 1049 | 1050 | 1051 | 1052 | 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 1063 | 1064 | 1065 | 1066 | 1067 | 1068 | 1069 | 1070 | 1071 | 1072 | 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1080 | 1081 | 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 1088 | 1089 | 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | 1098 | 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 1105 | 1106 | 1107 | 1108 | 1109 | 1110 | 1111 | 1112 | 1113 | 1114 | 1115 | 1116 | 1117 | 1118 | 1119 | 1120 | 1121 | 1122 | 1123 | 1124 | 1125 | 1126 | 1127 | 1128 | 1129 | 1130 | 1131 | 1132 | 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | 1154 | 1155 | 1156 | 1157 | 1158 | 1159 | 1160 | 1161 | 1162 | 1163 | 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | 1170 | 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 1177 | 1178 | 1179 | 1180 | 1181 | 1182 | 1183 | 1184 | 1185 | 1186 | 1187 | 1188 | 1189 | <b>LEDs</b><p> 1190 | <author>Created by librarian@cadsoft.de</author><br> 1191 | Extended by Federico Battaglin <author>&lt;federico.rd@fdpinternational.com&gt;</author> with DUOLED 1192 | 1193 | 1194 | <B>LED</B><p> 1195 | 5 mm, round 1196 | 1197 | 1198 | 1199 | 1200 | 1201 | 1202 | 1203 | 1204 | 1205 | 1206 | 1207 | >NAME 1208 | >VALUE 1209 | 1210 | 1211 | 1212 | 1213 | <h3>SparkFun Electronics' preferred foot prints</h3> 1214 | In this library you'll find connectors and sockets- basically anything that can be plugged into or onto.<br><br> 1215 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 1216 | <br><br> 1217 | <b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 1218 | 1219 | 1220 | <b>USB Series Mini-B Surface Mounted</b> 1221 | 1222 | 1223 | 1224 | 1225 | 1226 | 1227 | 1228 | 1229 | 1230 | 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | >NAME 1238 | >VALUE 1239 | 1240 | 1241 | 1242 | 1243 | 1244 | 1245 | 1246 | 1247 | 1248 | 1249 | 1250 | 1251 | 1252 | 1253 | 1254 | 1255 | 1256 | 1257 | 1258 | 1259 | 1260 | 1261 | 1262 | 1263 | 1264 | 1265 | 1266 | 1267 | 1268 | 1269 | 1270 | 1271 | 1272 | 1273 | 1274 | 1275 | 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 1284 | 1285 | 1286 | 1287 | >NAME 1288 | >VALUE 1289 | GRN 1290 | BLK 1291 | 1292 | 1293 | 1294 | 1295 | 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | 1306 | 1307 | 1308 | >Name 1309 | >Value 1310 | + 1311 | - 1312 | 1313 | 1314 | 1315 | 1316 | <h3>SparkFun Electronics' preferred foot prints</h3> 1317 | In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br> 1318 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 1319 | <br><br> 1320 | <b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 1321 | 1322 | 1323 | 1324 | 1325 | 1326 | >Name 1327 | >Value 1328 | 1329 | 1330 | 1331 | 1332 | <h3>SparkFun Electronics' preferred foot prints</h3> 1333 | In this library you'll find resistors, capacitors, inductors, test points, jumper pads, etc.<br><br> 1334 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 1335 | <br><br> 1336 | <b>Licensing:</b> CC v3.0 Share-Alike You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 1337 | 1338 | 1339 | Small solder jumper with no paste layer so it will open after reflow. 1340 | 1341 | 1342 | 1343 | 1344 | 1345 | 1346 | 1347 | 1348 | >NAME 1349 | >VALUE 1350 | 1351 | 1352 | 1353 | 1354 | 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 1364 | 1365 | <b>EAGLE Design Rules</b> 1366 | <p> 1367 | Die Standard-Design-Rules sind so gewählt, dass sie für 1368 | die meisten Anwendungen passen. Sollte ihre Platine 1369 | besondere Anforderungen haben, treffen Sie die erforderlichen 1370 | Einstellungen hier und speichern die Design Rules unter 1371 | einem neuen Namen ab. 1372 | <b>EAGLE Design Rules</b> 1373 | <p> 1374 | The default Design Rules have been set to cover 1375 | a wide range of applications. Your particular design 1376 | may have different requirements, so please make the 1377 | necessary adjustments and save your customized 1378 | design rules under a new name. 1379 | 1380 | 1381 | 1382 | 1383 | 1384 | 1385 | 1386 | 1387 | 1388 | 1389 | 1390 | 1391 | 1392 | 1393 | 1394 | 1395 | 1396 | 1397 | 1398 | 1399 | 1400 | 1401 | 1402 | 1403 | 1404 | 1405 | 1406 | 1407 | 1408 | 1409 | 1410 | 1411 | 1412 | 1413 | 1414 | 1415 | 1416 | 1417 | 1418 | 1419 | 1420 | 1421 | 1422 | 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | 1430 | 1431 | 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | 1439 | 1440 | 1441 | 1442 | 1443 | 1444 | 1445 | 1446 | 1447 | 1448 | 1449 | 1450 | 1451 | 1452 | 1453 | 1454 | 1455 | 1456 | 1457 | 1458 | 1459 | 1460 | 1461 | 1462 | 1463 | 1464 | 1465 | 1466 | 1467 | 1468 | 1469 | 1470 | 1471 | 1472 | 1473 | 1474 | 1475 | 1476 | 1477 | 1478 | 1479 | 1480 | 1481 | 1482 | 1483 | 1484 | 1485 | 1486 | 1487 | 1488 | 1489 | 1490 | 1491 | 1492 | 1493 | 1494 | 1495 | 1496 | 1497 | 1498 | 1499 | 1500 | 1501 | 1502 | 1503 | 1504 | 1505 | 1506 | 1507 | 1508 | 1509 | 1510 | 1511 | 1512 | 1513 | 1514 | 1515 | 1516 | 1517 | 1518 | 1519 | 1520 | 1521 | 1522 | 1523 | 1524 | 1525 | 1526 | 1527 | 1528 | 1529 | 1530 | 1531 | 1532 | 1533 | 1534 | 1535 | 1536 | 1537 | 1538 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | 1564 | 1565 | 1566 | 1567 | 1568 | 1569 | 1570 | 1571 | 1572 | 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | 1603 | 1604 | 1605 | 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | 1613 | 1614 | 1615 | 1616 | 1617 | 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1645 | 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1657 | 1658 | 1659 | 1660 | 1661 | 1662 | 1663 | 1664 | 1665 | 1666 | 1667 | 1668 | 1669 | 1670 | 1671 | 1672 | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 1688 | 1689 | 1690 | 1691 | 1692 | 1693 | 1694 | 1695 | 1696 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1738 | 1739 | 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | 1752 | 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 1768 | 1769 | 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | 1783 | 1784 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 1802 | 1803 | 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1813 | 1814 | 1815 | 1816 | 1817 | 1818 | 1819 | 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 1828 | 1829 | 1830 | 1831 | 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 1854 | 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1885 | 1886 | 1887 | 1888 | 1889 | 1890 | 1891 | 1892 | 1893 | 1894 | 1895 | 1896 | 1897 | 1898 | 1899 | 1900 | 1901 | 1902 | 1903 | 1904 | 1905 | 1906 | 1907 | 1908 | 1909 | 1910 | 1911 | 1912 | 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 1919 | 1920 | 1921 | 1922 | 1923 | 1924 | 1925 | 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | 1932 | 1933 | 1934 | 1935 | 1936 | 1937 | 1938 | 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | 1945 | 1946 | 1947 | 1948 | 1949 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 | 1969 | 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | 1980 | 1981 | 1982 | 1983 | 1984 | 1985 | 1986 | 1987 | 1988 | 1989 | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | --------------------------------------------------------------------------------