零基础入门学用Arduino 第一部分(三)

news2025/2/24 15:10:26

重要的内容写在前面:

  1. 该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。
  2. 个人把这个教程学完之后,整体感觉是很好的,如果有条件的可以先学习一些相关课程,学起来会更加轻松,相关课程有数字电路(强烈推荐先学数电,不然可能会有一些地方理解起来很困难)、模拟电路等,然后就是C++(注意C++是必学的)
  3. 文章中的代码都是跟着老师边学边敲的,不过比起老师的版本我还把注释写得详细了些,并且个人认为重要的地方都有详细的分析。
  4. 一些函数的介绍有参考太极创客官网给出的中文翻译,为了便于现查现用,把个人认为重要的部分粘贴了过来并做了一些修改。
  5. 如有错漏欢迎指正。

视频链接:1-0 教程介绍_哔哩哔哩_bilibili

太极创客官网:太极创客 – Arduino, ESP8266物联网的应用、开发和学习资料

七、模拟输出

1、模拟输出函数analogWrite

(1)analogWrite函数借助PWM调制,可以用于输出模拟信号,它有两个参数,第一个参数是模拟引脚号,第二个参数是0到255之间的PWM频率值,0对应“off”,255对应“on”。

(2)在Arduino UNO控制器中,5号引脚和6号引脚的PWM频率为980Hz。在一些基于ATmega168和ATmega328的Arduino控制器中,analogWrite函数支持引脚 3、5、6、9、10、11(在开发板上的引脚处有“~”标记)。

(3)PWM(Pulse Width Modulation)即脉冲宽度调制,在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速、开关电源等领域。

(4)PWM频率值0-255对应占空比0%-100%,呈正比关系,如下图所示。如果有规律地改变PWM频率值,就能产生等效的模拟波形(如上图紫色虚线描绘的波形),当然,PWM频率值固定,也能产生一个等效的模拟电压,其值不局限于高电平或低电平标定的电压,电压值取决于PWM频率值

2、例1——按键控制LED亮度

(1)根据下图所示将电路连接好,其中电阻可选220Ω(总之在确保不宜过小的前提下不要太大即可)。

(2)将下面的程序下载到开发板中,首先LED会获得一个适中的亮度,持续按下按键1,LED的亮度会持续下降直至熄灭,持续按下按键2,LED的亮度会持续上升直至程序设定的最大值。

bool pushButton1;   // 创建布尔型变量用来存储按键开关1的电平状态
bool pushButton2;   // 创建布尔型变量用来存储按键开关2的电平状态
int ledPin = 9;        //LED引脚号
int brightness = 128;  //LED亮度参数(255/2=127.5,一个适中的亮度参数)

void setup() 
{
  pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式
  pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式
  pinMode(ledPin, OUTPUT);  //将LED引脚设置为输出模式
  Serial.begin(9600);      //启动串口通讯,波特率为9600
}

void loop() 
{
  pushButton1 = digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量pushButton1
  pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量pushButton2
  
  if (!pushButton1 && brightness > 0)  //当(持续)按下按键开关1并且LED亮度参数大于0
  {
    brightness--;                           //减低LED亮度参数
  } 
  else if (!pushButton2 && brightness < 255) //当(持续)按下按键开关2并且LED亮度参数小于255
  {
    brightness++;                           //增加LED亮度参数
  }
  analogWrite(ledPin, brightness);         //模拟输出控制LED亮度
  Serial.println(brightness);              //将LED亮度参数显示在串口监视器上
  delay(10);
}

①持续按下按键1,引脚2将持续处于低电平,每执行一次loop函数,brightness都进行一次自减,直至按键1被松开或者亮度参数减小至0,同时loop函数会将当前的亮度参数作为模拟量输出到引脚9上,并通过串口将当前的亮度参数输出到监视器上。

②持续按下按键2,引脚8将持续处于低电平,每执行一次loop函数,brightness都进行一次自减,直至按键2被松开或者亮度参数增加至255,同时loop函数会将当前的亮度参数作为模拟量输出到引脚9上,并通过串口将当前的亮度参数输出到监视器上。

③程序没有做异常情况的处理,比如两个按键同时按下,这种情况理论上是不允许的。

④亮度参数的取值范围为0-255,若不将其限定在此范围,那么它作为analogWrite函数的参数,会发生强制类型转换,最终的结果也会在0-255之间,至于强制类型转换会发生什么,这里不再赘述。

3、例2——LED呼吸灯

(1)根据下图所示将电路连接好,其中电阻可选220Ω(总之在确保不宜过小的前提下不要太大即可)。

(2)将下面的程序下载到开发板中,可以发现LED灯的亮度从暗变亮,再从亮变暗,以此往复,做一个周期性的“呼吸”。

void setup() 
{
  pinMode(9, OUTPUT);      //设置9号引脚为输出模式
  Serial.begin(9600);     //启动串口通讯
}

void loop() 
{
  // LED由暗到明
  for (int brightness = 0; brightness <= 255; brightness+=5)
  {
    analogWrite(9, brightness);   
    Serial.println(brightness);
    delay(10);
  }
  // LED由明到暗  
  for (int brightness = 255; brightness >=0 ; brightness-=5)
  {
    analogWrite(9, brightness);
    Serial.println(brightness);
    delay(10);
  }
}

①LED由暗到明的过程由一个for循环控制,首先亮度参数的初始值为0,它会随着时间的流逝而逐渐增加,直至到达最大值255,for循环结束。

②LED由明到暗的过程也由一个for循环控制,首先亮度参数的初始值为255,它会随着时间的流逝而逐渐减小,直至到达最小值0,for循环结束。

③loop函数重复执行上述两个for循环,以此达到呼吸灯的效果。

八、模拟输入

1、模拟输入函数analogRead

(1)analogRead函数仅有一个参数用于指示模拟引脚,该函数用于从Arduino的模拟输入引脚读取模拟电压的数值

(2)Arduino控制器有多个10位数模转换通道,这意味着Arduino可以将0-5V的电压输入信号映射到数值0-1023(210)。关于数模转换这里不进行详细介绍,总之就是将输入的模拟量转换成单片机能“读懂”的数字信号,或者说将模拟量转换为二进制的形式供计算机接收。

(3)引脚的输入范围以及解析度可以使用analogReference指令进行调整。

(4)Arduino控制器读取一次模拟输入需要消耗100微秒的时间(0.0001秒),控制器读取模拟输入的最大频率是每秒10000次。

(5)在模拟输入引脚没有任何连接的情况下,用analogRead指令读取该引脚,这时获得的返回值为不固定的数值,这个数值可能受到多种因素影响,比如将手靠近引脚也可能使得该返回值产生变化。

2、例——电位器控制LED灯亮度

(1)根据下图所示将电路连接好,其中电位器的总电阻为10kΩ,连接LED的电阻可选220Ω(总之在确保不宜过小的前提下不要太大即可)。

(2)将下面的程序下载到开发板中,转动电位器,可以发现LED灯的亮度随之发生变化。

void setup() 
{
  Serial.begin(9600);  //串口通讯初始化(9600 bps)
  pinMode(9, OUTPUT);  //设置9号引脚为输出模式
}
 
void loop() 
{
  int analogInputVal = analogRead(A0);  //读取模拟输入值 
  int brightness = map(analogInputVal, 0, 1023, 0, 255); //将模拟输入数值(0 - 1023)等比映射到模拟输出数值区间(0-255)内,根据该映射关系由analogInputVal得出brightness
  analogWrite(9, brightness);  //根据模拟输入值调节LED亮度

  //将结果通过串口监视器显示
  Serial.print("analogInputVal = ");
  Serial.println(analogInputVal);
   
  Serial.print("brightness = ");
  Serial.println(brightness);
   
  Serial.println("");
}

①电位器的两端引脚分别接5V和GND,中间引脚连接Arduino的引脚A0,转动电位器,引脚A0的电压随之发生改变,程序需要不断地将当前电压记录在变量analogInputVal中,当然,记录的值并不完全等于电压值,只是它与实际电压值有一个映射关系(或者说线性关系)。

②analogRead函数的返回值范围为0-1023(针对本项目而言),而LED灯的亮度参数取值范围为0-255,虽然二者取值范围不同,但是可以为它们构造一个等比映射的关系,如下图所示,这样,引脚A0的电压值就能与LED灯的亮度参数存在一个映射关系(或者说线性关系)。

③工作原理示意图:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1801771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

添加west扩展命令

使用west工具的帮助命令&#xff0c;west -h&#xff0c;不仅可以列出west工具的内置命令&#xff0c;也可以列举当前工程中实现的扩展命令&#xff0c;如build&#xff0c;flash等。 本文将介绍如何添加扩展命令。 west扩展命令的位置通过以下方式查找&#xff1a; 1. 首先找…

网络编程之XDP技术介绍

一、简介 XDP&#xff1a;eXpress Data Path&#xff0c;快速数据面&#xff0c;听名字是不是很高大上。其实它就是一个快速处理Rx数据包的数据面技术。为什么现在对数据处理如此敏感&#xff1f;原因非常简单&#xff0c;随着网络的不断覆盖社会的各个层面&#xff0c;海量的…

对比深度图聚类的硬样本感知网络

Hard Sample Aware Network for Contrastive Deep Graph Clustering 文章目录 Hard Sample Aware Network for Contrastive Deep Graph Clustering摘要引言方法实验结论启发点 摘要 本文提出了一种名为Hard Sample Aware Network (HSAN)的新方法&#xff0c;用于对比深度图聚类…

AI智能客服经验总结

AI智能客服经验总结 在使用OpenAI的API接口来构建人工智能客服系统时&#xff0c;prompt约束是非常重要的。它可以帮助确保生成的回复符合你的期望和需求。以下是一些关于如何设置和管理prompt约束的建议&#xff1a; 1. 明确客服系统的目标 首先&#xff0c;明确你的客服系…

大泽动力30KW静音汽油发电机

安全操作&#xff1a; 在使用前&#xff0c;确保发电机放置在通风良好、干燥、无易燃物品的地方。 避免在发电机运行时触摸其热表面或运转部件&#xff0c;以免烫伤或受伤。 遵循发电机的启动和停机程序&#xff0c;不要随意操作。 燃油管理&#xff1a; 使用高质量的汽油&…

柴油十六烷值检测 液压油硫含量检测 变压器油检测

检测的油品包括&#xff1a;柴油、润滑油、液压油、机油、汽油、以及一些工业用油等。 柴油检测项目GB19147-2013&#xff1a;氧化安定性、硫含量、酸度、10%蒸余物残炭、灰分、铜片腐蚀、水分、机械杂质、润滑性、多环芳烃、运动粘度、凝点、冷滤点、闪点、十六烷值、馏程、密…

pdf压缩文件怎么压缩最小,软件工具压缩清晰

PDF格式的文件&#xff0c;当其体积过于庞大时&#xff0c;确实在上传的过程中显得尤为不便。今天给大家分享一个压缩pdf的简单的方法&#xff0c;让大家可以轻松的压缩pdf。 浏览器打开 "轻云处理pdf官网" &#xff0c;上传pdf文件&#xff0c;文件上传完成后网站会…

汇编:头文件

汇编头文件&#xff08;header files&#xff09;在汇编语言编程中类似于高层语言中的头文件&#xff0c;它们通常包含宏定义、常量定义、数据结构定义、函数声明以及其他在多个汇编源文件中共享的代码&#xff1b;使用头文件可以提高代码的可维护性和可读性&#xff0c;并使代…

3~35kV户内开关柜综合测控装置

安科瑞电气股份有限公司 祁洁 15000363176 一、产品概述 ASD系列开关柜综合测控装置用于3~35kV户内开关柜&#xff0c;适用于中置柜、手车柜、固定柜、环网柜等多种开关柜。具有一次回路模拟图及开关状态指示&#xff0c;高压带电显示及核相&#xff0c;自动温湿度控制&…

炫技来了!使用SDR设备成功抓到蓝牙air packet, 并且wireshark实时解析, 没错就是蓝牙空口抓包器

本文章主要介绍是用ZYNQ7020AD9361Gnu radio是搭建一个蓝牙抓包器的文章。 由于之前一直做蓝牙Host&#xff0c;对controller觉得是一个比较虚无缥缈的东西&#xff0c;得不到的总是在骚动&#xff0c;所以最近用我用吃灰了2年的SDR(Software Defined Radio&#xff09;设备研…

【Java基础】OkHttp 超时设置详解

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

win10重装系统?电脑系统重装一键清晰,干货分享!

在电脑的使用过程中&#xff0c;由于各种原因&#xff0c;我们可能会遇到系统崩溃、运行缓慢或者出现各种难以解决的问题。这时&#xff0c;重装系统往往是一个有效的解决方案。今天&#xff0c;我们就来详细介绍一下如何在Win10环境下进行系统的重装&#xff0c;帮助大家轻松解…

运 算 符

算术运算符 算术运算符包括&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/&#xff0c;%&#xff0c;&#xff0c;-- 当左右两边都是数值型时&#xff0c;则做加法运算。 当左右两边有一方为字符串&#xff0c;则做拼接运算。任何一个 Java 对象都可以转换为字符串。 …

uniapp视频组件层级太高,解决方法使用subNvue原生子体窗口

目录 前言 先看一下uniapp官网的原话&#xff1a; subNvue的一些参数介绍 subNvues使用方法&#xff1a; 绑定id 显示 subNvue 弹出层 subNvue.show() 参数信息 subNvue.hide() 参数信息 在使用subNvue 原生子体窗口 遇到的一些问题 前言 nvue 兼容性 以及使用方式 控…

11-Linux文件系统与日志分析

11.1深入理解Linux文件系统 在处理Liunx系统出现故障时&#xff0c;故障的症状是最易发现。数学LInux系统中常见的日志文件&#xff0c;可以帮助管理员快速定位故障点&#xff0c;并及时解决各种系统问题。 11.1.1 inode与block详解 文件系统通常会将这两部分内容分别存放在…

刷代码随想录有感(96):贪心算法——小于目标数且是最大的单调递增的数字

题干&#xff1a; 代码&#xff1a; class Solution { public:int monotoneIncreasingDigits(int n) {string s to_string(n);int flag s.size();for(int i s.size() - 1; i > 0; i--){if(s[i - 1] > s[i]){s[i - 1]--;flag i;}}for(int i flag; i < s.size(); …

js 选择一个音频文件,绘制音频的波形,从右向左逐渐前进。

选择一个音频文件&#xff0c;绘制波形&#xff0c;从右向左逐渐前进。 完整代码&#xff1a; <template><div><input type"file" change"handleFileChange" accept"audio/*" /><button click"stopPlayback" :…

无延迟,持续畅玩 - Wi-Fi 6 助力打造游戏厅极致体验

1、需求背景&#xff1a; 连锁游戏厅行业竞争激烈&#xff0c;顾客对高品质的游戏体验有着高要求。网络是游戏厅的核心基础设施之一&#xff0c;需要确保游戏过程中的网络连接稳定性和顾客满意度。 长时间稳定连接 为保证顾客的游戏体验感&#xff0c;游戏厅要确保网络连接长…

SpringBoot实现参数校验拦截(采用AOP方式)

一、AOP是什么&#xff1f; 目的&#xff1a;分离横切关注点&#xff08;如日志记录、事务管理&#xff09;与核心业务逻辑。 优势&#xff1a;提高代码的可读性和可维护性。 关键概念 切面&#xff08;Aspect&#xff09;&#xff1a;包含横切关注点代码的模块。通知&#xff…

vscode编译c/c++找不到jni.h文件

解决办法: 一、下载JDK 访问Oracle官网的Java下载页面&#xff1a;Java Downloads | Oracle 选择适合您操作系统的JDK版本&#xff1a; 对于Windows&#xff0c;选择“Windows x64”或“Windows x86”&#xff08;取决于您的系统是64位还是32位&#xff09;。对于Linux&#…