image Saravati

Projeto Prático: Data Logger com Arduino UNO RP2040 e Cartão SD

Você já quis registrar dados de sensores em tempo real e salvar tudo em um cartão SD, para depois analisar no Excel ou em um dashboard? Pois é exatamente isso que o Arduino UNO RP2040 faz com maestria!

Neste artigo, vamos montar um Data Logger completo, capaz de gravar leituras analógicas como temperatura, luminosidade e umidade, diretamente em um arquivo CSV no cartão microSD.
E o melhor: tudo de forma automática, com criação de pastas, arquivos e cabeçalhos.

image Saravati

O que é um Data Logger?

Um Data Logger é um registrador de dados um sistema eletrônico capaz de coletar e armazenar informações de sensores ao longo do tempo, geralmente para posterior análise.

Em aplicações reais, ele é usado em:

  • Monitoramento de temperatura e umidade;
  • Controle de processos industriais;
  • Testes laboratoriais;
  • Sistemas de energia solar;
  • E até em experimentos científicos.
image 1 Saravati

Componentes Utilizados

ComponenteFunção
Arduino UNO RP2040Microcontrolador de alta performance com slot SD embutido
Sensor LM35 (ou LDR)Sensor analógico de temperatura ou luminosidade
Cartão microSDArmazenamento dos dados em formato CSV
Jumpers e protoboardConexões básicas para o circuito

Ligações do Circuito

Sensor LM35:

  • VCC → 3.3V
  • GND → GND
  • OUT → A0

A UNO RP2040 trabalha com 3,3V, então nada de sensores 5V sem conversor de nível!

Código Completo – Data Logger com Arduino UNO RP2040

A seguir está o código completo, totalmente comentado e pronto para uso. Ele cria automaticamente uma pasta /LOGS, gera arquivos sequenciais e grava leituras do pino A0 a cada 100 milissegundos.

#include <Arduino.h>

#include <SPI.h>

#include <SD.h>

// ====== CONFIGURAÇÕES ======

const uint8_t CS_CANDIDATES[] = {5, 10, 9};  // Pinos comuns de CS em placas UNO RP2040

const size_t  CS_COUNT = sizeof(CS_CANDIDATES) / sizeof(CS_CANDIDATES[0]);

const uint8_t ANALOG_PIN = A0;

const uint32_t SAMPLE_INTERVAL_MS = 100;   // 100 ms = 10 Hz

const uint16_t FLUSH_EVERY_N_LINES = 50;   // flush a cada 50 linhas

uint8_t sdCS = 255;

File logfile;

uint32_t lastSample = 0;

uint32_t lineCount = 0;

// Cria pasta /LOGS se não existir

bool ensureLogsDir() {

  if (!SD.exists("/LOGS")) {

    return SD.mkdir("/LOGS");

  }

  return true;

}

// Gera nome sequencial de arquivo: LOG00001.CSV, LOG00002.CSV...

String nextLogFilename() {

  for (uint32_t i = 1; i <= 99999; i++) {

    char name[32];

    snprintf(name, sizeof(name), "/LOGS/LOG%05lu.CSV", (unsigned long)i);

    if (!SD.exists(name)) return String(name);

  }

  return String();

}

// Inicializa SD testando pinos CS possíveis

bool initSD() {

  for (size_t i = 0; i < CS_COUNT; i++) {

    uint8_t cs = CS_CANDIDATES[i];

    if (SD.begin(cs)) {

      sdCS = cs;

      Serial.print(F("Cartão SD detectado no pino CS="));

      Serial.println(sdCS);

      return true;

    }

  }

  Serial.println(F("Falha ao iniciar SD. Verifique o cartão ou pino CS."));

  return false;

}

void setup() {

  Serial.begin(115200);

  delay(300);

  Serial.println(F("\n=== UNO RP2040 - Data Logger SD ==="));

  if (!initSD()) while (true) delay(1000);

  if (!ensureLogsDir()) {

    Serial.println(F("Não foi possível criar /LOGS."));

    while (true) delay(1000);

  }

  String fname = nextLogFilename();

  if (fname.length() == 0) {

    Serial.println(F("Não há nomes disponíveis para novo log."));

    while (true) delay(1000);

  }

  logfile = SD.open(fname.c_str(), FILE_WRITE);

  if (!logfile) {

    Serial.println(F("Falha ao abrir arquivo de log."));

    while (true) delay(1000);

  }

  logfile.println(F("millis,A0_raw,A0_volts"));

  logfile.flush();

  Serial.print(F("Gravando em: "));

  Serial.println(fname);

  Serial.println(F("Cabeçalho: millis,A0_raw,A0_volts"));

  Serial.println(F("Iniciando amostragem a cada 100 ms..."));

}

void loop() {

  uint32_t now = millis();

  if (now - lastSample >= SAMPLE_INTERVAL_MS) {

    lastSample = now;

    int raw = analogRead(ANALOG_PIN);

    float volts = (raw * (3.3f / 4095.0f));

    logfile.print(now);

    logfile.print(',');

    logfile.print(raw);

    logfile.print(',');

    logfile.println(volts, 4);

    lineCount++;

    if (lineCount % FLUSH_EVERY_N_LINES == 0) logfile.flush();

    // Exibe no Serial a cada 10 amostras

    if (lineCount % 10 == 0) {

      Serial.print(F("Amostra ")); Serial.print(lineCount);

      Serial.print(F(" | Valor ADC: ")); Serial.print(raw);

      Serial.print(F(" | Tensão: ")); Serial.println(volts, 3);

    }

  }

}

Exemplo de Dados Gravados

Após rodar o código, o cartão SD irá armazenar arquivos como este:

millis,A0_raw,A0_volts

0,310,0.2500

100,314,0.2534

200,309,0.2491

300,316,0.2547

400,312,0.2518

Você pode abrir esse arquivo no Excel e criar gráficos de temperatura, tensão ou qualquer outro parâmetro analógico.

image 2 Saravati

Análise e Expansões

Com esse logger, você tem uma base sólida para projetos mais avançados.
Veja algumas ideias:

  • Adicione um display OLED para mostrar os valores ao vivo.
  • Use múltiplos sensores (ex: A0 = temperatura, A1 = luz).
  • Adicione um botão “marcar evento” (para registrar o momento de um teste).
  • Envie os dados para a nuvem via ESP8266 e visualize em dashboards.

Conclusão

O Arduino UNO RP2040 leva os projetos de coleta de dados a outro nível: ele combina potência de processamento, armazenamento local e compatibilidade com bibliotecas Arduino.

Com esse projeto, você cria sua própria central de monitoramento, abrindo caminho para aplicações de IoT, automação industrial e eletrônica aplicada.

Saiba mais sobre a parceria Saravati e Sara Educação

Este “Guia de Montagem” é uma colaboração especial entre a Saravati e a Sara Educação, criado pelo Professor Felipe Rosa. Nosso objetivo é enriquecer a comunidade de entusiastas da eletrônica, IoT e automação com recursos educacionais de alta qualidade. Através dessa parceria, buscamos inspirar e capacitar criadores em seus projetos, disponibilizando esses guias em nosso blog e nas redes sociais.

@saravatirobotica no Instagram e Tiktok

@sara.educacao no Instagram e Tiktok

Leave a Reply

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *