Manufaturação industrial
Internet das coisas industrial | Materiais industriais | Manutenção e reparo de equipamentos | Programação industrial |
home  MfgRobots >> Manufaturação industrial >  >> Manufacturing Technology >> Processo de manufatura

Como fazer um mini osciloscópio em casa usando o Arduino Nano

Componentes e suprimentos

Arduino Nano R3
× 1
ElectroPeak 0.96 "Módulo de exibição OLED 64x128
× 1
Interruptor tátil, acionado pela parte superior
× 9
1N4148 - Troca rápida para fins gerais
× 4

Aplicativos e serviços online

Arduino IDE

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

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