Escada Inteligente - A realização de um sonho

Oi pessoal!
Terminei meu projeto e gostaria de compartilha-lo com vocês:  smiley-mr-green

No primeiro vídeo, estava no processo de bancada ainda, veja como foi:

 

Depois percebi que aquela programação não funcionava quando colocava fonte de energia, aí fiz uma nova programação e instalei minha escada, veja no primeiro vídeo.

 

Os materiais que usei:

 

Peças

1 Arduino UNO com cabo USB (Atmega328)

2 74hc595
2 Protoboard BB-01 (840 Pontos)
2 sensores ultrasonicos HC-SR04
16 leds alto brilho (branco)
16 resistores 220 ohms
Kit 70 Jumpers macho para protoboard/matriz de contato

 

Ferramentas:

Maquita

Furadeira

Serrinha
Código fonte:

/*---------------------------------------------

 S H I F T O U T M E G A
 Ampliar o número de saídas do Arduino com
 Registrador de Deslocamento 74HC595
 --------------------------------------------*/

/*¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨
 - Pino 8 do Arduino ligado ao pino 12 do CI.
 - Pino 11 do Arduino ligado ao pino 14 do CI.
 - Pino 12 do Arduino ligado ao pino 11 do CI.
 - Led 1 = Pino 15 do CI.
 - Led 2 = Pino 1 do CI.
 - Led 3 = Pino 2 do CI.
 - Led 4 = Pino 3 do CI.
 - Led 5 = Pino 4 do CI.
 - Led 6 = Pino 5 do CI.
 - Led 7 = Pino 6 do CI.
 - Led 8 = Pino 7 do CI.
 - Pinos 10 e 16 do CI ligados ao Vcc.
 - Pinos 8 e 13 do CI ligados ao GND.
 - Pino 9 do CI ligado ao pino 14 do próximo CI.
 ¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨¨*/

#include <ShiftOutMega.h> //Inclui a biblioteca ShiftOutMega.h
#include <NewPing.h> // Inclui a biblioteca NewPing.h

//Variáveis de uso dos registradores 74HC595
int latchPin = 8;  //Pino 8 conectado ao pino 12 do 74HC595 (Latch).
int dataPin = 11;  //Pino 11 conectado ao pino 14 do 74HC595 (Data).
int clockPin = 12; //Pino 12 conectado ao pino 11 do 74HC595 (Clock).

//Define o numero de sensores, a distancia maxima e o intervalo da medição
#define SONAR_NUM   2 // Define o numero de sensores
#define MAX_DISTANCE 80 // Distancia maxima
#define PING_INTERVAL 33 // Milisegundos de intervalo entre medicoes (29ms e o tempo mínimo para evitar conflito entre os sensores)

unsigned long pingTimer[SONAR_NUM]; // Armazena a quantidade de vezes que a medicao deve ocorrer, para cada sensor
unsigned int cm[SONAR_NUM];     // Armazena o numero de medicoes
uint8_t currentSensor = 0;     // Armazena o sensor que esta ativo

//criando objeto e definindo as portas digitais do Trigger - 6 - e Echo - 7

NewPing sonar[SONAR_NUM] =
 {   // Armazena informacoes sobre a pinagem dos sensores
  NewPing(6, 7, MAX_DISTANCE), // Pino trigger, echo e distancia máxima, para cada sensor
  NewPing(3, 4, MAX_DISTANCE),
 };

//Quantidade de registradores (74HC595). Para cada registrador, temos 8 saídas.
int qtdRegistradores = 2;

int totalSaidas = qtdRegistradores * 8;
int t = 100; //tempo entre o acender dos leds.
int tempo = 2000; //tempo que fica aceso os leds para depois apagar.

//Inicia a biblioteca passando os parametros de uso.
ShiftOutMega mega(latchPin, dataPin, clockPin, qtdRegistradores);

void setup(){
Serial.begin(9600); //Inicializando o serial monitor
  pingTimer[0] = millis() + 75;      //Primeira medicao começa com 75ms
  for (uint8_t i = 1; i < SONAR_NUM; i++) //Define o tempo de inicializacao de cada sensor
   pingTimer[i] = pingTimer[i - 1] + PING_INTERVAL;

     //Apagando todos os leds
  mega.shiftWrite(totalSaidas, LOW);
 }

void loop() {
  for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop entre todos os sensores
   if (millis() >= pingTimer[i]) {
    pingTimer[i] += PING_INTERVAL * SONAR_NUM; //Define o tempo que o proximo sensor sera acionado
    if (i == 0 && currentSensor == SONAR_NUM - 1) oneSensorCycle(); // Ciclo do sensor completo
    sonar[currentSensor].timer_stop();     // Reseta o timer antes de ler o proximo sensor
    currentSensor = i;             // Número do sensor sendo acionado
    cm[currentSensor] = 0;           // Se nao houver eco do sensor, seta a distância como zero
    sonar[currentSensor].ping_timer(echoCheck);
   }
 }
}
 void echoCheck() { //Se receber um sinal (eco), calcula a distancia
  if (sonar[currentSensor].check_timer())
   cm[currentSensor] = sonar[currentSensor].ping_result / US_ROUNDTRIP_CM;
 }

 void oneSensorCycle() { // Ciclo de leitura do sensor

//Se for detectado objeto entre 0 e 10 cm do sensor1, acende leds
     if (cm[0] > 1 && cm[0] < 10){

    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, HIGH);
      delay(t);
    }
    delay(tempo);
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(i, LOW);
      delay(t);
    }
   }
//Se for detectado objeto entre 0 e 50 cm do sensor2, acende o led
     if (cm[1] > 1 && cm[1] < 10) {
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(totalSaidas+1-i, HIGH);
      delay(t);
    }
    delay(tempo);
    for (int i=1; i<=totalSaidas; i++){
      mega.shiftWrite(totalSaidas+1-i, LOW);
      delay(t);
  }
 }
}
Um abraço!

Exibições: 4339

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de Felipe Alexandre da Silva em 26 fevereiro 2014 às 0:35

Cara, ficou muito massa, mas você já pensou no caso da pessoa ficar parada uns 3 segundos no meio da escada por algum motivo especifico? as luzes apagariam e a pessoa ainda estaria lá 

Comentário de Nelson Afonso em 25 fevereiro 2014 às 22:12

Cara ficou muito show sua escada e sem falar (por mim é claro! sou ainda um "feto" em programação do arduino) na complexidade do codigo. Parabens

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço