亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

如何在家里使用 Arduino Nano 制作迷你示波器

组件和用品

Arduino Nano R3
× 1
ElectroPeak 0.96" OLED 64x128 显示模块
× 1
触觉开关,顶部驱动
× 9
1N4148 – 通用快速切换
× 4

应用和在线服务

Arduino IDE

关于这个项目

在本视频中,我将向您展示如何在家制作自己的迷你示波器。制作起来简单易行。它不是我自己的代码,我只是为你们制作教程。为了制作这个项目,我依赖了第三方源代码,下面给出了链接。如果您有任何问题或建议,请随时在我的 YouTube 视频中发表评论,请不要忘记喜欢和订阅我的 YouTube 频道 .

单击此处获取完整教程和源代码。

我的 IG :https://www.instagram.com/pm.goharian/

需要的组件

  • Arduino Nano
  • SSD1306 OLED 显示屏
  • 1N4148
  • 微动开关
  • 104 电容
  • 电阻:100Ω、12k、120k、510k

什么是示波器?

“示波器”,以前称为“示波器”,非正式地称为 示波器o 范围 ,CRO (用于阴极射线示波器),或 DSO (对于更现代的数字存储示波器),是一种电子测试仪器,以图形方式显示变化的信号 [电压],通常作为一个或多个信号随时间变化的二维图。其他信号(如声音或振动)可转换为电压显示。

示波器在校准刻度上显示电信号随时间的变化,电压和时间分别作为 Y 轴和 X 轴。然后可以分析波形的属性,例如幅度、频率、上升时间、时间间隔、失真等。现代数字仪器可以直接计算和显示这些属性。最初,这些值的计算需要根据仪器屏幕内置的刻度手动测量波形。

项目示意图

注意: 确保电路中的所有连接与原理图完全相同。

<人物>

<人物>

<人物>

参考:

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

https://www.wikipedia.org/

代码

  • 代码
代码C/C++
/* (_20190212_OLEDoscilloscope.ino) 1285byte ram free 2019/02/12 */#include #include #include #include  // PROGMEM#include #define SCREEN_WIDTH 128 // OLED 显示器宽度#define SCREEN_HEIGHT 64 // OLED 显示器高度#define REC_LENGTH 200 // // SSD1306 显示器连接到 I2C(SDA、SCL 引脚)的声明#define OLED_RESET -1 // 复位引脚 #(如果共享 Arduino 复位引脚,则为 -1)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.05371volatile int vRange; // 0:A50V, 1:A 5V, 2:50V, 3:20V, 4:10V, 5:5V, 6:2V, 7:1V, 8:00 Vvolatile int hRange; // 0:50m, 1:20m, 2:10m, 3:5m, 4;2m, 5:1m, 6:500u, 7;200uvolatile int trigD; // 0:1:volatile int scopeP; // 0:, 1:, 2:volatile boolean hold =false; // volatile boolean paraChanged =false; // true volatile int saveTimer; // EEPROMint timeExec; // (ms)int dataMin; // (min:0) int dataMax; // (max:1023)int dataAve; // 10 max:10230)int rangeMax; // int rangeMin; // int rangeMaxDisp; // max100int rangeMinDisp; // minint trigP; // 布尔触发器同步; // int att10x; // 1void setup() { pinMode(2, INPUT_PULLUP); // (int0 pinMode(8, INPUT_PULLUP); // 选择 pinMode(9, INPUT_PULLUP); // Up pinMode(10, INPUT_PULLUP); // Down pinMode(11, INPUT_PULLUP); // 保持 pinMode(12, INPUT); // 1/10 pinMode(13, OUTPUT); // // Serial.begin(115200); // RAM if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 地址 0x3C 用于 128x64 // 串行。 println(F("SSD1306 failed")); for (;;); // 不要继续,永远循环 } loadEEPROM(); // EEPROM analogReference(INTERNAL); // ADC1.1Vvref) attachInterrupt(0, pin2IRQ , 坠落); // 开始屏幕(); // }void loop() { digitalWrite(13, HIGH);设置条件(); // RAM40 readWave(); // (1.6ms ) digitalWrite(13, LOW); // 数据分析(); // (0.4-0.7ms) writeCommonImage(); // (4.6ms) plotData(); // (5.4ms+) dispInf(); // (6.2ms) display.display(); // (37ms) saveEEPROM(); // EEPROM while (hold ==true) { // Hold dispHold();延迟(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 switch (vRange) { // case 0:{ // Auto50V // rangeMax =1023; // 范围最小值 =0; att10x =1; // 休息; } case 1:{ // Auto 5V // rangeMax =1023; // 范围最小值 =0; att10x =0; // 休息; } case 2:{ // 50V rangeMax =50 / lsb50V; // rangeMaxDisp =5000; // 100 范围最小值 =0; rangeMinDisp =0; att10x =1; // 休息; } case 3:{ // 20V rangeMax =20 / lsb50V; // rangeMaxDisp =2000;范围最小值 =0; rangeMinDisp =0; att10x =1; // 休息; } case 4:{ // 10V rangeMax =10 / lsb50V; // rangeMaxDisp =1000;范围最小值 =0; rangeMinDisp =0; att10x =1; // 休息; } case 5:{ // 5V rangeMax =5 / lsb5V; // rangeMaxDisp =500;范围最小值 =0; rangeMinDisp =0; att10x =0; // 休息; } case 6:{ // 2V rangeMax =2 / lsb5V; // rangeMaxDisp =200;范围最小值 =0; rangeMinDisp =0; att10x =0; // 休息; } case 7:{ // 1V rangeMax =1 / lsb5V; // rangeMaxDisp =100;范围最小值 =0; rangeMinDisp =0; att10x =0; // 休息; } case 8:{ // 0.5V rangeMax =0.5 / lsb5V; // rangeMaxDisp =50;范围最小值 =0; rangeMinDisp =0; att10x =0; // 休息; } case 9:{ // 0.5V rangeMax =0.2 / lsb5V; // rangeMaxDisp =20;范围最小值 =0; rangeMinDisp =0; att10x =0; // 休息; } }}void writeCommonImage() { // display.clearDisplay(); // (0.4ms) display.setTextColor(WHITE); // display.setCursor(86, 0); // 从左上角开始 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); // for (int x =26; x <=128; x +=5) { display.drawFastHLine(x, 36, 2, WHITE); // () } for (int x =(127 - 25); x> 30; x -=25) { for (int y =10; y <63; y +=5) { display.drawFastVLine(x, y , 2, 白色); // 3 } }}void readWave() { // if (att10x ==1) { // 1/10 pinMode(12, OUTPUT); // 数字写入(12,低); // 低 } 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 for (int i =0; i  dataMax) { // dataMax =d; } } // dataAve =(sum + 10) / 20; // 10 // max,min 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);触发同步 =假; // 不同步 }}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("Penoscope"));显示。显示(); // 延迟(5000); display.clearDisplay(); display.setTextSize(1); // }void dispHold() { // 保持 display.fillRect(32, 12, 24, 8, BLACK); // 4 display.setCursor(32, 12); display.print(F("Hold")); // 保持 display.display(); //}void dispInf() { // 浮动电压; // 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, 白色); } // display.setCursor(34, 0); // display.print(hScale); // (time/div) if (scopeP ==1) { // display.drawFastHLine(32, 7, 33, WHITE); // display.drawFastVLine(32, 5, 2, WHITE); display.drawFastVLine(64, 5, 2, WHITE); } // 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, 白色); } // if (att10x ==1) { // 10 电压 =dataAve * lsb50V / 10.0; // 50V } else { 电压 =dataAve * lsb5V / 10.0; // 5V } dtostrf(电压, 4, 2, chrBuff); // x.xx display.setCursor(98, 0); // display.print(chrBuff); // // display.print(saveTimer); // // 电压 =rangeMaxDisp / 100.0; // Max if (vRange ==1 || vRange> 4) { // 5VAuto5V dtostrf(电压, 4, 2, chrBuff); // *.** } else { // dtostrf(电压, 4, 1, chrBuff); // **.* } display.setCursor(0, 9);显示。打印(chrBuff); // 最大电压 =(rangeMaxDisp + rangeMinDisp) / 200.0; // if (vRange ==1 || vRange> 4) { // 5VAuto5V dtostrf(电压, 4, 2, chrBuff); // 2 } else { // dtostrf(电压, 4, 1, chrBuff); // 1 } display.setCursor(0, 33);显示。打印(chrBuff); // 电压 =rangeMinDisp / 100.0; // Min if (vRange ==1 || vRange> 4) { // 5VAuto5V dtostrf(电压, 4, 2, chrBuff); // 2 } else { dtostrf(电压, 4, 1, chrBuff); // 1 } display.setCursor(0, 57);显示。打印(chrBuff); // Min // if (trigSync ==false) { // display.setCursor(60, 55); // display.print(F("Unsync")); // 不同步 }}void plotData() { // long y1, y2; for (int x =0; x <=98; x++) { y1 =map(waveBuff[x + trigP - 50], rangeMin, rangeMax, 63, 9); // y1 =约束(y1, 9, 63); // y2 =map(waveBuff[x + trigP - 49], rangeMin, rangeMax, 63, 9); // y2 =约束(y2, 9, 63); // display.drawLine(x + 27, y1, x + 28, y2, WHITE); // }}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, scopeP); } }}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; // } 触发D =x; x =EEPROM.read(3); // scopeP 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; // }}

示意图


制造工艺

  1. 在家制作 DIY 作业书写机
  2. 使用 Arduino Nano RP 2040 的 DIY Photoshop 编辑控制台
  3. 如何在家从头开始制作碳纤维
  4. 使用 Arduino 制作流光溢彩监视器
  5. 如何制作可自定义的打孔键盘按钮
  6. 如何使用 Arduino 测量地球质量
  7. 如何使用 PHP 创建一个与 Arduino 通信的网站
  8. 如何用 Arduino 制作音乐
  9. 如何制作基于 Arduino 的自动开门
  10. 用 Arduino Nano 制作吃饭机器人 |金螺丝
  11. 家庭监视器
  12. 如何使用 Arduino 和 Processing IDE 制作指南针