quinta-feira, 24 de janeiro de 2013

Sensor de distância Ultrasonico com o Atmega328 – Arduino.












Segue código que utilizei no projeto.

// O código original é o que está no link abaixo, fiz algumas adaptações para poder visualizar no display de sete seguimentos.
// Segue o código que adaptei. Janeiro de 2013
// Por: Marcelo Victorio.


//Pin connected to ST_CP of 74HC595
int latchPin = 8;
//Pin connected to SH_CP of 74HC595
int clockPin = 10;
////Pin connected to DS of 74HC595
int dataPin = 9;

////Pin Sensor Ultrasonic
#define trigPin 12
#define echoPin 13

//holders for infromation you're going to pass to shifting function
byte dataDISPA;
byte dataDISPB;
byte dataArrayDISPA[10];
byte dataArrayDISPB[10];

void setup() {
  //set pins to output because they are addressed in the main loop
  pinMode(latchPin, OUTPUT);
  Serial.begin(9600);

  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

//Marcelo - 26/08/2012

  dataArrayDISPA[0] = 0x3F; //00111111
  dataArrayDISPA[1] = 0x06; //00000110
  dataArrayDISPA[2] = 0x5B; //01011011
  dataArrayDISPA[3] = 0x4F; //01001111
  dataArrayDISPA[4] = 0x66; //01100110
  dataArrayDISPA[5] = 0x6D; //01101101
  dataArrayDISPA[6] = 0x7D; //01111101
  dataArrayDISPA[7] = 0x07; //00000111
  dataArrayDISPA[8] = 0x7F; //01111111
  dataArrayDISPA[9] = 0x67; //01100111

  dataArrayDISPB[0] = 0x3F; //00111111
  dataArrayDISPB[1] = 0x06; //00000110
  dataArrayDISPB[2] = 0x5B; //01011011
  dataArrayDISPB[3] = 0x4F; //01001111
  dataArrayDISPB[4] = 0x66; //01100110
  dataArrayDISPB[5] = 0x6D; //01101101
  dataArrayDISPB[6] = 0x7D; //01111101
  dataArrayDISPB[7] = 0x07; //00000111
  dataArrayDISPB[8] = 0x7F; //01111111
  dataArrayDISPB[9] = 0x67; //01100111

  //function that blinks all the LEDs
  //gets passed the number of blinks and the pause time
  blinkAll_2Bytes(2,500); 
}

void loop() {

  int duration, distance;

  digitalWrite(trigPin, LOW); 
  delayMicroseconds(2); 
  digitalWrite(trigPin, HIGH); 
  delayMicroseconds(10); 
  digitalWrite(trigPin, LOW); 
  duration = pulseIn(echoPin, HIGH); 
  distance = (duration/2) / 29.1;
  if (distance >= 200 || distance <= 0){
     distance = 0; 
  }
   

  //load the light sequence you want from array

  int jj = distance;

  int x = jj%10;
  int y = jj/10;

      dataDISPB = dataArrayDISPB[y];
      dataDISPA = dataArrayDISPA[x];
  
      //ground latchPin and hold low for as long as you are transmitting
      digitalWrite(latchPin, 0);
      //move 'em out
      shiftOut(dataPin, clockPin, dataDISPB);   
      shiftOut(dataPin, clockPin, dataDISPA);
      //return the latch pin high to signal chip that it 
      //no longer needs to listen for information
      digitalWrite(latchPin, 1);

    delay(800);
}



// the heart of the program
void shiftOut(int myDataPin, int myClockPin, byte myDataOut) {
  // This shifts 8 bits out MSB first, 
  //on the rising edge of the clock,
  //clock idles low

  //internal function setup
  int i=0;
  int pinState;
  pinMode(myClockPin, OUTPUT);
  pinMode(myDataPin, OUTPUT);

  //clear everything out just in case to
  //prepare shift register for bit shifting
  digitalWrite(myDataPin, 0);
  digitalWrite(myClockPin, 0);

  //for each bit in the byte myDataOut
  //NOTICE THAT WE ARE COUNTING DOWN in our for loop
  //This means that 000001 or "1" will go through such
  //that it will be pin Q0 that lights. 
  for (i=7; i>=0; i--)  {
    digitalWrite(myClockPin, 0);

    //if the value passed to myDataOut and a bitmask result 
    // true then... so if we are at i=6 and our value is
    // %11010100 it would the code compares it to %01000000 
    // and proceeds to set pinState to 1.
    if ( myDataOut & (1<<i) ) {
      pinState= 1;
    }
    else {
      pinState= 0;
    }

    //Sets the pin to HIGH or LOW depending on pinState
    digitalWrite(myDataPin, pinState);
    //register shifts bits on upstroke of clock pin  
    digitalWrite(myClockPin, 1);
    //zero the data pin after shift to prevent bleed through
    digitalWrite(myDataPin, 0);
  }

  //stop shifting
  digitalWrite(myClockPin, 0);
}


//blinks the whole register based on the number of times you want to 
//blink "n" and the pause between them "d"
//starts with a moment of darkness to make sure the first blink
//has its full visual effect.
void blinkAll_2Bytes(int n, int d) {
  digitalWrite(latchPin, 0);
  shiftOut(dataPin, clockPin, 0);
  shiftOut(dataPin, clockPin, 0);
  digitalWrite(latchPin, 1);
  delay(200);
  for (int x = 0; x < n; x++) {
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 255);
    shiftOut(dataPin, clockPin, 255);
    digitalWrite(latchPin, 1);
    delay(d);
    digitalWrite(latchPin, 0);
    shiftOut(dataPin, clockPin, 0);
    shiftOut(dataPin, clockPin, 0);
    digitalWrite(latchPin, 1);
    delay(d);
  }
}


Um comentário:

  1. ola , gostaria de saber qual a programação que foi utilizada neste projeto.

    ResponderExcluir