|
STM32F103C8T6 microcontroller board |
x 1 | |
|
ILI9341 320x240 TFT Display |
x 1 | |
|
1N4007 – High Voltage, High Current Rated Diode |
x 2 | |
|
Resistor 4.75k ohm |
x 2 | |
|
Capacitor 10 µF |
x 1 | |
|
Pushbutton Switch, Momentary |
x 4 |
![]() |
arduino IDEArduino
|
|
![]() |
Soldering Iron Kit |
How to make Simple 500KHz Oscilloscope with STM32 ( Arduino IDE )
An oscilloscope, often referred to as an "scope," is a test instrument used to visualize and analyze the waveform of electronic signals. It is an essential tool for engineers, technicians, and researchers working in fields like electronics, telecommunications, physics, and more.
In some of my previous videos I described how to make a digital oscilloscope using Arduino, which has a maximum frequency range of up to 50kHz.
This time I will present you a more advanced oscilloscope with STM32 Microcontroller which has better performances than Arduino and is also cheaper. With this instrument we can now observe the shape of signals with a frequency of up to 500KHz. You can see the original project on the RCL-Radio site.
Otherwise, STM32 is a 32-bit ARM microcontroller developed by STMicroelectronics, and Arduino Bootloader can be installed on it, and it can be used as a standard Arduino. The Arduino IDE application can be used for writing, compiling, and uploading code to microcontroller board. This time we will not dwell on the method of installation and uploading the code, because we can find many detailed tutorials on the Internet, such as this one.
If you want to make a PCB for this project, or for any other electronic project, PCBway is a great choice for you. PCBway is one of the most experienced PCB manufacturing company in China in field of PCB prototype and fabrication. They provide completed PCB assembly service with worldwide free shipping , and ISO9001 quality control system. Also, on their site there is an online gerber viewer where you can upload your gerber and drill files to render your board.
The device is extremely simple to make and contains only a few components
- STM32F103C8T6 Microcontroller
- 3.2 or 2.8 inch TFT color display with a resolution of 240 by 320 points powered by the ILI9341 chip
- two diodes
- two resistors
- and five buttons
The maximum input positive voltage is 6.6 V and can be increased by using an external voltage divider. If the device is made according to the given schematic diagram and code, it works immediately after the first power-on without any previous setting in the code or libraries.
Let's first explain the function of the buttons:
- With the SET button we enter a menu where we can change more settings
- Up and Down buttons are used to change the value of the selected function
- The Hold button serves to freeze the current image of the signal for further analysis
- and with the AC/DC switch we select the type of input signal
In the upper left part of the screen, the amplitude value of the signal is given, followed by the sweep duration. When the Hold button is activated, we have additional functions for analyzing the input signal.
As you can see in the video, the colors of the curve can be changed very easily in the code in line:
tft.drawLine(i*mn, 230-data1[i+i2],i*mn+mn-1, 230-data1[i+1+i2], ILI9341_RED);i++;}i=0;
And finally, a short conclusion. Unlike the previous oscilloscopes with Arduino, this device, due to its frequency range and speed, represents a relatively serious functional instrument that can find a place in any laboratory, and at the same time, the price for its making is extremely low, no more than 15 dollars. The oscilloscope is installed in a suitable box made of PVC material with a thickness of 3 and 5 mm and covered with self-adhesive colored wallpaper.
#include "SPI.h" #include <EEPROM.h> #include <Adafruit_GFX_AS.h> // http://rcl-radio.ru/wp-content/uploads/2020/06/Adafruit_GFX.zip #include <Adafruit_ILI9341_STM.h> #include <STM32ADC.h> #include <HardwareTimer.h> STM32ADC myADC(ADC1); uint8 pin = PA0; volatile static bool dma1_ch1_Active; #define maxSamples 1000 uint16_t buffer[maxSamples]; uint16 dataPoints[maxSamples]; #define TFT_CS PB1 #define TFT_DC PB10 #define TFT_RST PB11 Adafruit_ILI9341_STM tft = Adafruit_ILI9341_STM(TFT_CS, TFT_DC, TFT_RST); // Mosi - PA7, SCK - PA5 byte data[1000],data_old[1000]; int setting,hold_set,i,x,y,i2,u_max,u_min,minn,u_sinh,mn=2,raz,per,razv,sinhro; int u1,u2,t1,t2,zap,ux=1,uxx=1,fun; long h0,h1; long times,times1,hhh,times2,times3,tim; byte hold,www,w=1,w1=1,w2=1,w3=1,w4=1,link,w5=1,b1=1,b2=1; String raz_x; float k1,k2,del=1; int data1[1000]; void setup() { Serial.begin(115200); EEPROM.init(0x801F000,0x801F800,0x400);// 1024 byte pinMode(PA0, INPUT_ANALOG); pinMode(PB12,INPUT_PULLUP);// HOLD pinMode(PB13,INPUT_PULLUP);//+ pinMode(PB14,INPUT_PULLUP);//- pinMode(PB15,INPUT_PULLUP);// SET tft.begin();tft.setRotation(1); tft.fillScreen(ILI9341_BLACK); razv=EEPROM.read(0); sinhro=EEPROM.read(1); ADC1->regs->CR1 = 0; // Обнулить регистр управления ADC1->regs->SQR1 = 0; // Обнулить регистр SQR1 ADC1->regs->CR2 |= ADC_CR2_CAL; // Пуск калибровки while (!(ADC1->regs->CR2 & ADC_CR2_CAL)){}; } void loop() { if(digitalRead(PB15)==LOW&&hold==0){w=1;w1=1;b1=1;b2=0;setting++;if(setting>2){setting=0;}delay(300);} if(digitalRead(PB15)==LOW&&hold==1){w=1;w2=1;w4=1;hold_set++;if(hold_set>4){hold_set=0;}delay(300); } ////// TFT ////////////////////////////////////////// tft.setCursor(295, 0); tft.setTextColor(ILI9341_WHITE); tft.setTextSize(1); //////////////////// HOLD ON OFF /////////////////////////////////////////// if(digitalRead(PB12)==LOW&&hold==0){hold=1;w2=1;w4=1;link=1;setting=0;delay(300);} if(digitalRead(PB12)==LOW&&hold==1){hold=0;www=1;b2=0;hold_set=0;delay(300);} if(link==1){link=0;tft.fillRect(170,0,100,30,ILI9341_BLACK);} if(hold==0){tft.setCursor(170, 0);tft.print("OSCILLOSCOPE");tft.setCursor(170, 10);tft.print("VERSION 0.1");tft.setCursor(170, 20);tft.print("RCL-RADIO.RU");} razmer(); if(hold==0){ if(setting==0){ if(digitalRead(PB14)==LOW&&hold==0){razv++;if(razv>12){razv=12;}EEPROM.update(0,razv);delay(300);b2=1;w3=1;w=1;w1=1;u1=0;u2=0;t1=0;t2=0;} if(digitalRead(PB13)==LOW&&hold==0){razv--;if(razv<0){razv=0;}EEPROM.update(0,razv);delay(300);b2=1;w3=1;w=1;w1=1;w5=1;} razmer(); if(b2<5){b2++;tft.fillRect(80,0,65,8,ILI9341_RED);tft.setCursor(90, 0);tft.print((float)times3/10/mn,1);tft.print(" uS");} } if(setting==1){ if(digitalRead(PB14)==LOW&&hold==0){uxx++;if(uxx>5){uxx=5;}del=1;ux=uxx;delay(300);w=1;w1=1;u1=0;u2=0;t1=0;t2=0;} if(digitalRead(PB13)==LOW&&hold==0){uxx--;ux=uxx;if(uxx<=0){del=2;uxx=0;ux=1;}delay(300);w=1;w1=1;} if(w1==1){w1=0; tft.fillRect(85,10,50,8,ILI9341_RED);tft.setCursor(90, 10);tft.print("U x ");if(uxx==0){tft.print(0.5,1);}else{tft.print(uxx);}} } if(setting==2){ if(digitalRead(PB13)==LOW&&hold==0){sinhro++;if(sinhro>200){sinhro=200;}EEPROM.update(1,sinhro);delay(10);w=1;w1=1;} if(digitalRead(PB14)==LOW&&hold==0){sinhro--;if(sinhro<0){sinhro=0;}EEPROM.update(1,sinhro);delay(10);w=1;w1=1;} tft.fillRect(0, 230-sinhro+3, 3, 3, ILI9341_BLACK);tft.fillRect(0, 230-sinhro, 3, 3, 0xFFFFDD);tft.fillRect(0, 230-sinhro-3, 3, 3, ILI9341_BLACK); if(w1==1){w1=0;tft.fillRect(85,20,50,8,ILI9341_RED);tft.setCursor(90, 20);tft.print("SINH");} } } if(hold==0&&w==1){w=0; if(setting!=0){tft.fillRect(80,0,65,8,ILI9341_BLACK);tft.setCursor(90, 0);tft.print((float)times3/10/mn,1);tft.print(" uS");} if(setting!=1){tft.fillRect(70,10,65,8,ILI9341_BLACK);tft.setCursor(90, 10);tft.print("U x ");if(uxx==0){tft.print(0.5,1);}else{tft.print(uxx);}} if(setting!=2){tft.fillRect(70,20,65,8,ILI9341_BLACK);tft.setCursor(90, 20);tft.print("SINH"); tft.fillRect(0, 230-sinhro+3, 3, 3, ILI9341_BLACK);tft.fillRect(0, 230-sinhro, 3, 3, 0x333333);tft.fillRect(0, 230-sinhro-3, 3, 3, ILI9341_BLACK); }} if(uxx==0){pinMode(PA2,OUTPUT);digitalWrite(PA2,LOW);} if(uxx>0){pinMode(PA2,INPUT);analogRead(PA2);} //////////////// HOLD SET //////////////////////////////////////////////////////////////////////////////// if(hold==1){ if(w4==1){w4=0; tft.fillRect(80,0,65,8,ILI9341_BLUE);tft.setCursor(90, 0);tft.print((float)times3/10/mn,1);;tft.print(" uS");tft.fillRect(70,10,65,8,ILI9341_BLACK); tft.fillRect(0, 230-sinhro, 3, 3, 0x000000);tft.setCursor(90, 10);tft.print("U x ");tft.fillRect(70,20,65,8,ILI9341_BLACK);if(uxx==0){tft.print(0.5,1);}else{tft.print(uxx);}} tft.setCursor(295, 0); if(digitalRead(PB14)==LOW&&hold_set==0){i2+=2;if(i2>290){i2=290;}delay(50); tft.drawLine(0, u1+30,320, u1+30, 0x000000); tft.drawLine(0, 230-u2,320, 230-u2, 0x000000); tft.drawLine(t1, 230, t1, 30, 0x000000); tft.drawLine(318-t2, 230, 318-t2, 30, 0x000000); u1=0;u2=0;t1=0;t2=0;} if(digitalRead(PB13)==LOW&&hold_set==0){i2-=2;if(i2<0){i2=0;}delay(50); tft.drawLine(0, u1+30,320, u1+30, 0x000000); tft.drawLine(0, 230-u2,320, 230-u2, 0x000000); tft.drawLine(t1, 230, t1, 30, 0x000000); tft.drawLine(318-t2, 230, 318-t2, 30, 0x000000); u1=0;u2=0;t1=0;t2=0;} if(hold==1){tft.fillRect(i2,235,4,3,ILI9341_BLACK);tft.fillRect(i2+2,235,30,3,ILI9341_GREEN);tft.fillRect(i2+32,235,4,3,ILI9341_BLACK);} if(hold==0){tft.fillRect(295,0,25,8,ILI9341_RED);tft.fillRect(0,235,240,3,ILI9341_BLACK);}else{tft.print("HOLD");} if(digitalRead(PB14)==LOW&&hold==1&&hold_set==1){if(u1<199-u2){u1++;}w2=1;if(u1>200){u1=200;}delay(30);w=1;w1=1;} if(digitalRead(PB13)==LOW&&hold==1&&hold_set==1){if(u1<201-u2){u1--;}w2=1;if(u1<0){u1=0;}delay(30);w=1;w1=1;} if(digitalRead(PB13)==LOW&&hold==1&&hold_set==2){if(u2<199-u1){u2++;}w2=1;if(u2>200){u2=200;}delay(30);w=1;w1=1;} if(digitalRead(PB14)==LOW&&hold==1&&hold_set==2){if(u2<201-u1){u2--;}w2=1;if(u2<0){u2=0;}delay(30);w=1;w1=1;} if(digitalRead(PB14)==LOW&&hold==1&&hold_set==3){if(t1<319-t2){t1++;};w2=1;if(t1>320){t1=320;}delay(30);w=1;w1=1;} if(digitalRead(PB13)==LOW&&hold==1&&hold_set==3){if(t1<321-t2){t1--;}w2=1;if(t1<0){t1=0;}delay(30);w=1;w1=1;} if(digitalRead(PB13)==LOW&&hold==1&&hold_set==4){if(t2<319-t1){t2++;}w2=1;if(t2>320){t2=320;}delay(30);w=1;w1=1;} if(digitalRead(PB14)==LOW&&hold==1&&hold_set==4){if(t2<321-t1){t2--;}w2=1;if(t2<0){t2=0;}delay(30);w=1;w1=1;} if(w2==1){w2=0; tft.drawLine(0, u1-1+30,320, u1-1+30, ILI9341_BLACK);if(hold_set==1){tft.drawLine(0, u1+30,320, u1+30, 0xFFDAB9);}else{tft.drawLine(0, u1+30,320, u1+30, 0x222222);} tft.drawLine(0, u1+1+30,320, u1+1+30, ILI9341_BLACK); tft.drawLine(0, 230-u2-1,320, 230-u2-1, ILI9341_BLACK);if(hold_set==2){tft.drawLine(0, 230-u2,320, 230-u2, 0xFFDAB9);}else{tft.drawLine(0, 230-u2,320, 230-u2, 0x222222);} tft.drawLine(0, 230-u2+1,320, 230-u2+1, ILI9341_BLACK); tft.drawLine(t1-1, 230, t1-1, 30, ILI9341_BLACK);if(hold_set==3){tft.drawLine(t1, 230, t1, 30, 0xFFDAB9);}else{tft.drawLine(t1, 230, t1, 30, 0x222222);}tft.drawLine(t1+1, 230, t1+1, 30, ILI9341_BLACK); tft.drawLine(318-t2-1, 230, 318-t2-1, 30, ILI9341_BLACK);if(hold_set==4){tft.drawLine(318-t2, 230, 318-t2, 30, 0xFFDAB9);}else{{tft.drawLine(318-t2, 230, 318-t2, 30, 0x222222);}}tft.drawLine(318-t2+1, 230, 318-t2+1, 30, ILI9341_BLACK); if(hold_set==1){tft.fillRect(150,0,55,8,ILI9341_RED);}else{tft.fillRect(150,0,55,8,ILI9341_BLACK);} if(hold_set==2){tft.fillRect(150,10,55,8,ILI9341_RED);}else{tft.fillRect(150,10,55,8,ILI9341_BLACK);} if(hold_set==3){tft.fillRect(220,0,60,8,ILI9341_RED);}else{tft.fillRect(220,0,60,8,ILI9341_BLACK);} if(hold_set==4){tft.fillRect(220,10,60,8,ILI9341_RED);}else{tft.fillRect(220,10,60,8,ILI9341_BLACK);} tft.fillRect(150,20,55,8,ILI9341_BLACK); tft.setCursor(150, 0);tft.print("U1 = ");tft.print((3.3-u1*0.0165)/ux*del,2); tft.setCursor(150, 10);tft.print("U2 = ");tft.print((abs(u2*0.0165))/ux*del,2); tft.setCursor(150, 20);tft.print("U = ");tft.print(((3.3-u1*0.0165)-abs(u2*0.0165))/ux*del,2); tft.fillRect(220,20,65,8,ILI9341_BLACK); if(razv<6){zap=1;}else{zap=0;} tft.setCursor(220, 0);tft.print("T1 = ");tft.print(t1*(float)times3/1000/mn,zap); tft.setCursor(220, 10);tft.print("T2 = ");tft.print(((float)times3/3.125-t2*(float)times3/1000)/mn,zap); tft.setCursor(220, 20);tft.print("T = ");tft.print(((((float)times3/3.125-t2*(float)times3/1000))/mn-((t1*(float)times3/1000))/mn),zap); tft.fillRect(280,20,30,8,ILI9341_BLACK);tft.print(" uS"); }} ////////// END HOLD SET /////////////////////////////////////////////////////////////////////////////////// setka(); if(hold==0){DMA();if(dma1_ch1_Active == 0){for(int x=0; x<maxSamples; x++){data[x]=map(buffer[x],0,4095/ux,0,200);}}u1=0;u2=0;t1=0;t2=0;} arr(); if(hold==0){i2=0;for(i=1;i<1000;i++){if(data[i+5]>sinhro&&data[i+3]<sinhro){fun=i;if(fun>680){fun=0;}i=2000;}} for(i=0;i<1000-fun;i++){data1[i]=data[fun+i];}i=0;} while(i<320){ tft.drawLine(i*mn, 230-data_old[i],i*mn+mn-1, 230-data_old[i+1], ILI9341_BLACK); tft.drawLine(i*mn, 230-data1[i+i2],i*mn+mn-1, 230-data1[i+1+i2], ILI9341_RED);i++;}i=0; while(i<639){data_old[i]=data1[i+i2];i++;}i=0; if((mn>1&&w1==1&&hold==0&&setting==0)||www==1){www=0;w=1;w1=0;tft.fillScreen(ILI9341_BLACK);} if(razv==2&&w5==1){w5=0;w=1;w1=0;tft.fillScreen(ILI9341_BLACK);} } void DMA(){ switch(per){ case 0: rcc_set_prescaler(RCC_PRESCALER_ADC, RCC_ADCPRE_PCLK_DIV_2); break; case 1: rcc_set_prescaler(RCC_PRESCALER_ADC, RCC_ADCPRE_PCLK_DIV_4); break; case 2: rcc_set_prescaler(RCC_PRESCALER_ADC, RCC_ADCPRE_PCLK_DIV_6); break; case 3: rcc_set_prescaler(RCC_PRESCALER_ADC, RCC_ADCPRE_PCLK_DIV_8); break; } switch (raz) { case 0: adc_set_sample_rate(ADC1, ADC_SMPR_1_5); break; case 1: adc_set_sample_rate(ADC1, ADC_SMPR_7_5); break; case 2: adc_set_sample_rate(ADC1, ADC_SMPR_13_5); break; case 3: adc_set_sample_rate(ADC1, ADC_SMPR_28_5); break; case 4: adc_set_sample_rate(ADC1, ADC_SMPR_41_5); break; case 5: adc_set_sample_rate(ADC1, ADC_SMPR_55_5); break; case 6: adc_set_sample_rate(ADC1, ADC_SMPR_71_5); break; case 7: adc_set_sample_rate(ADC1, ADC_SMPR_239_5); break; } adc_set_reg_seqlen(ADC1, 1); ADC1->regs->SQR3 = PIN_MAP[pin].adc_channel; ADC1->regs->CR2 |= ADC_CR2_CONT; ADC1->regs->CR2 |= ADC_CR2_EXTSEL; ADC1->regs->CR2 |= ADC_CR2_SWSTART; dma_init(DMA1); dma_attach_interrupt(DMA1, DMA_CH1, DMA1_CH1_Event); myADC.setDMA(buffer, maxSamples, (DMA_MINC_MODE | DMA_TRNS_CMPLT), DMA1_CH1_Event); dma1_ch1_Active = 1; times3 = micros(); dma_enable(DMA1, DMA_CH1); while (dma1_ch1_Active == 1); dma_disable(DMA1, DMA_CH1); times3 = micros() - times3; } void setka(){ for(y=30;y<240;y=y+50){for(x=10;x<320;x=x+5){tft.drawPixel(x, y, ILI9341_DARKGREY);}} for(x=0;x<320;x=x+64){for(y=40;y<240;y=y+10){tft.drawPixel(x, y, ILI9341_DARKGREY);}}} static void DMA1_CH1_Event(){dma1_ch1_Active = 0;} void arr(){ ///// U max max if(millis()-times>500){u_max=0;u_min=4100;w3=1; tft.fillRect(40,0,30,28,ILI9341_BLACK); for(int mmm=0;mmm<640;mmm++){u_min=min(u_min,buffer[mmm]);u_max=max(u_max,buffer[mmm]);} tft.setCursor(0, 0);tft.print("Vmax = ");tft.print(u_max*3.3/4095*del,2); tft.setCursor(0, 10);tft.print("Vmin = ");tft.print(u_min*3.3/4095*del,2); u_sinh = u_max-u_min; tft.setCursor(0, 20);tft.print("Vpp = ");tft.print(u_sinh*3.3/4095*del,2); times=millis(); if(u_max*3.3/4095>=3.3){uxx=0;ux=1;del=2;w3=1;tft.fillRect(70,10,65,8,ILI9341_BLACK);tft.setCursor(90, 10);tft.print("U x ");tft.print(0.5,1);}} } void razmer(){ switch(razv){ case 0: mn=4; per=0;raz=0;;break; case 1: mn=2; per=0;raz=0;;break; case 2: mn=1; per=0;raz=0;break; case 3: mn=1; per=0;raz=1;break; case 4: mn=1; per=1;raz=1;break; case 5: mn=1; per=2;raz=1;break; case 6: mn=1; per=3;raz=1;break; case 7: mn=1; per=3;raz=2;break; case 8: mn=1; per=3;raz=3;break; case 9: mn=1; per=3;raz=4;break; case 10: mn=1; per=3;raz=5;break; case 11: mn=1; per=3;raz=6;break; case 12: mn=1; per=3;raz=7;break; } }
How to make Simple 500KHz Oscilloscope with STM32 ( Arduino IDE )

Raspberry Pi 5 7 Inch Touch Screen IPS 1024x600 HD LCD HDMI-compatible Display for RPI 4B 3B+ OPI 5 AIDA64 PC Secondary Screen(Without Speaker)
BUY NOW
ESP32-S3 4.3inch Capacitive Touch Display Development Board, 800×480, 5-point Touch, 32-bit LX7 Dual-core Processor
BUY NOW
Raspberry Pi 5 7 Inch Touch Screen IPS 1024x600 HD LCD HDMI-compatible Display for RPI 4B 3B+ OPI 5 AIDA64 PC Secondary Screen(Without Speaker)
BUY NOW- 0 USER VOTES
- YOUR VOTE 0.00 0.00
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
More by Mirko Pavleski
-
Review and Comparison of Three Inexpensive Metal Detector Kits A metal detector is a device used to detect the presence of metal objects in the ground or other ma...
-
How to make simple Arduino RGB Led strip VU Meter VU meter or volume unit meter is a device intended for visual presentation of the audio signal. It ...
-
DIY Simple Antistress and Relaxation PEMF Device based on Schumannn resonance frequency 7.83 Hz Schumann resonances are global electromagnetic resonances, generated by lightning discharges in the...
-
DIY Si4825 A10 multiband Radio (MW,SW,FM) Thanks to the production of specialized radio chips, nowadays it is possible to make a quality mult...
-
DIY simple HUNTER Led Game with Arduino Some time ago I presented you a simple to make, but interesting game, a 1D version simulation of "P...
-
XHDATA D-109WB Radio Short Review with complete disassembly Recently I received a shipment of a radio from the brand XHDATA model: D-109WB, so I immediately de...
-
Arduino 3D Printed self Balancing Cube Self-balancing devices are electronic devices that use sensors and motors to keep themselves balanc...
-
ESP32 Analog style VU meter with GC9A01 Round Dispalys + Peak Meters A typical VU meter measures audio signals and displays them with a visual indicator. In the classic...
-
Arduino two weel self Balancing Robot Self Balancing Robot is device that can balance itself from falling to the ground. Its function is ...
-
ELECROW CrowPanel ESP32 4.2” E-paper Wi-Fi Info-Dispaly Project An e-paper display (also known as an electronic paper display or E Ink display) is a type of screen...
-
ESP32 Fluid simulation on 16x16 Led Matrix Fluid simulation is a way of replicating the movement and behavior of liquids and gases in differen...
-
Simple GU50 VTTC Tesla Coil with MOT (25+cm Spark) Vacuum Tube Tesla Coils are a common choice for homebuilders for several practical reasons. At Soli...
-
Hourglass ESP8266 Code A hourglass, also known as an sand clock, is a device used to measure the passage of time. It consi...
-
Tug of War Arduino Game on WS2812 Led strip A Tug of War is a classic team-based game where two opposing teams compete to pull a rope in opposi...
-
DIY ESP32 Bioresonance Rife Machine with ZAPPER function Rife machine therapy is an alternative treatment developed by Dr. Royal Raymond Rife in the 1930s. H...
-
Arduino VFO Project with a Large LCD Display A Variable Frequency Oscillator (VFO) is an electronic oscillator whose output frequency can be adj...
-
Exploring the Tesla Coil Driver Board, Full Review & Test Results Some time ago I presented you a video in which I analyzed a super cheap Tesla Coil driver that cost...
-
Arduino Eatrthquake alarm and protection system with D7S seismic Sensor Earthquakes are extremely common events around the world. On average, there are fifty earthquakes a...
-
Review and Comparison of Three Inexpensive Metal Detector Kits A metal detector is a device used to detect the presence of metal objects in the ground or other ma...
-
How to make simple Arduino RGB Led strip VU Meter VU meter or volume unit meter is a device intended for visual presentation of the audio signal. It ...
-
DIY Simple Antistress and Relaxation PEMF Device based on Schumannn resonance frequency 7.83 Hz Schumann resonances are global electromagnetic resonances, generated by lightning discharges in the...
-
DIY Si4825 A10 multiband Radio (MW,SW,FM) Thanks to the production of specialized radio chips, nowadays it is possible to make a quality mult...
-
DIY simple HUNTER Led Game with Arduino Some time ago I presented you a simple to make, but interesting game, a 1D version simulation of "P...
-
XHDATA D-109WB Radio Short Review with complete disassembly Recently I received a shipment of a radio from the brand XHDATA model: D-109WB, so I immediately de...
-
Arduino 3D Printed self Balancing Cube Self-balancing devices are electronic devices that use sensors and motors to keep themselves balanc...
-
ESP32 Analog style VU meter with GC9A01 Round Dispalys + Peak Meters A typical VU meter measures audio signals and displays them with a visual indicator. In the classic...
-
Arduino two weel self Balancing Robot Self Balancing Robot is device that can balance itself from falling to the ground. Its function is ...
-
ELECROW CrowPanel ESP32 4.2” E-paper Wi-Fi Info-Dispaly Project An e-paper display (also known as an electronic paper display or E Ink display) is a type of screen...
-
ESP32 Fluid simulation on 16x16 Led Matrix Fluid simulation is a way of replicating the movement and behavior of liquids and gases in differen...
-
Simple GU50 VTTC Tesla Coil with MOT (25+cm Spark) Vacuum Tube Tesla Coils are a common choice for homebuilders for several practical reasons. At Soli...
-
Modifying a Hotplate to a Reflow Solder Station
190 0 2 -
MPL3115A2 Barometric Pressure, Altitude, and Temperature Sensor
143 0 1 -
-
Nintendo 64DD Replacement Shell
185 0 1 -
V2 Commodore AMIGA USB-C Power Sink Delivery High Efficiency Supply Triple Output 5V ±12V OLED display ATARI compatible shark 100W
397 4 1 -
How to measure weight with Load Cell and HX711
432 0 3 -
-
Instrumentation Input, high impedance with 16 bit 1MSPS ADC for SPI
534 0 0
Try on: https://www.hackster.io/mircemk/diy-simple-500khz-oscilloscope-with-stm32-arduino-ide-a06cd1