Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

Hoe maak je thuis een mini-oscilloscoop met Arduino Nano

Componenten en benodigdheden

Arduino Nano R3
× 1
ElectroPeak 0.96" OLED 64x128 displaymodule
× 1
Tactiele schakelaar, bovenkant bediend
× 9
1N4148 – Snel schakelen voor algemeen gebruik
× 4

Apps en online services

Arduino IDE

Over dit project

In deze video laat ik je zien hoe je thuis je eigen mini-oscilloscoop kunt maken. Het is eenvoudig en gemakkelijk te maken. Het is niet mijn eigen code, ik maak gewoon een tutorial voor jullie. Voor het maken van dit project was ik afhankelijk van de broncode van de derde partij, welke link hieronder wordt gegeven. Als je een vraag of suggestie hebt, kun je reageren in mijn YouTube-video en vergeet niet te liken en je te abonneren op mijn YouTube-kanaal .

Klik hier voor de volledige tutorial en broncode.

Mijn IG:https://www.instagram.com/pm.goharian/

Benodigde componenten

  • Arduino Nano
  • SSD1306 OLED-scherm
  • 1N4148
  • Microschakelaar
  • 104 condensator
  • Weerstanden:100Ω, 12k, 120k, 510k

Wat is een oscilloscoop?

Een 'oscilloscoop', voorheen een 'oscillograaf' genoemd, en informeel bekend als een scope of o-scope ,CRO (voor kathodestraaloscilloscoop), of DSO (voor de modernere digitale opslagoscilloscoop), is een type elektronisch testinstrument dat variërende signaal [voltages] grafisch weergeeft, gewoonlijk als een tweedimensionele grafiek van één of meer signalen als functie van tijd. Andere signalen (zoals geluid of trillingen) kunnen worden omgezet in spanningen en worden weergegeven.

Oscilloscopen geven de verandering van een elektrisch signaal in de tijd weer, met spanning en tijd als respectievelijk de Y- en X-as, op een gekalibreerde schaal. De golfvorm kan vervolgens worden geanalyseerd op eigenschappen zoals amplitude, frequentie, stijgtijd, tijdsinterval, vervorming en andere. Moderne digitale instrumenten kunnen deze eigenschappen direct berekenen en weergeven. Oorspronkelijk vereiste de berekening van deze waarden het handmatig meten van de golfvorm tegen de schalen die in het scherm van het instrument waren ingebouwd.

Schema's voor het project

Opmerking: Zorg ervoor dat alle verbindingen in uw circuit precies hetzelfde zijn als in schema's.

referentie :

http://radiopench.blog96.fc2.com/blog-entry-893.html

https://www.wikipedia.org/

Code

  • code
codeC/C++
/* (_20190212_OLEDoscilloscope.ino) 1285byte ram gratis 2019/02/12 */#include #include #include #include  // PROGMEM#include #define SCREEN_WIDTH 128 // OLED-display width#define SCREEN_HEIGHT 64 // OLED-display height#define REC_LENGTH 200 // // Verklaring voor een SSD1306-display aangesloten op I2C (SDA, SCL-pinnen) #define OLED_RESET -1 // Reset pin # (of -1 als Arduino reset pin wordt gedeeld) Adafruit_SSD1306 display (SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);//const char vRangeName [10][5] PROGMEM ={"A50V", "A 5V", "50V", "20V", "10V", "5V", "2V", "1V", "0.5V", "0.2V"}; // \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,05371vluchtig int vBereik; // 0:A50V, 1:A 5V, 2:50V, 3:20V, 4:10V, 5:5V, 6:2V, 7:1V, 8:0,5 Vvluchtig int hBereik; // 0:50m, 1:20m, 2:10m, 3:5m, 4;2m, 5:1m, 6:500u, 7;200volatile int trigD; // 0:1:vluchtig int scopeP; // 0:, 1:, 2:vluchtige boolean hold =false; // vluchtige boolean paraChanged =false; // truevolatile int saveTimer; // EEPROMint timeExec; // (ms)int dataMin; // (min:0) int dataMax; // (max:1023)int dataAve; // 10 max:10230)int rangeMax; // int-bereikMin; // int-bereikMaxDisp; // max100int bereikMinDisp; // minit trigP; // booleaanse trigSync; // int att10x; // 1void setup () { pinMode (2, INPUT_PULLUP); // (int0 pinMode (8, INPUT_PULLUP); // Selecteer pinMode (9, INPUT_PULLUP); // Up pinMode (10, INPUT_PULLUP); // Down pinMode (11, INPUT_PULLUP); // Houd pinMode (12, INPUT); // 1/10 pinMode (13, OUTPUT); // // Serial.begin (115200); // RAM if (!display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Adres 0x3C voor 128x64 // Serieel. println (F ("SSD1306 mislukt")); for (;;); // Ga niet verder, loop voor altijd } loadEEPROM (); // EEPROM analogReference (INTERNAL); // ADC1.1Vvref) attachInterrupt (0, pin2IRQ , VALLEN); // start scherm(); // }void loop() {digitalWrite(13, HIGH); setConditions(); // RAM40 readWave(); // (1,6 ms) digitalWrite (13, LAAG); // dataAnalize(); // (0,4-0,7 ms) writeCommonImage(); // (4,6 ms) plotData(); // (5,4 ms+) dispInf(); // (6,2 ms) display.display(); // (37ms) saveEEPROM(); // EEPROM while (hold ==true) {// Hold dispHold(); vertraging(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; // vScale-schakelaar (vRange) { // case 0:{ // Auto50V // rangeMax =1023; // bereikMin =0; att10x =1; // pauze; } geval 1:{ // Auto 5V // bereikMax =1023; // bereikMin =0; att10x =0; // pauze; } geval 2:{ // 50V-bereikMax =50 / lsb50V; // bereikMaxDisp =5000; // 100 bereikMin =0; bereikMinDisp =0; att10x =1; // pauze; } geval 3:{ // 20V bereikMax =20 / lsb50V; // bereikMaxDisp =2000; bereikMin =0; bereikMinDisp =0; att10x =1; // pauze; } geval 4:{ // 10V bereik Max =10 / lsb50V; // bereikMaxDisp =1000; bereikMin =0; bereikMinDisp =0; att10x =1; // pauze; } geval 5:{ // 5V bereikMax =5 / lsb5V; // bereikMaxDisp =500; bereikMin =0; bereikMinDisp =0; att10x =0; // pauze; } geval 6:{ // 2V-bereik Max =2 / lsb5V; // bereikMaxDisp =200; bereikMin =0; bereikMinDisp =0; att10x =0; // pauze; } geval 7:{ // 1V bereikMax =1 / lsb5V; // bereikMaxDisp =100; bereikMin =0; bereikMinDisp =0; att10x =0; // pauze; } geval 8:{ // 0,5V bereik Max =0,5 / lsb5V; // bereikMaxDisp =50; bereikMin =0; bereikMinDisp =0; att10x =0; // pauze; } geval 9:{ // 0,5V bereikMax =0,2 / lsb5V; // bereikMaxDisp =20; bereikMin =0; bereikMinDisp =0; att10x =0; // pauze; } }} ongeldig writeCommonImage () { // display.clearDisplay (); // (0,4 ms) display.setTextColor (WIT); // display.setCursor (86, 0); // Begin in de linkerbovenhoek display.println (F ("av V")); // 1 display.drawFastVLine (26, 9, 55, WIT); // display.drawFastVLine (127, 9, 55, WIT); // display.drawFastHLin(24, 9, 7, WIT); // Max display.drawFastHLin (24, 36, 2, WIT); // display.drawFastHLin(24, 63, 7, WIT); // display.drawFastHLin(51, 9, 3, WIT); // Max display.drawFastHLin (51, 63, 3, WIT); // display.drawFastHLin(76, 9, 3, WIT); // Max display.drawFastHLin (76, 63, 3, WIT); // display.drawFastHLin(101, 9, 3, WIT); // Max display.drawFastHLin (101, 63, 3, WIT); // display.drawFastHLine (123, 9, 5, WIT); // Max display.drawFastHLin (123, 63, 5, WIT); // for (int x =26; x <=128; x +=5) { display.drawFastHLine (x, 36, 2, WIT); // () } for (int x =(127 - 25); x> 30; x -=25) { for (int y =10; y <63; y +=5) { display.drawFastVLine(x, y , 2, WIT); // 3 } }} ongeldig readWave () { // if (att10x ==1) { // 1/10 pinMode (12, OUTPUT); // digitalWrite (12, LAAG); // LAAG} 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 voor (int i =0; i  dataMax) {// dataMax =d; } } // dataAve =(som + 10) / 20; // 10 // max,min if (vRange <=1) { // Auto1 rangeMin =dataMin - 20; // -20 bereikMin =(bereikMin / 10) * 10; // 10 if (rangeMin <0) { rangeMin =0; // 0 } bereikMax =dataMax + 20; // +20 bereikMax =((bereikMax/10) + 1) * 10; // 10 als (bereikMax> 1020) {bereikMax =1023; // 10201023 } if (att10x ==1) { // rangeMaxDisp =100 * (rangeMax * lsb50V); // ADC-bereikMinDisp =100 * (bereikMin * lsb50V); // } else { // rangeMaxDisp =100 * (rangeMax * lsb5V); bereikMinDisp =100 * (bereikMin * 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 =waar; if (trigP>=((REC_LENGTH / 2) + 50)) { // trigP =(REC_LENGTH / 2); trigSync =onwaar; // Unsync}} ongeldig startScreen () { // display.clearDisplay (); display.setTextSize(1); // 2 display.setTextColor (WIT); // display.setCursor (10, 25); // display.println(F("PM.GOHARIAN")); // display.setCursor (10, 45); // display.println (F ("Penoscoop")); weergave.weergave(); // vertraging (5000); display.clearDisplay(); display.setTextSize(1); // }void dispHold() { // Houd display.fillRect (32, 12, 24, 8, ZWART); // 4 display.setCursor (32, 12); display.print(F("Houd vast")); // Houd display.display(); //}void dispInf() {// float-spanning; // display.setCursor (2, 0); // display.print (vScale); // if (scopeP ==0) { // display.drawFastHLine (0, 7, 27, WIT); // display.drawFastVLine (0, 5, 2, WIT); display.drawFastVLine(26, 5, 2, WIT); } // display.setCursor (34, 0); // display.print (hScale); // (tijd/div) if (scopeP ==1) { // display.drawFastHLin(32, 7, 33, WIT); // display.drawFastVLine(32, 5, 2, WIT); display.drawFastVLine(64, 5, 2, WIT); } // display.setCursor (75, 0); // if (trigD ==0) { display.print (char (0x18)); // } else { display.print(char (0x19)); // } if (scopeP ==2) { // display.drawFastHLine (71, 7, 13, WIT); // display.drawFastVLine(71, 5, 2, WIT); display.drawFastVLine(83, 5, 2, WIT); } // if (att10x ==1) { // 10 spanning =dataAve * lsb50V / 10.0; // 50V } else { voltage =dataAve * lsb5V / 10.0; // 5V } dtostrf (voltage, 4, 2, chrBuff); // x.xx display.setCursor (98, 0); // display.print (chrBuff); // // display.print (saveTimer); // // spanning =bereikMaxDisp / 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); // Max. spanning =(bereikMaxDisp + bereikMinDisp) / 200,0; // if (vRange ==1 || vRange> 4) {// 5VAuto5V dtostrf (voltage, 4, 2, chrBuff); // 2 } else { // dtostrf(voltage, 4, 1, chrBuff); // 1 } display.setCursor (0, 33); display.print(chrBuff); // spanning =bereikMinDisp / 100.0; // Min if (vRange ==1 || vRange> 4) {// 5VAuto5V dtostrf (voltage, 4, 2, chrBuff); // 2 } else { dtostrf(voltage, 4, 1, chrBuff); // 1 } display.setCursor (0, 57); display.print(chrBuff); // Min // if (trigSync ==false) {// display.setCursor (60, 55); // display.print (F ("Unsync")); // Unsync }}void plotData () { // lange y1, y2; for (int x =0; x <=98; x++) { y1 =map(waveBuff[x + trigP - 50], rangeMin, rangeMax, 63, 9); // y1 =beperking (y1, 9, 63); // y2 =map (waveBuff [x + trigP - 49], rangeMin, rangeMax, 63, 9); // y2 =beperking (y2, 9, 63); // display.drawLine (x + 27, y1, x + 28, y2, WIT); // }} ongeldig 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, scopeP); } }} void loadEEPROM () { // EEPROM int x; x =EEPROM.lezen (0); // vRange if ((x <0) || (x> 9)) { // 0-9 x =3; // } vBereik =x; x =EEPROM.lezen(1); // hRange if ((x <0) || (x> 7)) {// 0-9 x =3; // } hBereik =x; x =EEPROM.lezen (2); // trigD if ((x <0) || (x> 1)) {// 0-9 x =1; //} trigD =x; x =EEPROM.lezen (3); // scopeP if ((x <0) || (x> 2)) {// 0-9 x =1; // } scopeP =x;} ongeldig 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; // }}

Schema's


Productieproces

  1. Maak thuis een zelfgemaakte schrijfmachine voor huiswerk
  2. DIY Photoshop-bewerkingsconsole met Arduino Nano RP 2040
  3. Hoe maak je thuis koolstofvezel van scratch
  4. Maak Monitor Ambilight met Arduino
  5. Een aanpasbare ponsbare toetsenbordknop maken
  6. Hoe de massa van de aarde te meten met Arduino
  7. Een website maken die Arduino communiceert met PHP
  8. Muziek maken met een Arduino
  9. Hoe maak je op Arduino gebaseerde automatische deuropening
  10. Maak een eetrobot met Arduino Nano | Gouden schroef
  11. Hoe maak je een kompas met Arduino en Processing IDE?