Índice:
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.

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.

Componentes Utilizados
| Componente | Função |
| Arduino UNO RP2040 | Microcontrolador de alta performance com slot SD embutido |
| Sensor LM35 (ou LDR) | Sensor analógico de temperatura ou luminosidade |
| Cartão microSD | Armazenamento dos dados em formato CSV |
| Jumpers e protoboard | Conexõ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.

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.

