初步认知Arduino-3,按钮控制LED灯和扩展模块
准备器材:
·开发板(Arduino UNO)
·面包板1块
·面包板跳线
·LED灯:1个
·220Ω电阻:1个
·10KΩ电阻:1个
·四脚开关:一个
////插播:今年年初录制了一套比较系统的入门单片机教程,想让同学免费找我拿,私信我就可以了~点击我的头像黑色字体加上我也可以得到哦。最近比较闲,带做毕设////
正文开始:
色环电阻
同时在这里使用10K对于220的电阻,我们应该学会区分色环电阻的电阻值,以免在实验或清洗过程中混淆它们。这里主要讨论四环电阻和五环电阻
色环电阻表面有不同颜色的环。电阻的电阻值可以通过这些环的颜色和位置(序列)来计算,方便不同的开发人员和维护人员读取电阻值,便于检测和更换。
色环颜色
色环有不同的颜色,色环代表不同的含义,可以代表值、倍数和误差。以下是四环和五环电阻色环的位置
四环电阻和五环电阻色环的位置代表意义
假设现在有10KΩ让我们看看其色环的电阻
我们可以看到棕色-黑色-黑色-红色-棕色的序列,然后根据五环电阻色环的位置意义图计算:
棕色在第一百位是1,黑色在第二和第三位是10位和0位,所以值部分是100,然后第四位红色代表倍数是100,所以最终阻值是100×100=10000=10K,第五位棕色代表10K该值的精度误差上下浮动1%,即最终电阻值为10KΩ±1%
色环阻值读取有方向性,即从左到右计算的阻值与从右到左计算的阻值不同。让我们看看200Ω的电阻
电阻值分别从两侧计算,结果是不同的计算200Ω±一个计算1000%Ω±因此,在色环电阻中,判断序列方向更为重要(因为色环电阻没有正反标记),这里有一些判断技巧:
·如果有无色,那一端就是末端,因为无色只表示误差
·如果有金银,那么金银的末端就是末端,因为金银只能表示倍数和精度
·如果橙色、黄色、白色和黑色出现在最边缘,这一端就是开始,因为这些颜色不能表示精度
·如果白色和灰色出现在中间两个位置之一,偏向的一端是开始,因为它们不能表示乘倍数
·头尾经常出现棕色环,很难区分。这个时候其实可以看间隔。第四环和第五环的间隔比第一环和第二环的间隔要大
·如果不能判断,可以用最后计算的电阻来判断,如果计算的电阻是140Ω这种奇怪的电阻基本上是错误的
间隔大小不同
四脚按钮开关
四脚按钮开关是四个针脚按钮开关,其中两两一组是交换的,但两组之间没有交换。只有当按钮被按下(按下)时,信号才会变成交换
如下图所示,四个针脚,两个交换,但两组不连接,按钮将连接,如果只连接一组交换电路,按钮实际上相当于电线,不能发挥任何作用,所以最好确保正负极连接到不同组的接口
四脚按钮开关实物图
拉电阻
拉电阻分为上拉电阻和下拉电阻,通过下图能简单了解拉电阻:
拉电阻
为什么要拉电阻而不是直接连接电线?因为直接连接电线会短路,使用电阻可以避免元件直接连接GND。
Arduino UNO内部只有上拉电阻,没有下拉电阻
接线
看接线图,分两部分,一部分是LED是的,有些是四脚按钮开关。前者以前做过,主要取决于后者
这里的2号引脚接收到四脚按钮开关,但在按下开关之前,四脚按钮开关的引脚悬挂状态将得到不稳定值(可能是高或低电平,可能是由电磁感应等原因引起的),这将导致程序认为我们一直在随机按下按钮,因此需要添加下拉电阻(连接一个电阻(通常是10KΩ)然后接入GND),这样,当没有电源时,它总是低电平(接地)。一旦按下按钮通电,就可以立即判断高电平
实际接线图-返回第一张图
这里注意四脚按钮开关,用一点力轻轻按针脚,不能轻轻放在表面
代码 &效果
接线检查,然后打开Arduino IDE敲代码
//定义常量constintbuttonPin=2;constintledPin=13;
intbuttonState=0;
voidsetup(){
pinMode(buttonPin,INPUT);
pinMode(ledPin,OUTPUT);}
voidloop(){
//按住才会亮buttonState=digitalRead(buttonPin);
if(buttonState==HIGH){
digitalWrite(ledPin,HIGH);
}else{
digitalWrite(ledPin,LOW);
}}
这里定义了两个常量buttonPin和ledPin,这样,如果针脚只需要改变常量中的数字,就不需要在整个文件中找到替换,这是一个好习惯(就像HIGH和LOW其实也是定义的常量)。一旦读取并按下,它就会亮起LED效果如下:
扩展
这里使用的是下拉电阻,但也可以使用上拉电阻Arduino UNO在这里,我们有内置的上拉电阻(没有内置的下拉电阻)改造成内置的上拉电阻来实现按一次亮,再按一次灭的效果,接线图如下:
代码如下:
//定义常量constintbuttonPin=2;constintledPin=13;
//按键前一个状态intoldButtonState=HIGH;//按键状态intbuttonState=HIGH;// led灯状态,false->没亮,true->亮booleanledState=false;
voidsetup(){
//使用内置上拉电阻pinMode(buttonPin,INPUT_PULLUP);
pinMode(ledPin,OUTPUT);
Serial.begin(9600);}
voidloop(){
//单次按动开关LED灯oldButtonState=buttonState;
buttonState=digitalRead(buttonPin);
if(buttonState==LOW&&oldButtonState==HIGH){
Serial.print("oldButtonState: ");
Serial.println(oldButtonState);
Serial.print("buttonState: ");
Serial.println(buttonState);
Serial.print("ledState: ");
Serial.println(ledState);
if(ledState==true){
digitalWrite(ledPin,LOW);
}else{
digitalWrite(ledPin,HIGH);
}
ledState=!ledState;
}}
这边`Serial.begin(9600)`初始化串行连接传输9600b/s(每秒传输9600比特),因为如果开发板和PC用了不同的速率,那么接收和发送数据就会出现问题,而9600只是Arduino的默认值,还可以设置19200、57600等等,在Arduino IDE的串口监视器里也可以看到。`Serial.print`输出的信息可以在串口监视器里查看,可以用于简单调试
这边通过`pinMode(buttonPin, INPUT_PULLUP)`打开内置的上拉电阻,使得2号数字口一直收到高电平,直到按下按键才会收到低电平。这边记录旧的按键状态的原因在于,一次按动根据按住时间不同出现n次触发,那么如果长按则会出现LED闪烁(一直切换LED开关),或者连续快速按动按键,也会出现LED灯开关不及时问题,因此需要记录旧的按键状态,来判断是否是第一次按动按键