O firmware implementa um sistema de aquisição de dados em tempo real para testes estáticos de foguetes, com capacidade de processamento, armazenamento e comunicação multi-protocolo.
┌─────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ SENSORES │ │ PROCESSAMENTO │ │ SAÍDAS │
│ │ │ │ │ │
│ Célula Carga │───▶│ Aquisição │───▶│ Cartão SD │
│ Sensor Pressão │ │ Filtragem │ │ Serial/BT │
│ RTC DS3231 │ │ Timestamp │ │ ESP-NOW │
│ │ │ │ │ LCD │
└─────────────────┘ └──────────────────┘ └──────────────────┘
│ │ │
└────────────────────────┼────────────────────────┘
│
┌──────────────────┐
│ CONTROLE │
│ │
│ Estados │
│ Configuração │
│ Segurança │
└──────────────────┘
firmware/
├── 📄 firmware.ino # Arquivo principal
└── 📄 Pressure.h # Classe sensor pressão
- Wire
- RTClib
- HX711
- FS
- SD
- SPI
- PushButton
- BluetoothSerial
- esp_now
- WiFi
- Preferences
- LiquidCrystal_I2C
O sistema usa a biblioteca Preferences para armazenar configurações na EEPROM
// Chaves de preferência
const char* PREF_NAMESPACE = "app";
const char* PREF_LOAD_FACTOR = "loadFactor";
// Carregar configuração
loadFactor = preferences.getFloat("loadFactor", 277306.0);
// Salvar configuração
preferences.putFloat("loadFactor", loadFactor);- Inicialização (setup())
void setup() {
// 1. Comunicação
Serial.begin(115200);
SerialBT.begin("ESP32_BT");
// 2. Configuração persistente
preferences.begin("app", false);
loadFactor = preferences.getFloat("loadFactor", 277306.0);
// 3. Hardware
setupRTC();
setupSDCard();
setupHX711();
// 4. Comunicação wireless
setupESPNow();
}- Loop Principal
void loop() {
// Coleta contínua de dados
staticTest();
// Tratamento de botão
if (button.getSingleDebouncedPress()) {
handleButtonPress();
}
// Comandos via serial
if (Serial.available()) {
handleSerialCommand();
}
}struct SensorData {
unsigned long timestamp;
float thrust; // Empuxo em Kg
float pressureMPa; // Pressão convertida para MPa
};void logData(unsigned long millis) {
float peso = escala.get_units();
float pressao = pressureSensor.readMPA();
// Detecção de valores máximos
if (peso > maxValues[0]) maxValues[0] = peso;
if (pressao > maxValues[1]) maxValues[1] = pressao;
// Formatação e armazenamento
leitura = String(millis) + "," + String(peso, 6) + "," + String(pressao);
appendFile(SD, filedir, leitura);
// Transmissão (não implementado)
if (espNowPeerReady) {
transmitDataESPNow(leitura);
}
}void handleSerialCommand() {
String command = Serial.readStringUntil('\n');
command.trim();
if (command.startsWith("INIT CONFIG")) {
enterConfigurationMode();
}
else if (command.startsWith("SET LOAD FACTOR")) {
processLoadFactorCommand(command);
}
// ... outros comandos
}| Comando | Descrição | Exemplo | Resposta |
|---|---|---|---|
| INIT CONFIG | Entra em modo calibração | INIT CONFIG |
Aguarda fator |
| SET LOAD FACTOR | Define fator de carga | SET LOAD FACTOR 277306.0 |
Confirmação |
| Botão Físico | Zera célula de carga | - | Beep de confirmação |
/SD_CARD/
└── 📁 2024-11-15_14-30-25/ # Diretório por data/hora
└── 📄 2024-11-15_14-30-25_raw.txt # Arquivo de dados
Tempo,Empuxo,Pressao
0,0.000000,1850
100,1.234567,1902
200,2.345678,1955
...bool writeFile(fs::FS &fs, String path, String message) {
File file = fs.open(path, FILE_WRITE);
if (!file) return false;
bool success = file.print(message);
file.close();
return success;
}
void appendFile(fs::FS &fs, const String &path, const String &message) {
File file = fs.open(path, FILE_APPEND);
if (file) {
file.print(message + "\n");
file.close();
}
}typedef struct struct_message {
char data[60]; // "timestamp,empuxo,pressao"
} struct_message;
void setupESPNow() {
WiFi.mode(WIFI_STA);
if (esp_now_init() == ESP_OK) {
esp_now_register_send_cb(OnDataSent);
// Configurar peer
}
}
void OnDataSent(const uint8_t *mac_addr, esp_now_send_status_t status) {
// Callback de confirmação de entrega
}BluetoothSerial SerialBT;
void setupBluetooth() {
SerialBT.begin("ESP32_BT");
}
void printToSerials(const String &message) {
Serial.println(message); // USB Serial
SerialBT.println(message); // Bluetooth
}void buzzSignal(String signal) {
int frequency = 1000;
if (signal == "Alerta") {
// 5 bips rápidos
for (int i = 0; i < 5; i++) {
tone(BUZZER_PIN, frequency, 200);
delay(350);
}
}
else if (signal == "Sucesso") {
// 3 bips curtos
for (int i = 0; i < 3; i++) {
tone(BUZZER_PIN, frequency, 100);
delay(200);
}
}
// ... outros sinais
}- Constante: Gravando dados
- Apagado: Sistema inativo/erro
- Selecione a placa "ESP32 Dev Module"
- Configure a porta COM
- Defina as opções de partição (se necessário)
- Faça o upload