Advertisement
Slyke

SONAR with 4x7 Segment display udpates.

Jan 2nd, 2014
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 14.68 KB | None | 0 0
  1. // Segment labelling:
  2. //        A
  3. //       ----
  4. //     F |  | B
  5. //       ---- G
  6. //     E |  | C
  7. //       ----   .H
  8. //        D
  9.  
  10. // 4x7 Segment Pin Layout:
  11. //             12        7
  12. //         -----------------------
  13. //         |   ~~  ~~  ~~  ~~    |
  14. //         |   ~   ~   ~   ~     |
  15. //         |   ~~. ~~. ~~. ~~.   |
  16. //         -----------------------
  17. //              1       6
  18.  
  19. // HC-SR04 SONAR Module Pin layout
  20. //         -----------------------
  21. //         |    _  HC-SR04  _    |
  22. //         |   / \         / \   |
  23. //         |   \ /  FRONT  \ /   |
  24. //         |                     |
  25. //         -----------------------
  26. //                1  2  3  4
  27.  
  28. //Pins for the HC-SR04 SONAR Module
  29. // Pin 1: VCC (+5v)
  30. // Pin 2: Trig (SONAR Trigger, TX)
  31. // Pin 3: Echo (SONAR Echo, RX)
  32. // Pin 4: GND
  33.  
  34. //Remember to use a 220ohm resistor on all cathodes if using 5v.
  35. //Pins on 4x7 Segment Display:
  36. // Pin 1:  E
  37. // Pin 2:  D
  38. // Pin 3:  H
  39. // Pin 4:  C
  40. // Pin 5:  G
  41. // Pin 6:  4th 7 Segment
  42. // Pin 7:  B
  43. // Pin 8:  3rd 7 Segment
  44. // Pin 9:  2nd 7 Segment
  45. // Pin 10: F
  46. // Pin 11: A
  47. // Pin 12: 1st 7 Segment
  48.  
  49. byte segmentPinCount=8; //Includes the . (Decimal place)
  50. byte segmentDisplayCount=4; //How many 7 segment displays do we have?
  51. byte sevenSegmentPins[8] = {2,3,4,5,6,7,8,9}; // A, B, C, D, E, F, G, H
  52. byte sevenSegmentCathodePins[4]={10,11,14,16}; //1st, 2nd, 3rd, 4th
  53.  
  54. byte triggerPin = 13; //SONAR trigger pin.
  55. byte echoPin = 12; //SONAR echo pin.
  56. byte sonarTimeTransmit = 2; //Time to transmit sound.
  57. byte sonarTimeDelay = 5; //How long to wait for echo.
  58. float calibrationRatio = 29.1;
  59. int displayThreshhold = 150; //The max number we want to display before sending out an error.
  60.  
  61. int delayTime = 4; // Time in ms to allow for pin state change.
  62. boolean bigEndian = true; //If the display can't fit the number, which end should we show?
  63. boolean serialCom = true; //Allow serial communication.
  64.  
  65. long serialData=0;
  66. long displayData=0;
  67.  
  68. byte sevenSegmentDisplay[40][8] = {
  69.   //A B C D E F G H
  70.   { 1,1,1,1,1,1,0,0 },  // = 0
  71.   { 0,1,1,0,0,0,0,0 },  // = 1
  72.   { 1,1,0,1,1,0,1,0 },  // = 2
  73.   { 1,1,1,1,0,0,1,0 },  // = 3
  74.   { 0,1,1,0,0,1,1,0 },  // = 4
  75.   { 1,0,1,1,0,1,1,0 },  // = 5
  76.   { 1,0,1,1,1,1,1,0 },  // = 6
  77.   { 1,1,1,0,0,0,0,0 },  // = 7
  78.   { 1,1,1,1,1,1,1,0 },  // = 8
  79.   { 1,1,1,0,0,1,1,0 },  // = 9
  80.   { 1,1,1,0,1,1,1,0 },  // = A
  81.   { 0,0,1,1,1,1,1,0 },  // = B
  82.   { 1,0,0,1,1,1,0,0 },  // = C
  83.   { 0,1,1,1,1,0,1,0 },  // = D
  84.   { 1,0,0,1,1,1,1,0 },  // = E
  85.   { 1,0,0,0,1,1,1,0 },  // = F
  86.   { 0,0,0,0,0,0,0,0 },  // = Clear
  87.   { 0,0,0,0,0,0,0,1 },  // = Clear. (With dot)
  88.   { 0,0,0,0,0,0,1,0 },  // = -
  89.   { 0,0,0,0,0,0,1,1 },  // = - . (With dot)
  90.   { 1,1,1,1,1,1,0,1 },  // = 0.
  91.   { 0,1,1,0,0,0,0,1 },  // = 1.
  92.   { 1,1,0,1,1,0,1,1 },  // = 2.
  93.   { 1,1,1,1,0,0,1,1 },  // = 3.
  94.   { 0,1,1,0,0,1,1,1 },  // = 4.
  95.   { 1,0,1,1,0,1,1,1 },  // = 5.
  96.   { 1,0,1,1,1,1,1,1 },  // = 6.
  97.   { 1,1,1,0,0,0,0,1 },  // = 7.
  98.   { 1,1,1,1,1,1,1,1 },  // = 8.
  99.   { 1,1,1,0,0,1,1,1 },  // = 9.
  100.   { 1,1,1,0,1,1,1,1 },  // = A.
  101.   { 0,0,1,1,1,1,1,1 },  // = B.
  102.   { 1,0,0,1,1,1,0,1 },  // = C.
  103.   { 0,1,1,1,1,0,1,1 },  // = D.
  104.   { 1,0,0,1,1,1,1,1 },  // = E.
  105.   { 1,0,0,0,1,1,1,1 },  // = F.
  106.   { 1,0,0,0,1,1,0,0 },  // = R
  107.   { 1,0,0,0,1,1,0,1 },  // = R.
  108.   { 0,0,0,0,1,0,1,0 },  // = r
  109.   { 0,0,0,0,1,0,1,1 }   // = r.
  110. };
  111.  
  112. void setup()
  113. {
  114.   for (byte pinSetup = 0; pinSetup < segmentPinCount; ++pinSetup) {
  115.     pinMode(sevenSegmentPins[pinSetup], OUTPUT); //Setup our control pins for output.
  116.   }
  117.  
  118.   for (byte segSetup = 0; segSetup < segmentDisplayCount; ++segSetup) {
  119.     pinMode(sevenSegmentCathodePins[segSetup], OUTPUT); //Setup our cathode power pins for each 7 segment display.
  120.   }
  121.  
  122.   pinMode(triggerPin, OUTPUT);
  123.   pinMode(echoPin, INPUT);
  124.  
  125.   if (serialCom) { Serial.begin(9600); } //Allow serial communication.
  126. }
  127.  
  128. void loop()
  129. {
  130.  
  131.   for (byte segSetup = 0; segSetup < segmentDisplayCount; ++segSetup) {
  132.     digitalWrite(sevenSegmentCathodePins[segSetup], HIGH); //Reset cathode control pins.
  133.   }
  134.   delayF(1);
  135.   if (Serial.available() > 0)
  136.   {
  137.     serialData = Serial.parseInt();
  138.     Serial.print("Recieved serial input: ");
  139.     Serial.println(serialData);
  140.     displayData = serialData;
  141.   }
  142.  
  143.   displayData=getSONARDistance();
  144.  
  145.   if (serialCom) {
  146.     Serial.print("Distance: ");
  147.     Serial.print(displayData);
  148.     Serial.println("cm");
  149.   }
  150.  
  151.   updateDisplay(displayData);
  152.  
  153. }
  154.  
  155. void updateDisplay(long theData)
  156. {
  157.   if (theData>displayThreshhold) { // Display ER0R.
  158.     setNumber(0, 14);
  159.     setNumber(1, 38);
  160.     setNumber(2, 0);
  161.     setNumber(3, 39);
  162.   } else {
  163.     displayNumber(displayData);
  164.   }
  165. }
  166.  
  167. void delayF(long period)
  168. {
  169.   for (long i=0;i<period;i++) {
  170.     updateDisplay(displayData); //Update screen to avoid flickering.
  171.     delay(1);
  172.   }
  173. }
  174.  
  175. long getSONARDistance()
  176. {
  177.   long timeDuration=0;
  178.   long distance=0;
  179.   digitalWrite(triggerPin, LOW);
  180.   delayF(sonarTimeTransmit);
  181.   digitalWrite(triggerPin, HIGH);
  182.   delayF(sonarTimeDelay);
  183.   digitalWrite(triggerPin, LOW);
  184.   timeDuration = pulseIn(echoPin, HIGH);
  185.   distance = (timeDuration/2) / calibrationRatio; // Divide by 2 to get half the full distance of the return trip.
  186.  
  187.   return distance;
  188. }
  189.  
  190. void displayNumber(long originalNumber)
  191. {
  192.   long newNumber=originalNumber;
  193.   byte digit=0;
  194.      
  195.   if (bigEndian) {
  196.     for (byte segSetup = segmentDisplayCount; segSetup > 0; --segSetup) {
  197.       digit = newNumber%10;
  198.      
  199.       if (newNumber > 0) {
  200.         setNumber(segSetup-1, digit);
  201.       }
  202.       else {
  203.         setNumber(segSetup-1, 0);
  204.       }
  205.       newNumber /= 10;
  206.     }
  207.   } else {
  208.     long tmpNum=0;
  209.     while (newNumber > 0) { //Reverse the integer.
  210.       tmpNum = tmpNum * 10 + (newNumber % 10);
  211.       newNumber = newNumber / 10;
  212.     }
  213.     newNumber=tmpNum;
  214.  
  215.     for (byte segSetup = 0; segSetup < segmentDisplayCount; ++segSetup) {
  216.       digit = newNumber%10;
  217.      
  218.       if (newNumber > 0) {
  219.         setNumber(segSetup, digit);
  220.       }
  221.       else {
  222.         setNumber(segSetup, 0);
  223.       }
  224.       newNumber /= 10;
  225.     }
  226.   }
  227.  
  228. }
  229.  
  230. void setNumber(byte pin, int x)
  231. {
  232.   digitalWrite(sevenSegmentCathodePins[pin], LOW);
  233.    switch(x){
  234.      case 1:
  235.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  236.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[1][segIndex]);
  237.        }
  238.        break;
  239.      case 2:
  240.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  241.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[2][segIndex]);
  242.        }
  243.        break;
  244.      case 3:
  245.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  246.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[3][segIndex]);
  247.        }
  248.        break;
  249.      case 4:
  250.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  251.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[4][segIndex]);
  252.        }
  253.        break;
  254.      case 5:
  255.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  256.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[5][segIndex]);
  257.        }
  258.        break;
  259.      case 6:
  260.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  261.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[6][segIndex]);
  262.        }
  263.        break;
  264.      case 7:
  265.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  266.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[7][segIndex]);
  267.        }
  268.        break;
  269.      case 8:
  270.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  271.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[8][segIndex]);
  272.        }
  273.        break;
  274.      case 9:
  275.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  276.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[9][segIndex]);
  277.        }
  278.        break;
  279.      case 0:
  280.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  281.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[0][segIndex]);
  282.        }
  283.        break;
  284.      case 10: //A
  285.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  286.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[10][segIndex]);
  287.        }
  288.        break;
  289.      case 11: //B
  290.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  291.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[11][segIndex]);
  292.        }
  293.        break;
  294.      case 12: //C
  295.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  296.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[12][segIndex]);
  297.        }
  298.        break;
  299.      case 13: //D
  300.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  301.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[13][segIndex]);
  302.        }
  303.        break;
  304.      case 14: //E
  305.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  306.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[14][segIndex]);
  307.        }
  308.        break;
  309.      case 15: //F
  310.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  311.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[15][segIndex]);
  312.        }
  313.        break;
  314.      case 16: // Clear
  315.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  316.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[16][segIndex]);
  317.        }
  318.        break;
  319.      case 17: // Clear . (With dot)
  320.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  321.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[17][segIndex]);
  322.        }
  323.        break;
  324.      case 18: // - (Dash)
  325.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  326.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[18][segIndex]);
  327.        }
  328.        break;
  329.      case 19: // - . (Dash with dot)
  330.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  331.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[19][segIndex]);
  332.        }
  333.        break;
  334.      case 20: //0 . (With dot)
  335.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  336.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[20][segIndex]);
  337.        }
  338.        break;
  339.      case 21: //1 . (With dot)
  340.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  341.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[21][segIndex]);
  342.        }
  343.        break;
  344.      case 22: //2 . (With dot)
  345.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  346.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[22][segIndex]);
  347.        }
  348.        break;
  349.      case 23: //3 . (With dot)
  350.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  351.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[23][segIndex]);
  352.        }
  353.        break;
  354.      case 24: //4 . (With dot)
  355.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  356.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[24][segIndex]);
  357.        }
  358.        break;
  359.      case 25: //5 . (With dot)
  360.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  361.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[25][segIndex]);
  362.        }
  363.        break;
  364.      case 26: //6 . (With dot)
  365.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  366.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[26][segIndex]);
  367.        }
  368.        break;
  369.      case 27: //7 . (With dot)
  370.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  371.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[27][segIndex]);
  372.        }
  373.        break;
  374.      case 28: //8 . (With dot)
  375.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  376.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[28][segIndex]);
  377.        }
  378.        break;
  379.      case 29: //9 . (With dot)
  380.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  381.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[29][segIndex]);
  382.        }
  383.        break;
  384.      case 30: //A . (With dot)
  385.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  386.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[30][segIndex]);
  387.        }
  388.        break;
  389.      case 31: //B . (With dot)
  390.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  391.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[31][segIndex]);
  392.        }
  393.        break;
  394.      case 32: //C . (With dot)
  395.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  396.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[32][segIndex]);
  397.        }
  398.        break;
  399.      case 33: //D . (With dot)
  400.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  401.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[33][segIndex]);
  402.        }
  403.        break;
  404.      case 34: //E . (With dot)
  405.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  406.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[34][segIndex]);
  407.        }
  408.        break;
  409.      case 35: //F . (With dot)
  410.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  411.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[35][segIndex]);
  412.        }
  413.        break;
  414.      case 36: //R
  415.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  416.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[36][segIndex]);
  417.        }
  418.        break;
  419.      case 37: //R . (With dot)
  420.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  421.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[37][segIndex]);
  422.        }
  423.        break;
  424.      case 38: //r
  425.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  426.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[38][segIndex]);
  427.        }
  428.        break;
  429.      case 39: //r . (With dot)
  430.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  431.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[39][segIndex]);
  432.        }
  433.        break;
  434.  
  435.      default: //Clear
  436.        for (byte segIndex = 0; segIndex < segmentPinCount; ++segIndex) {
  437.          digitalWrite(sevenSegmentPins[segIndex], sevenSegmentDisplay[16][segIndex]);
  438.        }
  439.        break;
  440.    }
  441.    delay (delayTime);
  442.    digitalWrite(sevenSegmentCathodePins[pin], HIGH);
  443. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement