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 Adriano Salvadori em 3 novembro 2016 às 20:49

Amigos sou novo aqui no lab. e inventei de querer fazer esse projeto da escada

estou usando um mega 2560 + modulo de rele 16

alterei o programa mas nao esta funcionando ..

sem passar nada na frente do sensor.. o mega, manda sinal pro modulo de rele ligar..

alguem pode me ajudar

 

#include <NewPing.h>


int led1 = 22;
int led2 = 23;
int led3 = 24;
int led4 = 25;
int led5 = 26;
int led6 = 27;
int led7 = 28;
int led8 = 29;
int led9 = 30;
int led10 = 31;
int led11 = 32;
int led12 = 33;
int led13 = 34;
int led14 = 35;
int led15 = 36;
int led16 = 37;

#define SONAR_NUM 2 // Define o numero de sensores
#define MAX_DISTANCE 200 // Distancia maxima
#define PING_INTERVAL 33 // Milisegundos de intervalo entre medicoes

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

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

int i = 1;
int totalSaidas = (22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37);
int t = 200; //tempo entre o acender dos leds.
int tempo = 2000; //tempo que fica aceso os leds para depois apagar.


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;


pinMode(led1,OUTPUT);
pinMode(led2,OUTPUT);
pinMode(led3,OUTPUT);
pinMode(led4,OUTPUT);
pinMode(led5,OUTPUT);
pinMode(led6,OUTPUT);
pinMode(led7,OUTPUT);
pinMode(led8,OUTPUT);
pinMode(led9,OUTPUT);
pinMode(led10,OUTPUT);
pinMode(led11,OUTPUT);
pinMode(led12,OUTPUT);
pinMode(led13,OUTPUT);
pinMode(led14,OUTPUT);
pinMode(led15,OUTPUT);
pinMode(led16,OUTPUT);
digitalWrite(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
for (uint8_t i = 0; i <SONAR_NUM; i++){
Serial.print(i);
Serial.print("=");
Serial.print(cm[i]);
Serial.print("cm ");
delay(1000);
Serial.println();
}

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

Comentário de Marcelo Bahl em 24 outubro 2014 às 13:11

Boa Tarde, eu fiz este esboço, achando que seria desta forma a conexão elétrica do projeto desta escada inteligente.

Aguardo retorno ou mesmo correções

Comentário de Marcelo Bahl em 24 outubro 2014 às 9:23

Outra pergunta você usa qual arduino o Uno R3, ou o 2560??

Comentário de Marcelo Bahl em 24 outubro 2014 às 9:05

Olá amigo, teria o esquema elétrico deste projeto ? pois possuo duas crianças pequenas que sempre levantam a noite e acabam chorando por estar escuto, gostaria de montar este projeto no quarto delas mas acionado por sensor de movimentos, seria possível: desde já vos agradeço

Forte abraço

Comentário de Ederlei Pereira Bispo em 19 março 2014 às 13:36

Oi Fabio!

Essa sensação é indescritível, principalmente quando idealizamos uma ideia, botando a mão na massa e fazendo acontecer do zero! Um abraço!

Comentário de Ederlei Pereira Bispo em 19 março 2014 às 13:34

Oi Marcelo! Muito obrigado!

Comentário de Fabio Cesar Massarico em 15 março 2014 às 18:23

Acho que nao tem nada mais maravilhoso que ver um projeto nosso ganhando vida. Parabens pela realização do projeto. E que muitos outros ainda sejam realizados.

Comentário de marceloboah em 15 março 2014 às 15:53

Sensacional, parabéns!!

Comentário de Ederlei Pereira Bispo em 28 fevereiro 2014 às 8:50

Olá Nelson!

Muito obrigado pelo elogio! Eu também não sei programar, mas sei a lógica utilizada. Então fui montando aos pouquinhos. Comecei com programação pra acender um led, depois pra apagar e assim foi. temos na internet vários tutoriais brasileiros com video aulas que mostram desde o hardware e a programação.

Um abraço e boa sorte!

Comentário de Ederlei Pereira Bispo em 28 fevereiro 2014 às 8:48

Olá Felipe!

Os leds ficam ligados por 20 segundos, depois se apagam. no vídeo coloquei a velocidade maior pois senão ficaria chato assisti-lo.

Então se a pessoa ficar mais de 20 segundos em uma escada de 15 degraus, realmente ela deve ficar no escuro hahahahaha

abs

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço