宁波高端网站建设,重庆网站建站系统,贵阳设计网站建设,网站开发培训时间重要的内容写在前面#xff1a;
该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后#xff0c;整体感觉是很好的#xff0c;如果有条件的可以先学习一些相关课程#xff0c;学起来会更加轻松#xff0c;相关课程有数字电路…重要的内容写在前面
该系列是以up主太极创客的零基础入门学用Arduino教程为基础制作的学习笔记。个人把这个教程学完之后整体感觉是很好的如果有条件的可以先学习一些相关课程学起来会更加轻松相关课程有数字电路强烈推荐先学数电不然可能会有一些地方理解起来很困难、模拟电路等然后就是C注意C是必学的。文章中的代码都是跟着老师边学边敲的不过比起老师的版本我还把注释写得详细了些并且个人认为重要的地方都有详细的分析。一些函数的介绍有参考太极创客官网给出的中文翻译为了便于现查现用把个人认为重要的部分粘贴了过来并做了一些修改。如有错漏欢迎指正。
视频链接1-0 教程介绍_哔哩哔哩_bilibili
太极创客官网太极创客 – Arduino, ESP8266物联网的应用、开发和学习资料
七、模拟输出
1、模拟输出函数analogWrite
1analogWrite函数借助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在开发板上的引脚处有“~”标记。
3PWMPulse Width Modulation即脉冲宽度调制在具有惯性的系统中可以通过对一系列脉冲的宽度进行调制来等效地获得所需要的模拟参量常应用于电机控速、开关电源等领域。 4PWM频率值0-255对应占空比0%-100%呈正比关系如下图所示。如果有规律地改变PWM频率值就能产生等效的模拟波形如上图紫色虚线描绘的波形当然PWM频率值固定也能产生一个等效的模拟电压其值不局限于高电平或低电平标定的电压电压值取决于PWM频率值。 2、例1——按键控制LED亮度
1根据下图所示将电路连接好其中电阻可选220Ω总之在确保不宜过小的前提下不要太大即可。 2将下面的程序下载到开发板中首先LED会获得一个适中的亮度持续按下按键1LED的亮度会持续下降直至熄灭持续按下按键2LED的亮度会持续上升直至程序设定的最大值。
bool pushButton1; // 创建布尔型变量用来存储按键开关1的电平状态
bool pushButton2; // 创建布尔型变量用来存储按键开关2的电平状态
int ledPin 9; //LED引脚号
int brightness 128; //LED亮度参数255/2127.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; brightness5){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它会随着时间的流逝而逐渐增加直至到达最大值255for循环结束。
②LED由明到暗的过程也由一个for循环控制首先亮度参数的初始值为255它会随着时间的流逝而逐渐减小直至到达最小值0for循环结束。
③loop函数重复执行上述两个for循环以此达到呼吸灯的效果。 八、模拟输入
1、模拟输入函数analogRead
1analogRead函数仅有一个参数用于指示模拟引脚该函数用于从Arduino的模拟输入引脚读取模拟电压的数值。
2Arduino控制器有多个10位数模转换通道这意味着Arduino可以将0-5V的电压输入信号映射到数值0-1023210。关于数模转换这里不进行详细介绍总之就是将输入的模拟量转换成单片机能“读懂”的数字信号或者说将模拟量转换为二进制的形式供计算机接收。
3引脚的输入范围以及解析度可以使用analogReference指令进行调整。
4Arduino控制器读取一次模拟输入需要消耗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灯的亮度参数存在一个映射关系或者说线性关系。 ③工作原理示意图