// Projeto 40 - Alarme ultrassônico com HC-SR04 adaptado para Wokwi
#include "LedControl.h"
// Include the required Arduino libraries:
#include <MD_Parola.h>
#include <MD_MAX72xx.h>
#include <SPI.h>
// Definição dos pinos
#define trigPin 9 // Pino de trigger do HC-SR04
#define echoPin 10 // Pino de echo do HC-SR04
#define switchPin 7 // Chave seletora
#define buttonPin 6 // Botão de reset
#define potPin A0 // Potenciômetro
#define speakerPin 8 // Alto-falante
// Pinos para o MAX7219
//#define DataIn 2
//#define CLK 4
//#define LOAD 3
#define NumChips 1
#define samples 5 // Número de amostras para média
float duration, distance, inch, cm, alarmRange;
// Define hardware type, size, and output pins:
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 8
#define CS_PIN 3
#define DATA_PIN 2
#define CLK_PIN 4
//LedControl lc = LedControl(DataIn, CLK, LOAD, NumChips);
// Setup for software SPI:
MD_Parola myDisplay = MD_Parola(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
void setup() {
myDisplay.begin();
myDisplay.setIntensity(8);
myDisplay.displayClear();
myDisplay.displayText("Alarme desativado", PA_CENTER, 100, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
// Inicializa o MAX7219
//lc.shutdown(0, false);
//lc.setIntensity(0, 8);
// lc.clearDisplay(0);
// Configura os pinos do HC-SR04
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT); // Configura os demais pinos
pinMode(switchPin, INPUT_PULLUP);
pinMode(buttonPin, INPUT_PULLUP);
pinMode(speakerPin, OUTPUT);
// Inicializa a comunicação serial para debug
Serial.begin(9600);
}
void loop() {
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
readPot(); // Lê o potenciômetro para ajustar o alcance do alarme
// Faz várias leituras para obter uma média
distance = 0;
for (int i = 0; i < samples; i++) {
distance += readDistance();
delay(50);
}
distance /= samples; // Converte para polegadas e centímetros inch = distance; cm = distance * 2.54;
// Exibe no display conforme a chave seletora
if (digitalRead(switchPin) == LOW) {
//displayDigit(inch);
Serial.print("Polegadas: ");
Serial.println(inch);
} else {
///displayDigit(cm);
Serial.print("Centímetros: ");
Serial.println(cm);
}
// Se a distância for menor ou igual ao alcance do alarme, dispara o alarme
if (distance <= alarmRange) {
startAlarm();
}
//delay(100);
}
// Função para ler a distância do sensor HC-SR04
float readDistance() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
return (duration * 0.0343) / 2; // Calcula a distância em cm
}
/*void displayDigit(float value)
{
int number = value * 100; // Converte para número inteiro com duas casas decimais
// Exibe os dígitos no display de 7 segmentos
//lc.setDigit(0, 4, number / 10000, false); // Centenas
lc.setDigit(0, 3, (number % 10000) / 1000, false); // Dezenas
lc.setDigit(0, 2, (number % 1000) / 100, true); // Unidades (com ponto decimal)
lc.setDigit(0, 1, (number % 100) / 10, false); // Décimos
lc.setDigit(0, 0, number % 10, false); // Centésimos
}*/
float readPot() {
float potValue = analogRead(potPin);
alarmRange = 400 * (potValue / 1024.0); // Alcance de 0-400 cm
Serial.print("Alcance do alarme: ");
Serial.println(alarmRange);
return alarmRange;
}
void startAlarm() {
Serial.println("Alarme ativado!");
myDisplay.displayClear();
myDisplay.displayText("Alarme ativado", PA_CENTER, 100, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
while (true) {
for (int freq = 800; freq < 2500; freq += 20) {
tone(speakerPin, freq, 100);
delay(5); // Verifica se o botão foi pressionado para silenciar o alarme
if (myDisplay.displayAnimate()) {
myDisplay.displayReset();
}
/*if (myDisplay.displayAnimate()) {
indiceMensagem = (indiceMensagem + 1) % numMensagens; // Próxima mensagem
myDisplay.displayReset();
myDisplay.displayClear();
myDisplay.displayText("Alarme ativado", PA_CENTER, 100, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
}*/
if (digitalRead(buttonPin) == LOW) {
noTone(speakerPin);
myDisplay.displayClear();
myDisplay.displayText("Alarme desativado", PA_CENTER, 100, 0, PA_SCROLL_LEFT, PA_SCROLL_LEFT);
Serial.println("Alarme desativado");
return;
}
}
}
}