Bouw een 20 kHz Arduino Oscilloscoop op een Nokia 5110 LCD – Eenvoudige DIY Handleiding
Onderdelen en benodigdheden
| Arduino Nano R3 | × | 1 |
| Nokia 5110 LCD-display (PCD8544) | × | 1 |
| Weerstand 10k ohm | × | 4 |
| Weerstand 4,75k ohm | × | 1 |
| Weerstand 330 ohm | × | 1 |
| Drukknop, momentaan | × | 4 |
Benodigde tools en machines
- Soldeerbout (generiek)
- Soldeerdraad, loodvrij
Apps en online diensten
Over dit project
Deze keer laat ik zien hoe je een eenvoudige Arduino-oscilloscoop maakt. De maximale signaalfrequentie die de oscilloscoop kan weergeven is 20 kHz, en de maximale invoerspanning is 5 V zonder spanningsdeler.
De oscilloscoop wordt bediend met vier knoppen:
- "HOLD"-knop – om de huidige schermstatus te vriezen
- Synchronisatieknop – om het synchronisatieniveau in te stellen
- "+" en "-" knoppen – regelen de sweep, sync-niveau en verplaatsen het signaalbeeld in HOLD-modus
Op het Nokia 5110-scherm is vertikaal elk vakje 1 V, horizontaal is één vakje gelijk aan de scanresolutie, met de volgende waarden: 0,1; 0,2; 0,5; 1,0; 2,0; 5,0; 10,0; 20,0 en 50,0 ms. De sweep-waarde wordt gewijzigd met de "+" en "-" knoppen en wordt linksboven weergegeven. Het triggerniveau wordt als een kleine balk aan de linkerkant van het scherm getoond, en de triggerspanning wordt rechtsboven weergegeven. Dit project is gepubliceerd op arduino.ru waar je meer details kunt lezen.
Het apparaat is extreem simpel te bouwen en bestaat uit slechts een paar componenten:
- Arduino Nano microcontroller
- Nokia N5110 LCD-display
- Vier knoppen
- Vier pull-down weerstanden
- Invoeraansluiting (jack)
- Stroomschakelaar en LED
Ik heb de oscilloscoop getest met een sinus- en blokgolfgenerator. Hoewel het geen professioneel of erg bruikbaar instrument is, kan het toch worden gebruikt voor educatieve doeleinden of in je laboratorium, voor het testen van laagfrequente signalen, vooral wetende dat het apparaat heel makkelijk te maken is en extreem goedkoop.
Tot slot wordt het apparaat in een geschikte doos van PVC geplaatst en bekleed met zelfklevend behang.
Code
Arduino-code (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 data[168];
unsigned long time, times;
float per;
byte i;
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); // sync
ADMUX = 0b01000000; // 10-bit A0
ADCSRA = 0b11110010; // CLK/4
analogWrite(9, 127); // PWM 9 OUTPUT
}
void loop() {
// KNOPBEDIENING
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);
// SWEEP TIJD gekalibreerd met generator
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; }
if (hold == 0 && millis() - time > 0) {
ads();
while (izm < sss) { ads(); h0++; if (h0 > 5000) break; }
h0 = 0; // SYNCHRONISATIE
times = micros();
while (i < 167) {
i++;
delayMicroseconds(zz);
ads();
data[i] = izm; // METING 10-bit
}
i = 0;
times = micros() - times;
Serial.println(times);
}
// UITVOER OP 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 ADC
do { ADCSRA |= (1 << ADSC); } while ((ADCSRA & (1 << ADIF)) == 0);
izm = (ADCL | ADCH << 8);
}
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);
}
}
}
Schema's

Productieproces
- Slimme Jaloezieën: Geautomatiseerd Lichtbeheer met Arduino & Zonne-energie
- Een eenvoudige obstakelsensor bouwen met Arduino – IR LED & Fotodiodo Tutorial
- Bouw een DIY Voltmeter met Arduino en Nokia 5110 Display – Stap-voor-Stap Handleiding
- Zelfbouw Arduino Nano Oscilloscoop (10 Hz – 50 kHz) met 128×64 LCD
- Een nauwkeurig meetwieltje bouwen met Arduino Nano en draaiencoder
- Eenvoudige Arduino Stopwatch: Knop-geactiveerde Chronometer
- DIY Autoranging Condensatiemeter (10 pF–10 µF) – Simpele Arduino Bouw
- Bouw een AI LCD-maatje: Jouw interactieve vriend
- Contactloos Gebaarslot: Veilige toegang met APDS-9960 en Arduino
- Geïsoleerde analoge ingangsschakeling voor Arduino bouwen
- Bouw een betrouwbare wekker met DS1302 RTC en Arduino UNO