DIY Simple 20 kHz Arduino Oscilloscope on Nokia 5110 LCD

The maximum signal frequency that the oscilloscope can display is 20 kHz, and the maximum input voltage is 5 V without a voltage divider.

projectImage

Things used in this project

Hardware components

HARDWARE LIST
1 Arduino Nano R3
1 Nokia 5110 LCD Display (PCD8544)
4 Resistor 10k ohm
1 Resistor 4.75k ohm
1 Resistor 330 ohm
4 Pushbutton Switch, Momentary

Software apps and online services

Arduino IDE

Hand tools and fabrication machines

Soldering iron (generic)

Solder Wire, Lead Free

Story

 

This time I will show you how to make a simple Arduino oscilloscope. The maximum signal frequency that the oscilloscope can display is 20 kHz, and the maximum input voltage is 5 V without a voltage divider.

The oscilloscope is controlled by four buttons:

 

- "HOLD" button - which serves to freeze the current state of the screen

 

- Synchronization button that allows you to set the synchronization level.

 

- And Buttons "+" and "-" that control the sweep, sync level, and move the signal image in HOLD mode.

 

On the Nokia 5110 screen, vertically each cell is 1 V, horizontally one cell is equal to the scan resolution, which has the (following) values from: 0.1, 0.2, 0.5, 1.0, 2.0, 5.0, 10.0, 20.0 and 50.0 ms. The sweep value is changed with the "+" and "-" buttons, which is displayed in the upper left corner. The trigger level is displayed as a small bar on the left side of the screen, and the trigger voltage is displayed in the upper right corner of the screen. This project is published on arduino.ru page where you can read more details.

projectImage

The device is extremely simple to build and consist of only a few components - Arduino Nano microcontroller

 

- Nokia N5110 LCD display

 

- four buttons

 

- four pull-down resistors

 

- Input jack

 

- And Power switch and Led

 

I tested the oscilloscope with sine and rectangular signal generator. Even though it is not a professional or very usable instrument, it can still be used for educational purposes or in your laboratory, for testing low-frequency signals, especially knowing that the device is very easy to make and extremely cheap.

 

Finally, the device is placed in a suitable box made of PVC and coated with self-adhesive wallpaper.

Schematics

Schematic diagram


 

projectImage

Code

 

CODE
#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.3 V , BL ++ 200 OM ++ 3.3 V
 
int izm,x,y,u,i2,zz,hold,h0,h1,h2,raz=0,menu,sss=512,u_dig,data[168]{};
unsigned long time,times;
float per;
byte i;
 
void setup() {Serial.begin(9600);
    display.begin();display.clearDisplay();display.display();
    display.setContrast(40); // contrast setting
    display.setTextSize(1);  // setting font size
    display.setTextColor(BLACK); // setting text color
    pinMode(10,INPUT);  // +
    pinMode(11,INPUT);  // -
    pinMode(12,INPUT);  // hold
    pinMode(13,INPUT);  // синх
    ADMUX  = 0b01000000; // 0B0100000 10 bit A0 // 0B01100000 8 bit A0
    ADCSRA = 0b11110010;// CLK/4;
    analogWrite (9, 127); // PWM 9 OUTPUT
}
 
void loop() {
///////////////////////////BUTTON CONTROL//////////////////////////////
 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); // setting cursor position
/////////////////////////SWEEP TIME calibrated by 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;// SYNCHRONIZATION
 times=micros();
 while(i<167){i++;delayMicroseconds(zz);
  ads();data[i]=izm; // MEASUREMENT 10 bit
  }i=0;times=micros()-times;
  Serial.println(times);
 }
////////////////////OUTPUT ON 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();    
}// loop
 
void ads(){ //////// 10 bit ///////////
  do{ADCSRA |= (1 << ADSC);} 
  while((ADCSRA & (1 << ADIF)) == 0);izm = (ADCL|ADCH << 8);} 
  ////////////////// 8 bit ///////////
  // REQUIRED ALL CHANGEABLE VARIABLES (sss, u_dig)
  // while ((ADCSRA & 0x10)==0);
  //   ADCSRA|=0x10;
  //   izm = ADCH;
 
void setka(){
 for(y=8;y<47;y=y+8){
 for(x=0;x<83;x=x+4){
   display.drawPixel(x, y, BLACK);}}
 
 for(x=0;x<83;x=x+26){
 for(y=10;y<47;y=y+4){
   display.drawPixel(x, y, BLACK);}}
}

The article was first published in hackster, September 25, 2021

cr: https://www.hackster.io/mircemk/diy-simple-20-khz-arduino-oscilloscope-on-nokia-5110-lcd-da4833

author: Mirko Pavleski

License
All Rights
Reserved
licensBg
0