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

重要的内容写在前面:

  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电平状态并将其赋值给布尔变量pushButton1pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量pushButton2if (!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得出brightnessanalogWrite(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.rhkb.cn/news/344350.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

el-table合计行前置在首行,自定义合计行方法

背景 el-table原生合计行是在标签内增加show-summary属性&#xff0c;在表尾实现设计合计&#xff0c;且只对表格当前页面显示的列数据进行合计。element-UI效果如下图所示。 现要求在首行显示合计行&#xff0c;并自定义合计逻辑实现如下效果。 图示表格中&#xff0c;成本…

【NI国产替代】产线测试:数字万用表(DMM),功率分析仪,支持定制

数字万用表&#xff08;DMM&#xff09; • 6 位数字表显示 • 24 位分辨率 • 5S/s-250KS/s 采样率 • 电源和数字 I/O 均采用隔离抗噪技术 • 电压、电流、电阻、电感、电容的高精度测量 • 二极管/三极管测试 功率分析仪 0.8V-14V 的可调输出电压&#xff0c;最大连…

【乐吾乐3D可视化组态编辑器】用开关控制巡检车和路灯

一、运动设备开关控制 3D组态编辑器地址&#xff1a;3D可视化组态 - 乐吾乐Le5le 1.在场景中新建模拟运动设备及控制面板&#xff1a;启动/停止 2.单击巡检车设备新建模拟动画 3.设置模拟动画属性 4.单击启动面板&#xff0c;新建交互事件 5.设置交互触发类型&#xff0c;新建…

halcon算子之prepare_object_model_3d详解

为某一操作准备三维对象模型。 Description 操作符prepare_object_model_3d准备3D对象模型ObjectModel3D,用于下面目的中给出的操作。它计算操作所需的值并将其存储在ObjectModel3D中,从而加快了后续操作。没有必要调用prepare_object_model_3d。但是,如果要多次使用3D对象…

YOLOv8改进 | 卷积模块 | 在主干网络中添加/替换蛇形卷积Dynamic Snake Convolution

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 蛇形动态卷积是一种新型的卷积操作&#xff0c;旨在提高对细长和弯曲的管状结构的特征提取能力。它通过自适应地调整卷积核的权重&#xff0…

ARM功耗管理之功耗状态及功耗模式

安全之安全(security)博客目录导读 目录 一、功耗状态定义 ​编辑二、功耗模式定义 三、功耗状态和功耗模式区别 四、功耗模式细分 五、功耗状态细分 1、Core功耗状态 2、Cluster功耗状态 3、设备功耗状态 4、SoC功耗状态 5、功耗状态举例 思考:功耗状态?功耗模式…

链表的中间结点

一、题目链接 https://leetcode.cn/problems/middle-of-the-linked-list/submissions/538121725、 二、思路 定义快慢指针&#xff0c;快指针一次走两步&#xff0c;慢指针一次走一步&#xff0c;最后慢指针的位置就是中间结点的位置 三、题解代码 //快慢指针&#xff0c;快…

容器运行nslookup提示bash: nslookup: command not found【笔记】

在容器中提示bash: nslookup: command not found&#xff0c;表示容器中没有安装nslookup命令。 可以通过以下命令安装nslookup&#xff1a; 对于基于Debian/Ubuntu的容器&#xff0c;使用以下命令&#xff1a; apt-get update apt-get install -y dnsutils对于基于CentOS/R…

用PlantUML描绘C++世界:通过文本描述精准控制UML图的生成

往期本博主的 C 精讲优质博文可通过这篇导航进行查找&#xff1a; Lemo 的C精华博文导航&#xff1a;进阶、精讲、设计模式文章全收录 前言 在编写程序时&#xff0c;可视化的工具可以极大地帮助我们理解和设计复杂的系统。对于C程序员来说&#xff0c;一个强大的工具是UML&am…

【漏洞复现】多客圈子论坛系统 httpGet 任意文件读取漏洞

0x01 产品简介 多客圈子论坛系统是一种面向特定人群或特定话题的社交网络&#xff0c;它提供了用户之间交流、分享、讨论的平台。在这个系统中&#xff0c;用户可以创建、加入不同的圈子&#xff0c;圈子可以是基于兴趣、地域、职业等不同主题的。用户可以在圈子中发帖、评论、…

自定义类型:结构体+结构体内存对齐+结构体实现位段

结构体内存对齐实现位段 一.结构体1.结构体的声明2.结构体变量成员访问操作符3.结构体传参4.匿名结构体5.结构的自引用 二.结构体内存对齐1.对齐规则2.为什么存在内存对齐&#xff1f;3.修改默认对齐数 三.结构体实现位段1.什么是位段2.位段的内存分配3.位段的跨平台问题4.位段…

【c语言】自定义类型----结构体

结构体是c语言的一种自定义类型&#xff0c;自定义类型对于开发者及其重要的类型&#xff0c;它可以随意由开发者进行谱写功能&#xff0c;而今天的结构体可以用来表示一种变量的单个或多种具体属性&#xff0c;再编写代码时有着不可替代的作用&#xff01;&#xff01;&#x…

分享一个按钮代码,主要有html,svg及css动画实现

按钮展示: Switch by Galahhad made with CSS | Uiverse.io 源代码: css .theme-switch {--toggle-size: 30px;/* the size is adjusted using font-size,this is not transform scale,so you can choose any size */--container-width: 5.625em;--container-height: 2.5em;-…

【Vue】面经基础版-案例效果分析

面经效果演示 功能分析 通过演示效果发现&#xff0c;主要的功能页面有两个&#xff0c;一个是列表页&#xff0c;一个是详情页&#xff0c;并且在列表页点击时可以跳转到详情页底部导航可以来回切换&#xff0c;并且切换时&#xff0c;只有上面的主题内容在动态渲染 实现思路…

连山露【诗词】

连山露 雾隐黄山路&#xff0c;十步一松树。 树上惊松鼠&#xff0c;松子衔木屋。 松子青嫩芽&#xff0c;尖尖头探出。 卷挂白露珠&#xff0c;装映黄山雾。

HTML静态网页成品作业(HTML+CSS)—— 节日端午节介绍网页(5个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有5个页面。 二、作品演示 三、代…

嵌入式学习——4——C++中的动态内存分配和回收(堆区)

1、内存的分配与回收 C语言中使用的是malloc和free函数进行动态内存分配和回收的。 C中依然可以使用上述的两个函数来完成动态内存分配和回收的。 C也给用户提供了两个关键字new、delete来完成动态内存分配和回收的 单个分配、回收 //在堆区申请了int类型的大小空间&#xff0c…

内存管理--4.用幻灯片讲解内存分配器Allocator

用幻灯片讲解内存分配器Allocators Allocators 内存分配器 提供内存分配策略的通用接口委托给 C 运行时&#xff1a;new / delete使用块内存池管理内存使用不同大小的块内存池管理内存 为什么用分配器? 将容器逻辑与内存分配策略解耦速度&#xff1a;内存分配速度慢确保…

NVeloDocx一个基于NVelocity的word模版引擎

NVeloDocx是一个基于NVelocity的Word模版引擎&#xff0c;目前主要是用于E6低代码开发平台供用户轻松制作各种Word报告模版。 有以下优点&#xff1a; 1、完全的NVelocity语法&#xff1b; 2、直接在Word中写NVelocity脚本&#xff0c;使用非常非常方便&#xff1b; 3、完全兼…

植物大战僵尸杂交版最新2.0.88手机+电脑+苹果+修改器

在这个充满奇妙的平行宇宙中&#xff0c;植物和僵尸竟然能够和谐共存&#xff01;是的&#xff0c;你没听错&#xff01;一次意外的实验&#xff0c;让这两个看似对立的生物种类发生了基因杂交&#xff0c;创造出了全新的生物种类——它们既能够进行光合作用&#xff0c;也具备…