#include <Wire.h>
#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <SPI.h>
#include <SD.h>
// Definição dos pinos conforme o seu diagram.json
#define PIN_LED 32
#define PIN_BUZZER 12
#define PIN_POT 36 // Pino VP / GPIO36
#define PIN_SD_CS 4
Adafruit_MPU6050 mpu;
File meuArquivo;
void setup() {
// Inicializa a comunicação serial para monitoramento
Serial.begin(115200);
while (!Serial) delay(10);
Serial.println("--- INICIANDO OPERAÇÃO DO CANSAT ---");
// Configuração dos pinos de saída
pinMode(PIN_LED, OUTPUT);
pinMode(PIN_BUZZER, OUTPUT);
// Bipe inicial para avisar que o satélite ligou
digitalWrite(PIN_BUZZER, HIGH);
delay(200);
digitalWrite(PIN_BUZZER, LOW);
// 1. Inicializa o Acelerômetro MPU6050 (I2C nos pinos 21 e 22 automáticos)
if (!mpu.begin()) {
Serial.println("Falha ao encontrar o chip MPU6050!");
while (1) {
// Pisca o LED rápido em caso de erro crítico
digitalWrite(PIN_LED, HIGH); delay(100);
digitalWrite(PIN_LED, LOW); delay(100);
}
}
Serial.println("MPU6050 conectado com sucesso.");
// 2. Inicializa o Cartão SD (SPI nos pinos 18, 19, 23 e CS no 4)
if (!SD.begin(PIN_SD_CS)) {
Serial.println("Falha ao inicializar o Cartão SD!");
while (1) {
digitalWrite(PIN_LED, HIGH); delay(500);
digitalWrite(PIN_LED, LOW); delay(500);
}
}
Serial.println("Cartão SD pronto para gravação.");
// Cria o cabeçalho do arquivo CSV no cartão SD
meuArquivo = SD.open("/telemetria.csv", FILE_WRITE);
if (meuArquivo) {
meuArquivo.println("Tempo(ms),Accel_X,Accel_Y,Accel_Z,Giro_X,Giro_Y,Giro_Z,Vibracao");
meuArquivo.close();
Serial.println("Arquivo telemetria.csv criado.");
}
}
void loop() {
// Acende o LED no início da leitura dos dados (indicador de atividade)
digitalWrite(PIN_LED, HIGH);
// 1. Ler dados do MPU6050
sensors_event_t a, g, temp;
mpu.getEvent(&a, &g, &temp);
// 2. Ler dados do Potenciômetro (Simulador do Piezoelétrico)
int valorVibracao = analogRead(PIN_POT);
unsigned long tempoAtual = millis(); // Tempo desde que o satélite ligou
// 3. Mostrar os dados no Monitor Serial (para testes no computador)
Serial.print(tempoAtual);
Serial.print(" | Accel X: "); Serial.print(a.acceleration.x);
Serial.print(" | Vibração: "); Serial.println(valorVibracao);
// 4. Gravar os dados no Cartão SD no formato CSV
meuArquivo = SD.open("/telemetria.csv", FILE_APPEND);
if (meuArquivo) {
meuArquivo.print(tempoAtual); meuArquivo.print(",");
meuArquivo.print(a.acceleration.x); meuArquivo.print(",");
meuArquivo.print(a.acceleration.y); meuArquivo.print(",");
meuArquivo.print(a.acceleration.z); meuArquivo.print(",");
meuArquivo.print(g.gyro.x); meuArquivo.print(",");
meuArquivo.print(g.gyro.y); meuArquivo.print(",");
meuArquivo.print(g.gyro.z); meuArquivo.print(",");
meuArquivo.println(valorVibracao);
meuArquivo.close(); // Fecha o arquivo para garantir que os dados foram salvos
} else {
Serial.println("Erro ao abrir telemetria.csv para gravação!");
// Toca o buzzer se houver falha de gravação durante o voo
digitalWrite(PIN_BUZZER, HIGH);
}
// Apaga o LED para mostrar que terminou o ciclo de gravação
digitalWrite(PIN_LED, LOW);
// Se a vibração/impacto for muito alta, dá um aviso sonoro no Buzzer
if (valorVibracao > 3000) {
digitalWrite(PIN_BUZZER, HIGH);
delay(50);
digitalWrite(PIN_BUZZER, LOW);
}
// Intervalo de amostragem (Lê e salva os dados a cada 200 milissegundos)
delay(200);
}