目录
关于点亮LED灯
INPUT 输入模式
OUTPUT 输出模式
INPUT_PULLUP 输入上拉模式
在Arduino核心库中,OUTPUT被定义等于1,INPUT被定义等于0,HIGH被定义等于1,LOW被定义等于0。因此这里也可以用数字替代这些定义。
setup()函数:开始的时候运行一次,相当于初始化的功能。
loop()函数:arduino的执行函数,在运行的过程中不断循环。
用pinMode(pin,mode): 函数将13号引脚设置成输出模式。
digitalWrite(pin,value):将数字IO口输出高电平或低电平
delay(ms):暂停执行多少毫秒
在英文输出状态时,;分号是作为结束符用
在英文输入状态时,//是用单行注释
实验1点亮LED灯(闪烁)
//点亮LED灯(闪烁)
void setup(){
pinMode(13,OUTPUT);//将13号引脚设置成输出模式
}
void loop(){
digitalWrite(13,HIGH);//13号引脚上的LED灯就亮了,输出高电位
delay(1000);
digitalWrite(13,LOW);//13号引脚上的LED灯就灭了,输出低电位
delay(1000);
}
直接在开头定义一个变量,方便日后修改。
int led = 13;
也可以宏定义的方式,来为设备设置一个名称。
#define LED 13
实验2点亮LED灯+HELLO WORLD
波特率:单片机或计算机在串口通信时的速率(所以一定要保持通信设备的波特率一致,不然无法通信)
Serial.read()这个函数是读串口并返回收到参数,读取1比特的序列资料
意思是:Serial.read() == 'a'正确,Serial.read()=='aa'是错误的
用Serial.println():这个函数从串行端口输出数据
//点亮LED灯+Hello World
void setup(){
pinMode(13,OUTPUT);//将13号引脚设置成输出模式
Serial.begin(9600);//将波特率设置成9600
}
void loop(){
if(Serial.read()=='a'){
digitalWrite(13,HIGH);
delay(1000);
digitalWrite(13,LOW);
delay(1000);
Serial.println("Hello World");
}
delay(1);//小延时
}
这样就可以在串口监视器上输入a然后LED闪烁一次,并输出Hello World。
实验3for循环制作流水灯
void setup()
{
// 初始化I/O口
for(int i=2;i<8;i++)
pinMode(i,OUTPUT);
}
void loop()
{
// 从引脚2到7引脚,逐个点亮LED,等待1秒再熄灭LED
for(int i=2;i<8;i++)
{
digitalWrite(i,HIGH);
delay(1000);
digitalWrite(i,LOW);
}
}
实验4利用RGB三色灯制作炫彩灯光
void setup() {
// put your setup code here, to run once:
pinMode(2,OUTPUT);
pinMode(3,OUTPUT);
pinMode(4,OUTPUT);
}
void loop() {
// put your main code here, to run repeatedly:
for(int i=2;i<=4;i++)
{
for(int j=2;j<=4;j++)
{
for(int k=2;k<=4;k++)
{
digitalWrite(i,HIGH);
delay(10);
digitalWrite(j,LOW);
delay(10);
digitalWrite(k,HIGH);
delay(10);
digitalWrite(k,LOW);
delay(10);
digitalWrite(j,HIGH);
delay(10);
digitalWrite(i,LOW);
delay(10);
}
}
}
}
ps:RGB灯上的-引脚接arduino的GND(接地)
实验5 通过analogWrite() 函数实现呼吸灯效果
/*
Fading
通过analogWrite() 函数实现呼吸灯效果
*/
int ledPin = 2; // LED连接在9号引脚上
int ledPin2 = 3;
int ledPin3 = 4;
void setup() {
// Setup部分不进行任何处理
}
void loop() {
// 从暗到亮,以每次加5的形式逐渐亮起来
for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
// 输出PWM
analogWrite(ledPin, fadeValue);
analogWrite(ledPin2, fadeValue);
analogWrite(ledPin3, fadeValue);
// 等待30ms,以便观察到渐变效果
delay(30);
}
// 从亮到暗,以每次减5的形式逐渐暗下来
for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
// 输出PWM
analogWrite(ledPin, fadeValue);
// 等待30ms,以便观察到渐变效果
delay(30);
}
}
数字IO口的外部电路
Arduino UNO 板有 14 个数字 I/O 引脚(15)(其中 6 个提供 PWM(脉宽调制)输出),这些引脚可配置为数字输入引脚,用于读取逻辑值(0 或 1) ;或作为数字输出引脚来驱动不同的模块,如 LED,继电器等。标有“〜”的引脚可用于产生 PWM。
上面的0-13口就是arduino的数字IO口,0和1一般作为串口通信使用,不接其他设备。
用按钮控制LED灯的开关
方法一:
const int buttonPin = 2; // 连接按键的引脚
const int ledPin = 13; // 连接LED的引脚
// 变量定义
int buttonState = 0; // 存储按键状态的变量
void setup() {
// 初始化LED引脚为输出状态
Serial.begin(9600); //设置波特率
pinMode(ledPin, OUTPUT);
// 初始化按键引脚为输入状态
pinMode(buttonPin, INPUT);
}
void loop(){
// 读取按键状态并存储在变量中
buttonState = digitalRead(buttonPin);
// 检查按键是否被按下
// 如果按键按下,那buttonState应该为高电平
if (buttonState==HIGH) {
// 点亮LED
digitalWrite(ledPin, HIGH);
Serial.println("a");
}
else {
// 熄灭LED
digitalWrite(ledPin, LOW);
Serial.println(buttonState);
}
delay(1000);
}
上图中我自己的接法导致了相反的结果,按下按钮时灯灭了,因为按下按钮时2号引脚校测到的输入电压为低电平。并且由串口显示器输出的值时不时输出异样的值可知,2号引脚的状态一直不稳定。通过搜索资料得知:使用pinMode(pin, INPUT)配置的引脚在没连接到任何电路上时(处于悬空状态),从引脚读出的结果可能会“乱跳”。这是因为引脚收到了电子噪声的干扰,或者由于电容耦合读取了附近引脚的值。
所以,在按键控制LED实验-Arduino中文社区 - Powered by Discuz!里面的实验中,采用了下拉电阻,将这一节点通过电阻接地。
因而,代码一样,电路不一样时,效果也不同:
如果像arduino中文社区中连接的这样,设置了限流电阻(左)和下拉电阻(右).当未按下按键时,2号引脚检测到的输入电压为低电平;当按下按键时,会导通2号引脚和VCC,此时2号引脚检测到的输入电压为高电平。通过判断按键是否被按下,来控制LED的亮灭。
方法二:
通过电压的变化识别按钮:当按钮按下,2号引脚上的电压是5V,当引脚松开,2号引脚上的电压为0V。
void setup() {
pinMode(7, OUTPUT);
pinMode(2, INPUT);
}
void loop() {
if (digitalRead(2) == HIGH) {
digitalWrite(7, HIGH);
}
else {
digitalWrite(7, LOW);
}
delay(1);
}
按钮控制进阶
要实现按一下按键,点亮LED;再按一下按键,熄灭LED。
初始代码:
//全局变量,局部变量
int x=0;
int deng1=0;//记录按键当时的状态
int deng2=0;//记录按键之前的状态
void setup(){
pinMode(2,INPUT);
pinMode(7,OUTPUT);
//digitalWrite(7,HIGH);
}
void loop(){
deng1=digitalRead(2);
if(deng1=1 and deng2==0){
delay(50);
if(x==0){ //用来切换x的值
x=1;
}else{
x=0;
}
}
deng2=deng1;
delay(1000);
if(x==1){digitalWrite(7,HIGH);
}else{
digitalWrite(7,LOW);
}
}
改进后:
改进了方法一中的做法:
pinMode(buttonPin,INPUT_PULLUP);
此操作等效于在该引脚到VCC之间连接一个外部上拉电阻。
使用INPUT_PULLUP对输入引脚进行配置
在Atmega芯片中每个输入引脚都对应着一个20kΩ的上拉电阻,你可以通过代码去使这些内置上拉电阻发挥作用(只需在pinMode函数中传入INPUT_PULLUP函数作为参数即可) 。使用上拉电阻会“反转”读取结果,当读取到HIGH的时候说明引脚上为低电压,当读取到LOW时说明引脚上是高电压。
(————————————————
版权声明:本文为CSDN博主「acktomas」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/acktomas/article/details/85197175)
int buttonPin = 2;
int ledPin = 8;
boolean ledState = true; //布尔值记录状态
void setup() {
// put your setup code here, to run once:
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin,OUTPUT);
}
void loop() {
// 等待按键被按下
while(digitalRead(buttonPin)==HIGH){}
if(ledState == true)
{
digitalWrite(ledPin,HIGH);
ledState = !ledState;
}
else
{
digitalWrite(ledPin,LOW);
ledState = !ledState;
}
delay(500);
}
串口配置
使用串口与计算机通信,需要先使用Serial.begin() 初始化Arduino的串口通信功能
Serial.begin(speed, config)
speed:波特率
config:数据位、校验位、停止位配置
串口输出:Serial.print(val) val是你要输出的数据,各种类型的数据均可
Serial.println(val) println会在输出完指定数据后,再输出一组回车换行符
串口输入:Serial.read() 每次都会返回一个字节(注意:仅一个字节)的数据,这个返回值是当前串口读到的数据。
Serial.available():
获取串口接收到的数据个数,即获取串口接收缓冲区中的字节数。接受缓冲区最多可保存64 bytes的数据。
Serial.end()
结束串口通信。
该操作可以释放该串口所在的数字引脚,使得其可以作为普通数字引脚使用。
Serial.find(target)
target : 需要搜索的字符串或字符,返回Boolean型:True:找到;False:没有找到
......
通过学习arduino实现软串口通信_lanhebe的博客-CSDN博客_arduino软串口
和Arduino串口通信_xiaoshihd的博客-CSDN博客_arduino串口通信实例
最终实现的串口通信
/*
* arduino uno端程序
* 串口使用情况
serial -----computer
serial1----- nano softwearserial
*/
#include<SoftwareSerial.h>
SoftwareSerial softSerial(6,5);
void setup() {
//初始化serial,该串口用于与计算机连接通信:
Serial.begin(9600);
//初始化serial1,该串口用于与设备B连接通信;
softSerial.begin(9600);
softSerial.listen();
}
//两个字符串分别用于存储A,B两端传来的数据
String device_A_String="";
String device_B_String="";
void loop() {
// 读取从计算机传入的数据,并通过softSerial发送个设备B:
if(Serial.available()>0)
{
if(Serial.peek()!='\n')
{
device_A_String+=(char)Serial.read();
}
else
{
Serial.read();
Serial.print("you said:");
Serial.println(device_A_String);
softSerial.println(device_A_String);
device_A_String="";
}
}
//读取从设备B传入的数据,并在串口监视器中显示
if(softSerial.available()>0)
{
if(softSerial.peek()!='\n')
{
device_B_String+=(char)softSerial.read();
}
else
{
softSerial.read();
Serial.print("device B said:");
Serial.println(device_B_String);
device_B_String="";
}
}
}
/*
* arduino uno端程序
* 串口使用情况
serial -----computer
serial1----- nano softwearserial
*/
#include<SoftwareSerial.h>
SoftwareSerial softSerial(3,2);
void setup() {
//初始化serial,该串口用于与计算机连接通信:
Serial.begin(9600);
//初始化serial1,该串口用于与设备B连接通信;
softSerial.begin(9600);
softSerial.listen();
}
//两个字符串分别用于存储A,B两端传来的数据
String device_A_String="";
String device_B_String="";
void loop() {
// 读取从计算机传入的数据,并通过softSerial发送个设备B:
if(Serial.available()>0)
{
if(Serial.peek()!='\n')
{
device_A_String+=(char)Serial.read();
}
else
{
Serial.read();
Serial.print("you said:");
Serial.println(device_A_String);
softSerial.println(device_A_String);
device_A_String="";
}
}
//读取从设备B传入的数据,并在串口监视器中显示
if(softSerial.available()>0)
{
if(softSerial.peek()!='\n')
{
device_B_String+=(char)softSerial.read();
}
else
{
softSerial.read();
Serial.print("device B said:");
Serial.println(device_B_String);
device_B_String="";
}
}
}
因为这部分当时遇到了很多难题,
用不正常的方式交流
19:54:04.440 -> you said:324
19:54:15.031 -> you said:tyuu
19:54:24.411 -> device A said:hajkldh
19:54:28.395 -> device A said:kkalfdsl
19:54:31.931 -> you said:ksfjlaskdf
19:54:34.205 -> device A said:afjkl
19:54:35.371 -> you said:alkadsj
19:54:39.144 -> you said:中
19:54:54.551 -> device A said:好开心啊
19:55:01.655 -> you said:gfghhjk
19:55:01.935 -> you said:
19:55:04.631 -> you said:nmmbnmkl
19:55:08.669 -> you said:i哦皮哦破看;
19:55:08.855 -> you said:
19:55:13.687 -> device A said:我们终于成功啦
19:55:30.387 -> you said:我们成功了!
19:55:35.024 -> device A said:以后是可以光明正大划水了是吗19:55:40.991 -> you said:哈哈哈哈哈哈哈哈哈哈哈