// Linha 1: 0 0 0 1 1 0 0 0 -> 0x18
// Linha 2: 0 0 1 1 1 1 0 0 -> 0x3C
// Linha 3: 0 1 1 1 1 1 1 0 -> 0x7E
// Linha 4: 1 1 1 1 1 1 1 1 -> 0xFF
// Linha 5: 1 1 1 1 1 1 1 1 -> 0xFF
// Linha 6: 0 1 1 1 1 1 1 0 -> 0x7E
// Linha 7: 0 0 1 1 1 1 0 0 -> 0x3C
// Linha 8: 0 0 0 1 1 0 0 0 -> 0x18
//FRENTE
// Linha 1: 00111100 -> 0x3C
// Linha 2: 01000010 -> 0x42
// Linha 3: 01011010 -> 0x5A
// Linha 4: 10101101 -> 0xAD
// Linha 5: 10111101 -> 0xBD
// Linha 6: 10011001 -> 0x99
// Linha 7: 01000010 -> 0x42
// Linha 8: 00111100 -> 0x3C
//DIREITA
// Linha 1: 00111100 -> 0x3C
// Linha 2: 01000010 -> 0x42
// Linha 3: 01110010 -> 0X72
// Linha 4: 11011001 -> 0xD9
// Linha 5: 11111001 -> 0xF9
// Linha 6: 10110001 -> 0XB1
// Linha 7: 01000010 -> 0x42
// Linha 8: 00111100 -> 0x3C
//ESQUERDA
// Linha 1: 00111100 -> 0x3C
// Linha 2: 01000010 -> 0x42
// Linha 3: 01001110 -> 0X4E
// Linha 4: 10010111 -> 0x97
// Linha 5: 10011111 -> 0X9F
// Linha 6: 10001101 -> 0x8D
// Linha 7: 01000010 -> 0x42
// Linha 8: 00111100 -> 0x3C
#include <LedControl.h>
#include <NewPing.h>
// Pinos de conexão para os displays de LED
int DIN = 12;
int CS = 11;
int CLK = 10;
int currentState = -1;
// Pinos do primeiro sensor ultrassônico
#define TRIGGER_PIN_1 7
#define ECHO_PIN_1 6
// Pinos do segundo sensor ultrassônico
#define TRIGGER_PIN_2 5
#define ECHO_PIN_2 4
#define MAX_DISTANCE 200 // Distância máxima que o sensor pode medir (em cm)
// Inicializa o objeto LedControl para controlar dois displays
LedControl lc = LedControl(DIN, CLK, CS, 2);
// Inicializa os objetos NewPing para os sensores ultrassônicos
NewPing sonar1(TRIGGER_PIN_1, ECHO_PIN_1, MAX_DISTANCE);
NewPing sonar2(TRIGGER_PIN_2, ECHO_PIN_2, MAX_DISTANCE);
// Arrays que representam os rostos
byte SMILE[8] = {0x3C, 0x42, 0xA5, 0x81, 0xA5, 0x99, 0x42, 0x3C};
byte SAD[8] = {0x3C, 0x42, 0xA5, 0x81, 0x99, 0xA5, 0x42, 0x3C};
byte FRENTE[8] = {0x3C, 0x42, 0x5A, 0xAD, 0xBD, 0x99, 0x42, 0x3C};
byte DIREITA[8] = {0x3C, 0x42, 0X72, 0xD9, 0xF9, 0XB1, 0x42, 0x3C};
byte ESQUERDA[8] = {0x3C, 0x42, 0X4E, 0x97, 0X9F, 0x8D, 0x42, 0x3C};
void setup() {
// Configura os displays
for (int i = 0; i < 2; i++) {
lc.shutdown(i, false); // Liga o display
lc.setIntensity(i, 15); // Define o brilho máximo
lc.clearDisplay(i); // Limpa o display
}
currentState = 0;
}
void loop() {
delay(50); // Pequeno atraso para evitar leituras muito rápidas
// Medições das distâncias em cm
int distance1 = sonar1.ping_cm();
int distance2 = sonar2.ping_cm();
float difference = ( distance2 - distance1 );
if ( abs( difference ) < 15 || (distance1 == 0 && distance2 == 0 ) )
{
printByte(0, FRENTE);
printByte(1, FRENTE);
currentState = 0;
}
// Now if distance1 is greater than distance2 and distance1 is also greater than 0, then we want to look right
else if ( distance2 < distance1 && distance1 > 0)
{
printByte(0, DIREITA);
printByte(1, DIREITA);
currentState = 1;
}
// Now if distance2 is greater than distance1 and distance2 is also greater than 0, then we want to look left
else if ( distance1 < distance2 && distance2 > 0 )
{
printByte(0, ESQUERDA);
printByte(1, ESQUERDA);
currentState = 2;
}
// delay the loop for 250ms to ensure the eyes have time to display correctly
delay(250);
/*
if (distance1 > 0 && distance1 < 15) {
// Exibe rosto sorridente no display 0 se a distância do sensor 1 for menor que 15 cm
printByte(0, ESQUERDA);
} else {
// Limpa o display 0 se a distância do sensor 1 for maior ou igual a 15 cm
lc.clearDisplay(0);
}
if (distance2 > 0 && distance2 < 15) {
// Exibe rosto triste no display 1 se a distância do sensor 2 for menor que 15 cm
printByte(1, ESQUERDA);
} else {
// Limpa o display 1 se a distância do sensor 2 for maior ou igual a 15 cm
lc.clearDisplay(1);
}
delay(1000); // Aguarda 1 segundo
if (distance1 > 0 && distance1 < 15) {
// Exibe rosto triste no display 0 se a distância do sensor 1 for menor que 15 cm
printByte(0, DIREITA);
} else {
// Limpa o display 0 se a distância do sensor 1 for maior ou igual a 15 cm
lc.clearDisplay(0);
}
if (distance2 > 0 && distance2 < 15) {
// Exibe rosto sorridente no display 1 se a distância do sensor 2 for menor que 15 cm
printByte(1, DIREITA);
} else {
// Limpa o display 1 se a distância do sensor 2 for maior ou igual a 15 cm
lc.clearDisplay(1);
}
delay(1000); // Aguarda 1 segundo
*/
}
// Função para imprimir um byte no display especificado
void printByte(int display, byte character[]) {
for (int i = 0; i < 8; i++) {
lc.setRow(display, i, character[i]);
}
}