/*
25 模拟输出1 - analogWrite
太极创客
www.taichi-maker.com
此程序用于太极创客<<零基础入门学用Arduino教程>>
25 模拟输出1 - analogWrite
演示如何通过两个按键开关通过analogWrite指令
进行模拟输出操作。具体电路和其它信息请参考
太极创客网站本教程相关页面。
2017-04-28
*/
boolean pushButton1; // 创建布尔型变量用来存储按键开关1的电平状态
boolean pushButton2; // 创建布尔型变量用来存储按键开关2的电平状态
int ledPin = 9; //LED引脚号
int brightness = 128; //LED亮度参数
void setup() {
// put your setup code here, to run once:
pinMode(2, INPUT_PULLUP); //将引脚2设置为输入上拉模式
pinMode(8, INPUT_PULLUP); //将引脚8设置为输入上拉模式
pinMode(ledPin, OUTPUT); //将LED引脚设置为输出模式
Serial.begin(9600); //启动串口通讯
}
void loop() {
// put your main code here, to run repeatedly:
pushButton1 = digitalRead(2); //读取引脚2电平状态并将其赋值给布尔变量
pushButton2 = digitalRead(8); //读取引脚8电平状态并将其赋值给布尔变量
if (!pushButton1 && brightness > 0){ // 当按下按键开关1并且LED亮度参数大于0
brightness--; // 减低LED亮度参数
//(brightness-- 相当于 brightness = brightness - 1;)
} else if (!pushButton2 && brightness < 255) { //当按下按键开关2并且LED亮度参数小于255
brightness++; //增加LED亮度参数
//(brightness++ 相当于 brightness = brightness + 1;)
}
analogWrite(ledPin, brightness); //模拟输出控制LED亮度
Serial.println(brightness); //将LED亮度参数显示在串口监视器上
delay(10);
}
只有带有波浪线的可以调节LED亮度。
当长按右边的键,输出从255降到0,灯亮度降至熄灭;
当长按左边的键,输出从0升到255,灯亮度逐渐变亮。
analogWrite()指定引脚输出,并控制亮度(0~255范围内)。支持356911引脚。
执行analogWrite()时,会给该引脚一个指定的PWM频率,除了5,6引脚(980Hz),一般频率是490Hz左右。
analogWrite()不需要pinMode()设置引脚,但是也可以设置。
主板上有一句话:PWM=~
当修改analogWrite()的第二个参数时,就是修改在一个周期内LED亮的部分的占比。比如127就是127/255的时间处于亮的状态,其他时间处于灭的状态,频率过快时看起来就觉得亮度低了。
Potentiometer 电位器,本课学习中使用的电位器类似一个螺丝侧面长者3个引脚的东西。原理类似滑动变阻器。
有一个旋钮,三个引脚,电位器上写着电阻值(13号引脚之间的),比如我的是10000.
旋钮向哪边转,哪边电阻降低。
旋钮左转到头,则12间电阻为0,23间电阻为10000.
电位器可以把0~5v输入电压映射到0~1023范围,旋转旋钮模拟输入会从0~1023变化。
/*
模拟输入
本程序旨在演示如何使用analogRead()读取Arduino的引脚电平。
通过调节电位器, A0引脚的输入电压将在0V-5V之间。
该输入电压将被映射到数值0-1023之间,并显示在串口监视器中。
电路连接:
电位器中间引脚连接到模拟输入A0引脚
电位器两端引脚分别连接在Arduino +5V和接地引脚
太极创客 www.taichi-maker.com
2017-01-08
This example code is in the public domain.
*/
void setup() {
// 串口通讯初始化(9600 bps):
Serial.begin(9600);
}
void loop() {
// 读取模拟输入值:
int analogInputVal = analogRead(A0);
// 将结果通过串口监视器显示:
Serial.println(analogInputVal);
}
Arduino每0.1毫秒读取一次输入。
当模拟输入引脚没有连线的时候,读取到的值无法确定。甚至我们把手靠近该引脚,值都会变化。
randomSeed()就是利用一个没连线的空引脚赋值。
其实很简单,analogInputVal获取到的值通过~引脚输出给电灯就可以了。
一个小问题在于:analogInputVal的范围是01023,analogWrite输出电灯亮度范围是0255,要怎么处理?有一个线程的函数:map
int ledpin=9;
void setup() {
// 串口通讯初始化(9600 bps):
Serial.begin(9600);
pinMode(ledpin,OUTPUT);
}
void loop() {
// 读取模拟输入值:
int analogInputVal = analogRead(A0);
// 将结果通过串口监视器显示:
Serial.print("analogInputVal:");
Serial.println(analogInputVal);
int brightness=map(analogInputVal,0,1023,0,255);//映射
Serial.print("brightness:");
Serial.println(brightness);
analogWrite(ledpin,brightness);
}