Промышленное производство
Промышленный Интернет вещей | Промышленные материалы | Техническое обслуживание и ремонт оборудования | Промышленное программирование |
home  MfgRobots >> Промышленное производство >  >> Manufacturing Technology >> Производственный процесс

Как сделать мини-осциллограф дома с помощью Arduino Nano

Компоненты и расходные материалы

Arduino Nano R3
× 1
ElectroPeak 0.96 "OLED-дисплей 64x128"
× 1
Тактильный переключатель, срабатывающий сверху
× 9
1N4148 - быстрое переключение общего назначения
× 4

Приложения и онлайн-сервисы

IDE Arduino

Об этом проекте

В этом видео я покажу вам, как самому сделать мини-осциллограф в домашних условиях. Это просто и легко сделать. Это не мой собственный код, я просто делаю учебник для вас, ребята. Для создания этого проекта я полагался на сторонний исходный код, ссылка на который приведена ниже. Если у вас есть какие-либо вопросы или предложения, не стесняйтесь комментировать мое видео на YouTube и не забудьте поставить лайк и подписаться на мой канал YouTube .

Щелкните здесь, чтобы просмотреть полное руководство и исходный код.

Мой IG:https://www.instagram.com/pm.goharian/

Необходимые компоненты

  • Ардуино Нано
  • Дисплей SSD1306 OLED
  • 1N4148
  • Микропереключатель
  • Конденсатор 104
  • Резисторы:100 Ом, 12 кОм, 120 кОм, 510 кОм

Что такое осциллограф?

«Осциллограф», ранее называвшийся «осциллограф», а неофициально известный как осциллограф . или o-scope , CRO (для электронно-лучевого осциллографа) или DSO (для более современного цифрового запоминающего осциллографа) - это тип электронного испытательного прибора, который графически отображает изменяющийся сигнал [напряжения], обычно в виде двухмерного графика одного или нескольких сигналов в зависимости от времени. Другие сигналы (например, звук или вибрация) можно преобразовать в напряжение и отобразить.

Осциллографы отображают изменение электрического сигнала с течением времени, с напряжением и временем по осям Y и X, соответственно, на калиброванной шкале. Затем форма волны может быть проанализирована на предмет таких свойств, как амплитуда, частота, время нарастания, временной интервал, искажение и другие. Современные цифровые инструменты могут вычислять и отображать эти свойства напрямую. Первоначально расчет этих значений требовал ручного измерения формы волны по шкале, встроенной в экран прибора.

Схема проекта

Примечание. Убедитесь, что все соединения в вашей схеме точно такие же, как на схемах.

ссылка:

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

https://www.wikipedia.org/

Код

  • код
код C / C ++
 / * (_20190212_OLEDoscilloscope.ino) 1285 байт оперативной памяти бесплатно 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 // Сброс пина № (или -1, если общий пин сброса Arduino) 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 ={"50 мс", "20 мс", "10 мс", "5 мс", "2 мс", "1 мс", «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: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:volatile int scopeP; // 0 :, 1 :, 2:volatile boolean hold =false; // volatile boolean paraChanged =false; // trueevolatile int saveTimer; // EEPROMint timeExec; // (мс) int dataMin; // (мин:0) int dataMax; // (max:1023) int dataAve; // 10 max:10230) int rangeMax; // int rangeMin; // int rangeMaxDisp; // max100int rangeMinDisp; // minint trigP; // логическое значение trigSync; // int att10x; // 1void setup () {pinMode (2, INPUT_PULLUP); // (int0 pinMode (8, INPUT_PULLUP); // Выбрать pinMode (9, INPUT_PULLUP); // Вверх pinMode (10, INPUT_PULLUP); // Вниз pinMode (11, INPUT_PULLUP); // Удерживать pinMode (12, INPUT); // 1/10 pinMode (13, OUTPUT); // // Serial.begin (115200); // RAM if (! Display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Адрес 0x3C для 128x64 // Serial. println (F ("SSD1306 failed")); for (;;); // Не продолжать, цикл навсегда} loadEEPROM (); // EEPROM analogReference (INTERNAL); // ADC1.1Vvref) attachInterrupt (0, pin2IRQ , ПАДЕНИЕ); // стартовый экран(); //} void loop () {digitalWrite (13, HIGH); setConditions (); // RAM40 readWave (); // (1,6 мс) digitalWrite (13, LOW); // dataAnalize (); // (0,4-0,7 мс) writeCommonImage (); // (4.6 мс) plotData (); // (5,4 мс +) dispInf (); // (6.2 мс) display.display (); // (37 мс) saveEEPROM (); // EEPROM while (hold ==true) {// Удерживать 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 (vRange) {// case 0:{// Auto50V // rangeMax =1023; // rangeMin =0; att10x =1; // ломать; } case 1:{// Авто 5V // rangeMax =1023; // rangeMin =0; att10x =0; // ломать; } случай 2:{// 50V rangeMax =50 / lsb50V; // rangeMaxDisp =5000; // 100 rangeMin =0; rangeMinDisp =0; att10x =1; // ломать; } case 3:{// 20V rangeMax =20 / lsb50V; // rangeMaxDisp =2000; rangeMin =0; rangeMinDisp =0; att10x =1; // ломать; } case 4:{// 10V rangeMax =10 / lsb50V; // rangeMaxDisp =1000; rangeMin =0; rangeMinDisp =0; att10x =1; // ломать; } case 5:{// 5V rangeMax =5 / lsb5V; // rangeMaxDisp =500; rangeMin =0; rangeMinDisp =0; att10x =0; // ломать; } case 6:{// 2V rangeMax =2 / lsb5V; // rangeMaxDisp =200; rangeMin =0; rangeMinDisp =0; att10x =0; // ломать; } case 7:{// 1V rangeMax =1 / lsb5V; // rangeMaxDisp =100; rangeMin =0; rangeMinDisp =0; att10x =0; // ломать; } case 8:{// 0.5V rangeMax =0.5 / lsb5V; // rangeMaxDisp =50; rangeMin =0; rangeMinDisp =0; att10x =0; // ломать; } case 9:{// 0.5V rangeMax =0.2 / lsb5V; // rangeMaxDisp =20; rangeMin =0; rangeMinDisp =0; att10x =0; // ломать; }}} void writeCommonImage () {// display.clearDisplay (); // (0,4 мс) display.setTextColor (БЕЛЫЙ); // display.setCursor (86, 0); // Начало в верхнем левом углу display.println (F ("av V")); // 1 display.drawFastVLine (26, 9, 55, БЕЛЫЙ); // display.drawFastVLine (127, 9, 55, БЕЛЫЙ); // display.drawFastHLine (24, 9, 7, БЕЛЫЙ); // Макс display.drawFastHLine (24, 36, 2, БЕЛЫЙ); // display.drawFastHLine (24, 63, 7, БЕЛЫЙ); // display.drawFastHLine (51, 9, 3, БЕЛЫЙ); // Макс display.drawFastHLine (51, 63, 3, БЕЛЫЙ); // display.drawFastHLine (76, 9, 3, БЕЛЫЙ); // Макс display.drawFastHLine (76, 63, 3, БЕЛЫЙ); // display.drawFastHLine (101, 9, 3, БЕЛЫЙ); // Макс display.drawFastHLine (101, 63, 3, БЕЛЫЙ); // display.drawFastHLine (123, 9, 5, БЕЛЫЙ); // Макс display.drawFastHLine (123, 63, 5, БЕЛЫЙ); // for (int x =26; x <=128; x + =5) {display.drawFastHLine (x, 36, 2, БЕЛЫЙ); // ()} 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); // digitalWrite (12, LOW); // НИЗКИЙ} else {// pinMode (12, INPUT); // Hi-z} switch (hRange) {// case 0:{// 50 мс timeExec =400 + 50; // (мс) EEPROM ADCSRA =ADCSRA &0xf8; // 3 ADCSRA =ADCSRA | 0x07; // 128 (arduino for (int i =0; i  dataMax) {// dataMax =d; }} // dataAve =(сумма + 10) / 20; // 10 // макс., Мин. If (vRange <=1) {// Auto1 rangeMin =dataMin - 20; // -20 rangeMin =(rangeMin / 10) * 10; // 10 если (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); // АЦП 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 если ((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; // Несинхронизация}} void startScreen () {// display.clearDisplay (); display.setTextSize (1); // 2 display.setTextColor (БЕЛЫЙ); // display.setCursor (10, 25); // display.println (F ("PM.GOHARIAN")); // display.setCursor (10, 45); // display.println (F ("Pen oscope")); display.display (); // задержка (5000); display.clearDisplay (); display.setTextSize (1); //} void dispHold () {// Удерживать display.fillRect (32, 12, 24, 8, ЧЕРНЫЙ); // 4 display.setCursor (32, 12); display.print (F («Удерживать»)); // Удерживаем display.display (); //} void dispInf () {// напряжение с плавающей запятой; // display.setCursor (2, 0); // display.print (vScale); // if (scopeP ==0) {// display.drawFastHLine (0, 7, 27, БЕЛЫЙ); // display.drawFastVLine (0, 5, 2, БЕЛЫЙ); display.drawFastVLine (26, 5, 2, БЕЛЫЙ); } // display.setCursor (34, 0); // display.print (hScale); // (время / дел) if (scopeP ==1) {// display.drawFastHLine (32, 7, 33, БЕЛЫЙ); // display.drawFastVLine (32, 5, 2, БЕЛЫЙ); display.drawFastVLine (64, 5, 2, БЕЛЫЙ); } // display.setCursor (75, 0); // если (trigD ==0) {display.print (char (0x18)); //} else {display.print (char (0x19)); //} if (scopeP ==2) {// display.drawFastHLine (71, 7, 13, БЕЛЫЙ); // display.drawFastVLine (71, 5, 2, БЕЛЫЙ); display.drawFastVLine (83, 5, 2, БЕЛЫЙ); } // if (att10x ==1) {// 10 Voltage =dataAve * lsb50V / 10.0; // 50 В} else {Voltage =dataAve * lsb5V / 10.0; // 5В} dtostrf (Voltage, 4, 2, chrBuff); // x.xx display.setCursor (98, 0); // display.print (chrBuff); // // display.print (saveTimer); // // напряжение =rangeMaxDisp / 100.0; // Макс. If (vRange ==1 || vRange> 4) {// 5VAuto5V dtostrf (Voltage, 4, 2, chrBuff); // *. **} else {// dtostrf (Voltage, 4, 1, chrBuff); // **. *} display.setCursor (0, 9); display.print (chrBuff); // Максимальное напряжение =(rangeMaxDisp + rangeMinDisp) / 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); // напряжение =rangeMinDisp / 100.0; // Мин. 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); // Мин. // 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 =constrain (y1, 9, 63); // y2 =map (waveBuff [x + trigP - 49], rangeMin, rangeMax, 63, 9); // y2 =constrain (y2, 9, 63); // display.drawLine (x + 27, y1, x + 28, y2, БЕЛЫЙ); //}} void saveEEPROM () {// EEPROM if (paraChanged ==true) {// saveTimer =saveTimer - timeExec; // если (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; //} trigD =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; // ВКЛ.} If ((x &0x01) ==0) {scopeP ++; if (scopeP> 2) {scopeP =0;}} if ((x &0x02) ==0 ) {// ВВЕРХ 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) {// ВНИЗ 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. Сделайте машинку для письма домашнего задания дома
  2. Консоль редактирования DIY Photoshop с использованием Arduino Nano RP 2040
  3. Как сделать углеродное волокно с нуля в домашних условиях
  4. Создание монитора Ambilight с помощью Arduino
  5. Как создать настраиваемую перфорированную кнопку клавиатуры
  6. Как измерить массу Земли с помощью Arduino
  7. Как создать веб-сайт, взаимодействующий с Arduino с помощью PHP
  8. Как создавать музыку с помощью Arduino
  9. Как сделать автоматическое открывание дверей на базе Arduino
  10. Как сделать компас с помощью Arduino и Processing IDE