Como fazer um mini osciloscópio em casa usando o Arduino Nano
Componentes e suprimentos
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 9 | |||
![]() |
| × | 4 |
Aplicativos e serviços online
![]() |
|
Sobre este projeto
Neste vídeo, vou mostrar como fazer seu próprio mini osciloscópio em casa. É simples e fácil de fazer. Não é meu próprio código, apenas faço um tutorial para vocês. Para fazer este projeto, contei com o código-fonte de terceiros, cujo link é fornecido a seguir. Se você tiver alguma dúvida ou sugestão, fique à vontade para comentar no meu vídeo do youtube e não se esqueça de curtir e se inscrever no meu canal do YouTube .
Clique aqui para obter o tutorial completo e o código-fonte.
Meu IG:https://www.instagram.com/pm.goharian/
Componentes necessários
- Arduino Nano
- Tela OLED SSD1306
- 1N4148
- Microswitch
- 104 capacitor
- Resistores:100Ω, 12k, 120k, 510k
O que é osciloscópio?
Um ‘osciloscópio’, anteriormente denominado ‘oscilógrafo’, e informalmente conhecido como osciloscópio ou o-scope , CRO (para osciloscópio de raios catódicos) ou DSO (para o osciloscópio de armazenamento digital mais moderno), é um tipo de instrumento de teste eletrônico que exibe graficamente sinais variados [tensões], geralmente como um gráfico bidimensional de um ou mais sinais em função do tempo. Outros sinais (como som ou vibração) podem ser convertidos em voltagens e exibidos.
Os osciloscópios exibem a mudança de um sinal elétrico ao longo do tempo, com a tensão e o tempo como os eixos Y e X, respectivamente, em uma escala calibrada. A forma de onda pode então ser analisada por propriedades como amplitude, frequência, tempo de subida, intervalo de tempo, distorção e outros. Instrumentos digitais modernos podem calcular e exibir essas propriedades diretamente. Originalmente, o cálculo desses valores exigia medir manualmente a forma de onda em relação às escalas embutidas na tela do instrumento.
Esquemas para o projeto
Nota: Certifique-se de que todas as conexões em seu circuito sejam exatamente as mesmas que nos esquemas.



referência:
http://radiopench.blog96.fc2.com/blog-entry-893.html
https://www.wikipedia.org/
Código
- código
código C / C ++
/ * (_20190212_OLEDoscilloscope.ino) 1285byte RAM grátis 12/02/2019 * / # include#include #include #include // PROGMEM # include #define SCREEN_WIDTH 128 // Largura do display OLED # define SCREEN_HEIGHT 64 // Altura do display OLED # define REC_LENGTH 200 // // Declaração para um display SSD1306 conectado a I2C (pinos SDA, SCL) #define OLED_RESET -1 // Redefine o pino # (ou -1 se compartilhar o pino de redefinição do Arduino) Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); // const char vRangeName [10] [5] PROGMEM ={"A50V", "A 5 V", "50 V", "20 V", "10 V", "5 V", "2 V", "1 V", "0,5 V", "0,2 V"}; // \ 0const char * const vstring_table [] PROGMEM ={vRangeName [0], vRangeName [1], vRangeName [2], vRangeName [3], vRangeName [4], vRangeName [5], vRangeName [6], vRangeName [ 7], vRangeName [8], vRangeName [9]}; const char hRangeName [8] [6] PROGMEM ={"50ms", "20ms", "10ms", "5ms", "2ms", "1ms", "500us", "200us"}; // (48const char * const hstring_table [] PROGMEM ={hRangeName [0], hRangeName [1], hRangeName [2], hRangeName [3], hRangeName [4], hRangeName [5], hRangeName [6], hRangeName [ 7]}; int waveBuff [REC_LENGTH]; // (RAM) char chrBuff [10]; // String hScale ="xxxAs"; String vScale ="xxxx"; float lsb5V =0,0055549; // 5V0.005371 V / 1LSBfloat lsb50V =0,051513; // 50V 0,05371volátil int vRange; // 0:A50V, 1:A 5V, 2:50V, 3:20V, 4:10V, 5:5V, 6:2V, 7:1V, 8:0,5 Vvolatile int hRange; // 0:50m, 1:20m, 2:10m, 3:5m, 4; 2m, 5:1m, 6:500u, 7; 200uvolatile int trigD; // 0:1:volátil int scopeP; // 0 :, 1 :, 2:volatile boolean hold =false; // volatile boolean paraChanged =false; // truevolatile int saveTimer; // EEPROMint timeExec; // (ms) int dataMin; // (min:0) int dataMax; // (máx:1023) int dataAve; // 10 máx .:10230) int rangeMax; // int rangeMin; // int rangeMaxDisp; // max100int rangeMinDisp; // minint trigP; // trigSync booleano; // int att10x; // 1void setup () {pinMode (2, INPUT_PULLUP); // (int0 pinMode (8, INPUT_PULLUP); // Selecionar pinMode (9, INPUT_PULLUP); // Up pinMode (10, INPUT_PULLUP); // Down pinMode (11, INPUT_PULLUP); // Manter pinMode (12, INPUT); // 1/10 pinMode (13, OUTPUT); // // Serial.begin (115200); // RAM if (! Display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Endereço 0x3C para 128x64 // Serial. println (F ("SSD1306 falhou")); for (;;); // Não continue, faça um loop para sempre} loadEEPROM (); // EEPROM analogReference (INTERNAL); // ADC1.1Vvref) attachInterrupt (0, pin2IRQ , QUEDA); // Tela inicial(); //} void loop () {digitalWrite (13, HIGH); setConditions (); // RAM40 readWave (); // (1,6 ms) digitalWrite (13, LOW); // dataAnalize (); // (0,4-0,7ms) writeCommonImage (); // (4.6ms) plotData (); // (5,4 ms +) dispInf (); // (6,2 ms) display.display (); // (37ms) saveEEPROM (); // EEPROM while (hold ==true) {// Hold dispHold (); atraso (10); }} void setConditions () {// // PROGMEM strcpy_P (chrBuff, (char *) pgm_read_word (&(hstring_table [hRange]))); // hScale =chrBuff; // hScale // strcpy_P (chrBuff, (char *) pgm_read_word (&(vstring_table [vRange]))); // vScale =chrBuff; // switch vScale (vRange) {// case 0:{// Auto50V // rangeMax =1023; // rangeMin =0; att10x =1; // pausa; } caso 1:{// 5V automático // rangeMax =1023; // rangeMin =0; att10x =0; // pausa; } caso 2:{// 50V rangeMax =50 / lsb50V; // rangeMaxDisp =5000; // 100 rangeMin =0; rangeMinDisp =0; att10x =1; // pausa; } caso 3:{// 20V rangeMax =20 / lsb50V; // rangeMaxDisp =2000; rangeMin =0; rangeMinDisp =0; att10x =1; // pausa; } caso 4:{// 10V rangeMax =10 / lsb50V; // rangeMaxDisp =1000; rangeMin =0; rangeMinDisp =0; att10x =1; // pausa; } caso 5:{// 5V rangeMax =5 / lsb5V; // rangeMaxDisp =500; rangeMin =0; rangeMinDisp =0; att10x =0; // pausa; } caso 6:{// 2V rangeMax =2 / lsb5V; // rangeMaxDisp =200; rangeMin =0; rangeMinDisp =0; att10x =0; // pausa; } caso 7:{// 1V rangeMax =1 / lsb5V; // rangeMaxDisp =100; rangeMin =0; rangeMinDisp =0; att10x =0; // pausa; } caso 8:{// 0,5V rangeMax =0,5 / lsb5V; // rangeMaxDisp =50; rangeMin =0; rangeMinDisp =0; att10x =0; // pausa; } caso 9:{// 0,5V rangeMax =0,2 / lsb5V; // rangeMaxDisp =20; rangeMin =0; rangeMinDisp =0; att10x =0; // pausa; }}} void writeCommonImage () {// display.clearDisplay (); // (0,4ms) display.setTextColor (WHITE); // display.setCursor (86, 0); // Comece no canto superior esquerdo display.println (F ("av V")); // 1 display.drawFastVLine (26, 9, 55, WHITE); // display.drawFastVLine (127, 9, 55, WHITE); // display.drawFastHLine (24, 9, 7, WHITE); // Max display.drawFastHLine (24, 36, 2, WHITE); // display.drawFastHLine (24, 63, 7, WHITE); // display.drawFastHLine (51, 9, 3, WHITE); // Max display.drawFastHLine (51, 63, 3, WHITE); // display.drawFastHLine (76, 9, 3, WHITE); // Max display.drawFastHLine (76, 63, 3, WHITE); // display.drawFastHLine (101, 9, 3, WHITE); // Max display.drawFastHLine (101, 63, 3, WHITE); // display.drawFastHLine (123, 9, 5, WHITE); // Max display.drawFastHLine (123, 63, 5, WHITE); // para (int x =26; x <=128; x + =5) {display.drawFastHLine (x, 36, 2, BRANCO); // ()} for (int x =(127 - 25); x> 30; x - =25) {for (int y =10; y <63; y + =5) {display.drawFastVLine (x, y , 2, BRANCO); // 3}}} void readWave () {// if (att10x ==1) {// 1/10 pinMode (12, OUTPUT); // digitalWrite (12, LOW); // LOW} else {// pinMode (12, INPUT); // Hi-z} switch (hRange) {// case 0:{// 50ms timeExec =400 + 50; // (ms) EEPROM ADCSRA =ADCSRA &0xf8; // 3 ADCSRA =ADCSRA | 0x07; // 128 (arduino para (int i =0; i dataMax) {// dataMax =d; }} // dataAve =(soma + 10) / 20; // 10 // máx., Mín. If (vRange <=1) {// Auto1 rangeMin =dataMin - 20; // -20 rangeMin =(rangeMin / 10) * 10; // 10 if (rangeMin <0) {rangeMin =0; // 0} rangeMax =dataMax + 20; // +20 rangeMax =((rangeMax / 10) + 1) * 10; // 10 if (rangeMax> 1020) {rangeMax =1023; // 10201023} if (att10x ==1) {// rangeMaxDisp =100 * (rangeMax * lsb50V); // ADC rangeMinDisp =100 * (rangeMin * lsb50V); //} else {// rangeMaxDisp =100 * (rangeMax * lsb5V); rangeMinDisp =100 * (rangeMin * lsb5V); }} else {// //} // for (trigP =((REC_LENGTH / 2) - 51); trigP <((REC_LENGTH / 2) + 50); trigP ++) {// if (trigD ==0) { // 0 if ((waveBuff [trigP - 1] <(dataMax + dataMin) / 2) &&(waveBuff [trigP]> =(dataMax + dataMin) / 2)) {break; //}} else {// 0 if ((waveBuff [trigP - 1]> (dataMax + dataMin) / 2) &&(waveBuff [trigP] <=(dataMax + dataMin) / 2)) {break; } //}} trigSync =true; if (trigP> =((REC_LENGTH / 2) + 50)) {// trigP =(REC_LENGTH / 2); trigSync =false; // Unsync}} void startScreen () {// display.clearDisplay (); display.setTextSize (1); // 2 display.setTextColor (WHITE); // display.setCursor (10, 25); // display.println (F ("PM.GOHARIAN")); // display.setCursor (10, 45); // display.println (F ("Pen oscope")); display.display (); // atraso (5000); display.clearDisplay (); display.setTextSize (1); //} void dispHold () {// Manter display.fillRect (32, 12, 24, 8, BLACK); // 4 display.setCursor (32, 12); display.print (F ("Hold")); // Hold display.display (); //} void dispInf () {// voltagem flutuante; // display.setCursor (2, 0); // display.print (vScale); // if (scopeP ==0) {// display.drawFastHLine (0, 7, 27, WHITE); // display.drawFastVLine (0, 5, 2, WHITE); display.drawFastVLine (26, 5, 2, BRANCO); } // display.setCursor (34, 0); // display.print (hScale); // (tempo / div) if (scopeP ==1) {// display.drawFastHLine (32, 7, 33, WHITE); // display.drawFastVLine (32, 5, 2, WHITE); display.drawFastVLine (64, 5, 2, BRANCO); } // display.setCursor (75, 0); // if (trigD ==0) {display.print (char (0x18)); //} else {display.print (char (0x19)); //} if (scopeP ==2) {// display.drawFastHLine (71, 7, 13, WHITE); // display.drawFastVLine (71, 5, 2, WHITE); display.drawFastVLine (83, 5, 2, BRANCO); } // if (att10x ==1) {// 10 voltage =dataAve * lsb50V / 10.0; // 50V} else {voltage =dataAve * lsb5V / 10.0; // 5V} dtostrf (voltagem, 4, 2, chrBuff); // x.xx display.setCursor (98, 0); // display.print (chrBuff); // // display.print (saveTimer); // // tensão =rangeMaxDisp / 100.0; // Max if (vRange ==1 || vRange> 4) {// 5VAuto5V dtostrf (voltage, 4, 2, chrBuff); // *. **} else {// dtostrf (voltage, 4, 1, chrBuff); // **. *} display.setCursor (0, 9); display.print (chrBuff); // Tensão máxima =(rangeMaxDisp + rangeMinDisp) / 200,0; // if (vRange ==1 || vRange> 4) {// 5VAuto5V dtostrf (voltage, 4, 2, chrBuff); // 2} else {// dtostrf (voltagem, 4, 1, chrBuff); // 1} display.setCursor (0, 33); display.print (chrBuff); // tensão =rangeMinDisp / 100.0; // Min if (vRange ==1 || vRange> 4) {// 5VAuto5V dtostrf (voltage, 4, 2, chrBuff); // 2} else {dtostrf (voltagem, 4, 1, chrBuff); // 1} display.setCursor (0, 57); display.print (chrBuff); // Min // if (trigSync ==false) {// display.setCursor (60, 55); // display.print (F ("Unsync")); // dessincronizar}} void plotData () {// long y1, y2; para (int x =0; x <=98; x ++) {y1 =map (waveBuff [x + trigP - 50], rangeMin, rangeMax, 63, 9); // y1 =restrição (y1, 9, 63); // y2 =map (waveBuff [x + trigP - 49], rangeMin, rangeMax, 63, 9); // y2 =restrição (y2, 9, 63); // display.drawLine (x + 27, y1, x + 28, y2, BRANCO); //}} void saveEEPROM () {// EEPROM if (paraChanged ==true) {// saveTimer =saveTimer - timeExec; // if (saveTimer <0) {// paraChanged =false; // EEPROM.write (0, vRange); // EEPROM.write (1, hRange); EEPROM.write (2, trigD); EEPROM.write (3, escopoP); }}} void loadEEPROM () {// EEPROM int x; x =EEPROM.read (0); // vRange if ((x <0) || (x> 9)) {// 0-9 x =3; //} vRange =x; x =EEPROM.read (1); // hRange if ((x <0) || (x> 7)) {// 0-9 x =3; //} hRange =x; x =EEPROM.read (2); // trigD if ((x <0) || (x> 1)) {// 0-9 x =1; //} trigD =x; x =EEPROM.read (3); // escopoP if ((x <0) || (x> 2)) {// 0-9 x =1; //} scopeP =x;} void pin2IRQ () {// Pin2 (int0) // pin8,9,10,11Pin2 // int x; // x =PINB; // B if ((x &0x07)! =0x07) {// 3High saveTimer =5000; // EEPROM (ms paraChanged =true; // ON} if ((x &0x01) ==0) {scopeP ++; if (scopeP> 2) {scopeP =0;}} if ((x &0x02) ==0 ) {// UP if (scopeP ==0) {// vRange ++; if (vRange> 9) {vRange =9;}} if (scopeP ==1) {// hRange ++; if (hRange> 7) {hRange =7;}} if (scopeP ==2) {// trigD =0; //}} if ((x &0x04) ==0) {// DOWN if (scopeP ==0) {// vRange- -; if (vRange <0) {vRange =0;}} if (scopeP ==1) {// hRange--; if (hRange <0) {hRange =0;}} if (scopeP ==2) { // trigD =1; //}} if ((x &0x08) ==0) {// HOLD hold =! hold; //}}
Esquemas

Processo de manufatura
- Faça uma máquina de escrever trabalhos de casa DIY em casa
- Console de edição DIY Photoshop usando Arduino Nano RP 2040
- Como fazer fibra de carbono a partir do zero em casa
- Faça Monitor Ambilight usando Arduino
- Como fazer um botão de teclado punível personalizável
- Como medir a massa da Terra usando o Arduino
- Como criar um site de comunicação do Arduino usando PHP
- Como fazer música com um Arduino
- Como fazer a abertura automática de porta baseada no Arduino
- Como fazer uma bússola usando Arduino e IDE de processamento