基于Arduino Nano的DIY示波器

基于Arduino Nano的DIY示波器:打造屬于你的口袋實驗室

前言

在電子愛好者的世界里,示波器是不可或缺的工具之一。它能夠幫助我們觀察和分析各種電子信號的波形,從而更好地理解和調試電路。然而,市面上的示波器價格往往較高,對于一些初學者或預算有限的愛好者來說,可能是一個不小的負擔。幸運的是,隨著開源硬件和軟件的發展,我們可以通過一些簡單的組件和代碼,自己動手制作一個功能強大的示波器。今天,我們將詳細介紹如何使用Arduino Nano和SH1106 OLED顯示屏,打造一個屬于自己的DIY示波器。
在這里插入圖片描述

項目簡介

這個項目的目標是制作一個基于Arduino Nano的便攜式示波器,它具備以下特點:

  • 緊湊的設計:基于Arduino Nano的緊湊設計,便于攜帶和使用。
  • OLED顯示屏:使用SH1106 128x64 I2C OLED顯示屏,實時顯示波形。
  • 功能豐富:支持垂直和水平縮放、頻率和占空比計算、設置保存、觸發極性檢測以及波形凍結功能。
  • 成本低廉:使用常見的電子元件,總成本遠低于市售示波器。
  • 開源代碼:基于開源代碼,易于修改和擴展。

硬件需求

制作這個DIY示波器,你需要準備以下硬件組件:

  1. Arduino Nano:作為核心控制器。
  2. SH1106 128x64 I2C OLED顯示屏:用于顯示波形和其他信息。
  3. 輕觸按鈕:4個,分別用于選擇、向上、向下和保持功能。
  4. 電壓分壓電阻:用于調整輸入信號的電壓范圍。
  5. 肖特基二極管:用于防止過電壓。
  6. 電容:104型號,用于濾波。
  7. 面包板或自制PCB:用于組裝電路。
  8. 跳線:用于連接各個組件。
  9. 電源:5V穩壓電源。

電路設計

電路圖概述

在這里插入圖片描述

整個電路的設計相對簡單,主要分為以下幾個部分:

  • 信號輸入:通過電壓分壓電路和可選的衰減器,將信號輸入到Arduino Nano的模擬輸入引腳A0。
  • OLED顯示屏連接:使用I2C接口,連接到Arduino Nano的A4(SDA)和A5(SCL)引腳。
  • 按鈕連接:使用肖特基二極管將按鈕信號合并,并連接到數字引腳D2,用于中斷操作。
  • 保護電路:肖特基二極管用于防止過電壓,電阻用于正確縮放輸入電壓。

詳細電路圖

以下是電路的詳細連接方式:

  • 信號輸入
    • 輸入信號通過一個電壓分壓電路連接到A0引腳。
    • 為了保護Arduino Nano,使用一個肖特基二極管防止輸入電壓過高。
  • OLED顯示屏
    • SDA引腳連接到A4。
    • SCL引腳連接到A5。
    • VCC和GND分別連接到電源和地。
  • 按鈕
    • 4個按鈕分別連接到D2引腳,每個按鈕之間通過肖特基二極管隔離。
    • 按鈕的另一端連接到地。
  • 電源
    • 使用5V穩壓電源為整個電路供電。

PCB設計

在這里插入圖片描述

為了使項目更加緊湊和美觀,可以設計一個定制的PCB。PCB設計包括以下部分:

  1. Arduino Nano插座:方便插入和更換Arduino Nano。
  2. OLED顯示屏:預留空間和接口。
  3. 按鈕:4個按鈕的安裝位置。
  4. 電壓分壓和衰減電路:集成在PCB上。
  5. 電源接口和去耦元件:確保電源穩定。

PCB布局

PCB的布局應盡量簡潔,減少布線長度,提高信號質量。以下是PCB布局的建議:

  • 將Arduino Nano插座和OLED顯示屏放置在PCB的中心位置。
  • 按鈕分布在顯示屏的周圍,方便操作。
  • 電源接口和去耦元件放置在靠近電源輸入的位置。

軟件設計

在這里插入圖片描述

核心代碼功能

示波器的核心功能由一個復雜的Arduino程序實現,以下是代碼的主要功能:

  1. 波形采集:每屏刷新時采集200個樣本。
  2. 頻率分析:計算波形的頻率和占空比。
  3. EEPROM存儲:保存最后的設置,如電壓量程、時間基準和觸發極性。
  4. 用戶界面:按鈕用于循環選擇設置,OLED顯示屏實時顯示數據。
  5. 觸發檢測:支持正負邊沿觸發模式。
  6. 電池電壓模式:在啟動時按下按鈕,顯示電池電壓。

代碼實現

以下是代碼的關鍵部分:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SH1106.h>#define SCREEN_WIDTH 128 // OLED顯示屏幕寬度,以像素為單位
#define SCREEN_HEIGHT 64 // OLED顯示屏幕高度,以像素為單位// 定義OLED顯示屏的復位引腳
#define OLED_RESET     -1
Adafruit_SH1106 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);// 定義按鈕引腳
#define BUTTON_SELECT 2
#define BUTTON_UP 3
#define BUTTON_DOWN 4
#define BUTTON_HOLD 5// 其他變量定義
int sampleRate = 200; // 每屏采集樣本數
float voltageScale = 1.0; // 電壓量程
float timeBase = 1.0; // 時間基準
bool triggerPositive = true; // 觸發極性void setup() {// 初始化OLED顯示屏display.begin(SH1106_SWITCHCAPVCC, 0x3C);display.display();delay(2000); // 等待顯示屏初始化display.clearDisplay();// 初始化按鈕引腳pinMode(BUTTON_SELECT, INPUT_PULLUP);pinMode(BUTTON_UP, INPUT_PULLUP);pinMode(BUTTON_DOWN, INPUT_PULLUP);pinMode(BUTTON_HOLD, INPUT_PULLUP);// 從EEPROM讀取最后的設置voltageScale = EEPROM.read(0);timeBase = EEPROM.read(1);triggerPositive = EEPROM.read(2);
}void loop() {// 檢測按鈕操作if (digitalRead(BUTTON_SELECT) == LOW) {// 切換設置選項}if (digitalRead(BUTTON_UP) == LOW) {// 調整當前選中的參數}if (digitalRead(BUTTON_DOWN) == LOW) {// 調整當前選中的參數}if (digitalRead(BUTTON_HOLD) == LOW) {// 凍結或恢復波形顯示}// 采集波形數據int samples[sampleRate];for (int i = 0; i < sampleRate; i++) {samples[i] = analogRead(A0);}// 分析波形數據float frequency = calculateFrequency(samples);float dutyCycle = calculateDutyCycle(samples);// 顯示波形和數據display.clearDisplay();drawWaveform(samples);display.setTextSize(1);display.setTextColor(SSD1306_WHITE);display.setCursor(0, 10);display.println("Frequency: " + String(frequency) + " Hz");display.println("Duty Cycle: " + String(dutyCycle) + " %");display.display();
}// 計算頻率的函數
float calculateFrequency(int *samples) {// 實現頻率計算邏輯
}// 計算占空比的函數
float calculateDutyCycle(int *samples) {// 實現占空比計算邏輯
}// 繪制波形的函數
void drawWaveform(int *samples) {// 實現波形繪制邏輯
}

代碼上傳

  1. 使用USB線將Arduino Nano連接到計算機。
  2. 在Arduino IDE中安裝所需的庫:
    • Adafruit GFX
    • Adafruit SH1106
  3. 打開代碼文件,選擇正確的開發板和COM端口。
  4. 點擊“上傳”按鈕,將代碼上傳到Arduino Nano。

操作指南

按鈕功能說明

在這里插入圖片描述

  • SELECT:循環切換控制選項(垂直量程 → 時間基準 → 觸發)。
  • UP/DOWN:調整當前選中的參數。
  • HOLD:凍結或恢復波形顯示。
  • 自動保存:在最后一次按鈕按下后的5秒內,設置將自動保存到EEPROM。

啟動模式

在啟動時,按下UP或DOWN按鈕可以進入電壓表模式,選擇5V或50V量程。

應用場景

在這里插入圖片描述

這個DIY示波器具有多種應用場景,包括:

  1. 信號可視化:觀察各種電子信號的波形。
  2. 頻率測量:測量信號的頻率。
  3. 調試小型電子電路:幫助快速定位電路問題。
  4. 教育工具:用于學習波形分析和電子基礎。

總結

通過這個項目,我們不僅能夠制作一個功能強大的示波器,還能在這個過程中學習到硬件設計、固件開發和信號分析等多方面的知識。雖然這個DIY示波器在功能上可能無法與高端示波器相比,但它完全能夠滿足日常的電子實驗和學習需求。更重要的是,這個項目激發了我們的創造力和動手能力,讓我們在實踐中不斷學習和進步。

未來改進方向

雖然這個項目已經具備了基本的示波器功能,但仍有很大的改進空間。例如:

  • 增加更多量程選項:目前只支持兩種量程,可以增加更多量程以適應更廣泛的信號范圍。
  • 提高采樣率:通過優化代碼和硬件,提高波形的采樣率,從而獲得更清晰的波形。
  • 增加更多顯示功能:如添加峰值檢測、平均值計算等。
  • 開發更高級的觸發模式:如窗口觸發、延遲觸發等。

總之,這個基于Arduino Nano的DIY示波器項目是一個很好的起點,它不僅能夠滿足你的實際需求,還能激發你的創造力和探索精神。希望這篇文章能激發你的興趣,讓你也動手制作一個屬于自己的示波器!


希望你喜歡這個項目,并在構建過程中找到樂趣!如果你有任何問題或需要幫助,歡迎在評論區交流。

作者:Svan.


注意:本博文為不得在未經本人同意進行轉載或者二次創作,違者必究!!!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/80308.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/80308.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/80308.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LeetCode 解題思路 47(最長回文子串、最長公共子序列)

解題思路&#xff1a; dp 數組的含義&#xff1a; dp[i][j] 是否為回文子串。遞推公式&#xff1a; dp[i][j] s.charAt(i) s.charAt(j) && dp[i 1][j - 1]。dp 數組初始化&#xff1a; 單字符 dp[i][i] true&#xff0c;雙字符 dp[i][i 1] s.charAt(i) s.charA…

通過管道實現C++ Linux獨立進程之間的通信和字符串傳遞

在Linux環境下&#xff0c;獨立進程之間的通信&#xff08;IPC&#xff09;可以通過多種方式實現&#xff0c;包括管道、消息隊列、共享內存和套接字。本文將詳細介紹如何使用管道&#xff08;pipe&#xff09;在C中實現獨立進程之間的通信&#xff0c;并傳遞字符串。 一、管道…

神經網絡極簡入門技術分享

1. 引言 神經網絡是深度學習的基礎&#xff0c;其設計靈感來源于人腦神經元的結構和工作方式。盡管現代神經網絡已經變得異常復雜&#xff0c;但其核心原理卻相對簡單易懂。本報告旨在通過剖析神經網絡的最基本單元——神經元&#xff0c;幫助初學者理解神經網絡的工作原理。 …

五、Hadoop集群部署:從零搭建三節點Hadoop環境(保姆級教程)

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月7日 專欄&#xff1a;Hadoop教程 前言&#xff1a; 想玩轉大數據&#xff0c;Hadoop集群是繞不開的一道坎。很多小伙伴一看到集群部署就頭大&#xff0c;各種配置、各種坑。別慌&#xff01;這篇教程就是你的“救生圈”。 …

科研項目管理:4款高效工具推薦與效率提升實踐

一般來說&#xff0c;科研項目往往涉及復雜的任務、跨部門協作以及嚴格的時間和預算限制。傳統的管理方式&#xff0c;如電子表格或郵件溝通&#xff0c;難以應對多任務并行、資源分配復雜的需求。借助現代項目管理工具&#xff0c;研究人員能夠優化工作流程、提升團隊協作效率…

如何統一修改word中所有英文字母的字體格式

1.需求分析 我想讓整篇論文中的所有英文字母格式都修改為Time New Roman格式。 2.直觀操作流程 點擊左上角開始 --> 點擊替換 --> 點擊更多 --> 點擊特殊格式 --> 選擇查找內容為任意字母(Y) --> 將光標點到替換內容 --> 點擊格式 --> 點擊字體 --> …

【疑難雜癥2025-003】Java-mvn項目在gitlab-ci構建鏡像時遇到的問題和解決方案

本文由Markdown語法編輯器編輯完成&#xff0e; 1.背景: 之前從同事手里接手了一個java的項目&#xff0c;是用maven構建項目的&#xff0e;由于我們的服務都是基于docker來部署的&#xff0c;因此這個java項目也是要編譯成docker image然后發布&#xff0e;但是之前一直都是…

【RT-Thread Studio】nor flash配置Fal分區

前置條件&#xff1a;【RT-Thread Studio】W25Q128配置 添加 FAL軟件包 配置SFUD驅動程序&#xff0c;使用FAL的設備為W25Q128 將fal_cfg.h和fal_flash_sfud_port.c提取出來&#xff0c;放到自己創建的fal_porting目錄。 修改 fal_flash_sfud_port.c struct fal_flash_dev n…

Spring MVC 視圖解析器 (ViewResolver) 如何配置? Spring Boot 是如何自動配置常見視圖解析器的?

我們來詳細分析一下視圖解析器 (ViewResolver) 的配置以及 Spring Boot 是如何自動配置它們的。 視圖解析器 (ViewResolver) 是什么&#xff1f; 在 Spring MVC 中&#xff0c;當控制器 (Controller) 方法處理完請求并返回一個邏輯視圖名 (String) 時&#xff0c;DispatcherS…

理解網站導航文件:robots.txt、sitemap.xml與LLMs.txt的全面解析

在當今數字化時代&#xff0c;網站不僅需要為人類用戶提供良好的瀏覽體驗&#xff0c;還需要考慮搜索引擎和人工智能系統的可訪問性。本文將深入探討三種關鍵的網站導航文件&#xff1a;傳統的robots.txt和sitemap.xml&#xff0c;以及新興的LLMs.txt&#xff0c;分析它們的功能…

leetcode 349. Intersection of Two Arrays

題目描述 題目限制0 < nums1[i], nums2[i] < 1000&#xff0c;所以可以開辟一個1001個元素的數組來做哈希表。 class Solution { public:vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {vector<int> table(1001,0…

【軟件工程】軟件多缺陷定位方法總結

軟件多缺陷定位(Multi-Fault Localization)是軟件工程中的一個重要研究方向,旨在同時定位代碼中存在的多個缺陷(Bug)。由于多個缺陷可能相互干擾(如掩蓋錯誤行為),導致傳統單缺陷定位方法效果下降,因此需要針對多缺陷場景的特殊性設計方法。以下是常見的多缺陷定位方法…

【數據結構入門訓練DAY-30】數的劃分

文章目錄 前言一、題目二、解題思路結語 前言 本次訓練內容 訓練DFS。訓練解題思維。 一、題目 將整數n分成k份&#xff0c;且每份不能為空&#xff0c;任意兩份不能相同(不考慮順序)。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三種分法被認為是相同的。 {1&a…

OpenCV進階操作:圖像直方圖、直方圖均衡化

文章目錄 一、圖像直方圖二、圖像直方圖的作用三、使用matplotlib方法繪制直方圖2.使用opencv的方法繪制直方圖&#xff08;劃分16個小的子亮度區間&#xff09;3、繪制彩色圖像的直方圖 四、直方圖均衡化1、繪制原圖的直方圖2、繪制經過直方圖均衡化后的圖片的直方圖3、自適應…

Open CASCADE學習|Geom2d_BezierCurve 類

概述 Open CASCADE 提供了幾何建模的強大工具集,其中 Geom2d_BezierCurve 類用于表示二維貝塞爾曲線。貝塞爾曲線在計算機圖形學和計算機輔助設計(CAD)中具有廣泛應用,本文將詳細介紹 Geom2d_BezierCurve 類及其使用方法。 貝塞爾曲線簡介 貝塞爾曲線是一種參數曲線,廣泛…

muduo源碼解析

1.對類進行禁止拷貝 class noncopyable {public:noncopyable(const noncopyable&) delete;void operator(const noncopyable&) delete;protected:noncopyable() default;~noncopyable() default; }; 2.日志 使用枚舉定義日志等級 enum LogLevel{TRACE,DEBUG,IN…

互聯網大廠Java面試實錄:Spring Boot與微服務架構在電商場景中的應用解析

&#x1f4aa;&#x1f3fb; 1. Python基礎專欄&#xff0c;基礎知識一網打盡&#xff0c;9.9元買不了吃虧&#xff0c;買不了上當。 Python從入門到精通 &#x1f601; 2. 畢業設計專欄&#xff0c;畢業季咱們不慌忙&#xff0c;幾百款畢業設計等你選。 ?? 3. Python爬蟲專欄…

關于匯編語言與程序設計——單總線溫度采集與顯示的應用

一、實驗要求 (1)握碼管的使用方式 (2)掌握DS18B20溫度傳感器的工作原理 (3)掌握單總線通信方式實現 MCU與DS18B20數據傳輸 二、設計思路 1.整體思路 通過編寫數碼管顯示程序和單總線溫度采集程序&#xff0c;結合溫度傳感報警&#xff0c;利用手指觸碰傳感器&#xff0c;當…

用html+js+css實現的戰略小游戲

效果圖: 兄弟們&#xff0c;話不多說&#xff0c;直接上代碼 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

Navicat BI 數據分析功能上線 | 數據洞察新方法

Navicat 17.2 版本一經發布&#xff0c;便以 AI 助手賦能智能交互、Snowflake 支持拓展數據連接版圖、拓展對關系型、維度以及數據倉庫 2.0 建模方法的支持等新特性與功能抓住了用戶的目光&#xff0c;但其中一項低調且實用的更新 - 在 BI 數據預覽中深度集成數據分析工具&…