#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <SoftwareSerial.h>
#include <SdFat.h>
#include <SD.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
#define SPI_SPEED SD_SCK_MHZ(4)
#define CS_PIN 10
File root;
const int pinoReed = 2; // REMOVIDO O COMENTÁRIO PARA FUNCIONAR
const int rele1 = 3; // Liga rele1 enquanto gira
const int rele2 = 5; // Aciona rele2 após parar de girar
unsigned long ultimoPulso = 0;
unsigned long tempoParado = 1500; // 1,5 s sem pulsos = parou
unsigned long tempoExibicao = 60000; // frase por 1 minuto
unsigned long tempoAcionamento = 10000; // relé 2 por 10 segundos
unsigned long tempoMostrouFrase = 0;
unsigned long inicioRele2 = 0;
bool girando = false;
bool fraseJaMostrada = false;
bool mostrandoFrase = false;
bool aguardandoRele2 = false;
const char* frases[] = {
"1. Terceirizando ",
"2. fazer o projeto",
"3. viva a mooca!!!",
"4. la vem 5 serie ",
"5. opa!!!!!!!!!!!!",
"6. saudacoes!!!!!!",
"7. fazedores!!!!!!",
"8. Tente de novo ",
"9. tao distante ",
"10.licao de casa "
};
void setup() {
lcd.init();
lcd.backlight();
Serial.begin(115200);
Serial.print("Initializing SD card... ");
if (!SD.begin(CS_PIN)) {
Serial.println("Card initialization failed!");
while (true);
}
Serial.println("initialization done.");
Serial.println("Files in the card:");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("");
// Example of reading file from the card:
File textFile = SD.open("wokwi.txt");
if (textFile) {
Serial.print("wokwi.txt: ");
while (textFile.available()) {
Serial.write(textFile.read());
}
textFile.close();
} else {
Serial.println("error opening wokwi.txt!");
}
pinMode(pinoReed, INPUT_PULLUP); // REMOVIDO O COMENTÁRIO
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
// Relés desligados (módulo ativo em LOW)
digitalWrite(rele1, HIGH);
digitalWrite(rele2, HIGH);
randomSeed(analogRead(A0));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vire a manivela");
}
void loop() {
static int estadoAnterior = HIGH;
int leitura = digitalRead(pinoReed); // Detecta passagem do ímã
// Detecta o pulso (borda de descida)
if (estadoAnterior == HIGH && leitura == LOW) {
ultimoPulso = millis();
// Se estava aguardando o relé 2, cancela tudo e volta para girando
if (aguardandoRele2) {
aguardandoRele2 = false;
digitalWrite(rele2, HIGH); // Desliga relé 2
girando = true;
digitalWrite(rele1, LOW); // Liga relé 1
//player.volume(AlturaVolume);
//player.play(1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Girando...");
}
// Início normal da rotação
else if (!girando) {
girando = true;
fraseJaMostrada = false;
digitalWrite(rele1, LOW);
//player.play(1);
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Girando...");
}
}
estadoAnterior = leitura;
// CORREÇÃO 1: Adicionado o sinal de menos (-) e ajustado o escopo das chaves
// Detecta parada da manivela
if (girando && (millis() - ultimoPulso > tempoParado)) {
girando = false;
digitalWrite(rele1, HIGH); // Desliga relé 1 imediatamente
//player.stop();
digitalWrite(rele2, LOW); // Liga relé 2
inicioRele2 = millis();
aguardandoRele2 = true;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Aguarde...");
}
// CORREÇÃO 2: Adicionado o sinal de menos (-)
// Tempo do relé 2 terminou
if (aguardandoRele2 && (millis() - inicioRele2 >= tempoAcionamento)) {
aguardandoRele2 = false;
digitalWrite(rele2, HIGH); // Desliga relé 2
fraseJaMostrada = true;
mostrarFrase();
}
// CORREÇÃO 3: Adicionado o sinal de menos (-)
// Após 1 minuto volta para a tela inicial
if (mostrandoFrase && (millis() - tempoMostrouFrase >= tempoExibicao)) {
mostrandoFrase = false;
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Vire a manivela");
}
}
void mostrarFrase() {
int indice = random(0, sizeof(frases) / sizeof(frases[0]));
lcd.clear();
lcd.setCursor(0, 0);
lcd.print("Sua frase:");
lcd.setCursor(0, 1);
lcd.print(frases[indice]);
tempoMostrouFrase = millis();
mostrandoFrase = true;
}
void printDirectory(File dir, int numTabs) {
while (true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
break;
}
for (uint8_t i = 0; i < numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs + 1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}