Construa um Osciloscópio Arduino de 20 kHz em LCD Nokia 5110 – Guia DIY Fácil
Componentes e Materiais
- Arduino Nano R3 (1 unidade)
- Display LCD Nokia 5110 (PCD8544) (1 unidade)
- Resistor 10k ohm (4 unidades)
- Resistor 4.75k ohm (1 unidade)
- Resistor 330 ohm (1 unidade)
- Chave Pushbutton Momentânea (4 unidades)
Ferramentas Necessárias
- Ferro de solda genérico
- Solda sem chumbo
Aplicativos e Serviços Online
- Arduino IDE
Sobre o Projeto
Neste projeto, mostro como fazer um osciloscópio simples com Arduino. A frequência máxima de sinal exibida é 20 kHz, e a tensão máxima de entrada é 5 V sem divisor de tensão.
Controles
O osciloscópio é controlado por quatro botões:
- HOLD – congela o estado atual da tela.
- Sincronização – define o nível de sincronização.
- + e - – controlam a varredura, nível de sincronização e movem a imagem do sinal no modo HOLD.
Especificações da Tela
No display Nokia 5110, verticalmente cada célula equivale a 1 V. Horizontalmente, uma célula corresponde à resolução de varredura, com valores de: 0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0 e 50.0 ms. O valor de varredura é alterado pelos botões + e -, exibido no canto superior esquerdo. O nível de gatilho aparece como uma pequena barra à esquerda, e a tensão de gatilho no canto superior direito.

Componentes do Dispositivo
- Microcontrolador Arduino Nano
- Display LCD Nokia N5110
- Quatro botões
- Quatro resistores pull-down
- Conector de entrada (jack)
- Chave de alimentação e LED
Testei com gerador de sinais senoidal e retangular. Embora não seja um instrumento profissional, serve para fins educacionais ou laboratoriais, testando sinais de baixa frequência. É muito fácil de fazer e extremamente barato.
O dispositivo final foi alojado em uma caixa de PVC revestida com papel de parede autoadesivo.
Código
Código Arduino (C/C++)
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
#include <SPI.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3); // CLK, DIN, DC, CE, RST
// VCC +3.3V, BL + 200 ohm + 3.3V
int izm, x, y, u, i2, zz, hold, h0, h1, h2, raz = 0, menu, sss = 512, u_dig;
unsigned long time, times;
float per;
byte i;
int data[168] = {};
void setup() {
Serial.begin(9600);
display.begin();
display.clearDisplay();
display.display();
display.setContrast(40);
display.setTextSize(1);
display.setTextColor(BLACK);
pinMode(10, INPUT); // +
pinMode(11, INPUT); // -
pinMode(12, INPUT); // hold
pinMode(13, INPUT); // sincronização
ADMUX = 0b01000000; // 10 bit A0
ADCSRA = 0b11110010; // CLK/4
analogWrite(9, 127); // PWM pino 9 OUTPUT
}
void loop() {
// CONTROLE DE BOTÕES
if (menu == 0) {
if (digitalRead(10) == HIGH) {
if (hold == 0) raz++;
if (hold == 1) i2 = i2 + 1;
delay(100);
}
if (digitalRead(11) == HIGH) {
if (hold == 0) raz--;
if (hold == 1 && hold > 0) i2 = i2 - 1;
delay(100);
}
}
if (digitalRead(12) == HIGH) { hold++; i2 = 0; delay(100); }
if (digitalRead(13) == HIGH) { menu++; delay(100); }
if (hold > 1) hold = 0;
if (menu > 1 || menu < 0) menu = 0;
if (raz <= 0) raz = 0;
if (raz > 8) raz = 8;
if (menu == 1) {
hold = 0;
if (digitalRead(10) == HIGH) { sss += 24; delay(100); }
if (digitalRead(11) == HIGH) { sss -= 24; delay(100); }
if (sss > 1023) sss = 1023;
if (sss < 0) sss = 0;
}
display.setCursor(0, 0);
// TEMPO DE VARREDURA calibrado por gerador
if (raz == 0) { zz = 1; h2 = 2; per = 0.1; }
if (raz == 1) { zz = 1; h2 = 1; per = 0.2; }
if (raz == 2) { zz = 12; h2 = 1; per = 0.5; }
if (raz == 3) { zz = 32; h2 = 1; per = 1; }
if (raz == 4) { zz = 75; h2 = 1; per = 2; }
if (raz == 5) { zz = 200; h2 = 1; per = 5; }
if (raz == 6) { zz = 380; h2 = 1; per = 10; }
if (raz == 7) { zz = 750; h2 = 1; per = 20; }
if (raz == 8) { zz = 1900; h2 = 1; per = 50; }
// AQUISIÇÃO E EXIBIÇÃO
if (hold == 0 && millis() - time > 0) {
ads();
while (izm < sss) { ads(); h0++; if (h0 > 5000) break; }
h0 = 0; // SINCRONIZAÇÃO
times = micros();
while (i < 167) {
i++;
delayMicroseconds(zz);
ads();
data[i] = izm; // MEDIÇÃO 10 bit
}
i = 0;
times = micros() - times;
Serial.println(times);
}
// SAÍDA NO DISPLAY
if (millis() - time > 100) {
display.clearDisplay();
if (sss < 204 && sss > 100) { u_dig = 10; display.setCursor(0, 40); display.print("0.4V"); }
else if (sss < 100) { u_dig = 5; display.setCursor(0, 40); display.print("0.2V"); }
else { u_dig = 25; }
display.setCursor(0, 0);
while (i < 167) {
i++;
setka();
display.drawLine(i * h2 - i2, 47 - data[i] / u_dig, i * h2 - i2 + h2 - 1, 47 - data[i + 1] / u_dig, BLACK);
}
i = 0;
display.print(per, 1);
display.print(" mS ");
if (menu == 0) {
if (hold == 1) display.print("HOLD ");
else display.print("AUTO ");
}
if (menu == 1) {
display.print(sss / 200.0, 1);
display.print(" V ");
}
if (menu == 1) {
display.drawLine(0, 48 - sss / u_dig, 4, 48 - sss / u_dig, BLACK);
}
time = millis();
}
display.display();
}
void ads() {
// 10 bit
do { ADCSRA |= (1 << ADSC); } while ((ADCSRA & (1 << ADIF)) == 0);
izm = (ADCL | ADCH << 8);
// 8 bit (comentado)
// while ((ADCSRA & 0x10) == 0);
// ADCSRA |= 0x10;
// izm = ADCH;
}
void setka() {
for (y = 8; y < 47; y += 8) {
for (x = 0; x < 83; x += 4) {
display.drawPixel(x, y, BLACK);
}
}
for (x = 0; x < 83; x += 26) {
for (y = 10; y < 47; y += 4) {
display.drawPixel(x, y, BLACK);
}
}
}
Esquemático
Diagrama de conexões disponível na imagem do projeto original.
Processo de manufatura
- Persianas Inteligentes: Controle Automático de Luz com Arduino e Energia Solar
- Construa um Sensor de Obstáculos Simples com Arduino – Tutorial Fácil com LED IR e Fotodiodo
- Construa um Voltímetro DIY com Arduino e Display Nokia 5110 – Guia Passo a Passo
- Osciloscópio DIY com Arduino Nano (10 Hz–50 kHz) e LCD 128×64
- Roda de Medição Precisa DIY com Arduino Nano e Encoder Rotativo
- Cronômetro Arduino Simples: Botão Ativa Cronômetro com EEPROM e Interrupções
- Medidor de Capacitância Autoranging DIY (10 pF–10 µF) – Montagem Fácil com Arduino
- Construa um Companheiro LCD com IA: Seu Amigo Interativo
- Circuito de Entrada Analógica Isolada para Arduino
- Construa um Relógio Despertador Confiável com RTC DS1302 e Arduino UNO