红绿灯

Arduinio mega 2560习题-填空、选择和判断-9-I2C总线_引脚

Arduinio mega 2560习题-填空、选择和判断-9-I2C总线_起始信号_02

Arduinio mega 2560习题-填空、选择和判断-9-I2C总线_Arduino_03

Arduinio mega 2560习题-填空、选择和判断-9-I2C总线_起始信号_04


第九部分 I2C通信

填空题

  1. Arduino Mega 2560上,I2C总线接口主要通过______和______两个引脚实现。
    答案:SDA(数据),SCL(时钟)
  2. I2C总线中的SDA代表______。
    答案:串行数据线
  3. I2C总线中的SCL代表______。
    答案:串行时钟线
  4. Arduino Mega 2560的I2C总线通信速率最高可达______kHz。
    答案:400
  5. 在I2C通信中,______是主动发起通信的一方。
    答案:主机(或主设备)
  6. I2C设备地址通常由______位组成。
    答案:7
  7. 在I2C通信中,ACK信号表示______。
    答案:应答(或确认)
  8. Arduino Mega 2560使用______库来实现I2C通信。
    答案:Wire
  9. 在I2C通信过程中,如果设备没有应答,主机可能会收到______信号。
    答案:NACK(非应答)
  10. I2C总线上的每个设备都有一个唯一的______。
    答案:设备地址
  11. 使用Wire.begin()函数可以初始化I2C通信,并设置Arduino为______。
    答案:I2C主机
  12. 在I2C通信中,从机在接收到数据后,通常会通过______线向主机发送应答信号。
    答案:SDA
  13. 使用Wire.write()函数可以向I2C从机发送______。
    答案:数据
  14. 在I2C通信中,主机通过发送______来告知从机即将进行读或写操作。
    答案:起始信号
  15. 当I2C通信结束时,主机会发送______来结束通信。
    答案:停止信号

单选题

  1. 下列哪个函数用于初始化Arduino的I2C通信?
    A. Serial.begin() B. Wire.begin() C. SPI.begin()答案:B
  2. 在I2C通信中,哪个信号标志着通信的开始?
    A. ACK
    B. NACK
    C. 起始信号
    答案:C
  3. I2C总线上的设备地址通常有多少位?
    A. 8位
    B. 7位
    C. 6位
    答案:B
  4. 下列哪个函数用于向I2C从机发送数据?
    A. Wire.read() B. Wire.write() C. Wire.available()答案:B
  5. 在I2C通信中,哪个信号用于表示从机已经成功接收到数据?
    A. 起始信号
    B. 停止信号
    C. ACK信号
    答案:C
  6. Arduino Mega 2560的I2C通信主要依赖于哪两个引脚?
    A. 0和1
    B. 20和21
    C. A0和A1
    答案:B(SDA为20,SCL为21)
  7. 下列哪个函数用于请求从I2C从机读取数据?
    A. Wire.requestFrom() B. Wire.send() C. Wire.beginTransmission()答案:A
  8. I2C总线上的通信速率是由谁决定的?
    A. 从机
    B. 主机
    C. 总线上的所有设备共同决定
    答案:B
  9. 在I2C通信过程中,如果主机没有接收到从机的应答,会收到什么信号?
    A. ACK
    B. NACK
    C. 起始信号
    答案:B
  10. 下列哪个不是I2C通信的特点?
    A. 多主机支持
    B. 高速通信
    C. 远距离通信(超过100米)
    答案:C
  11. 使用Wire.endTransmission()函数时,如果参数为true,则表示什么?
    A. 发送停止信号
    B. 发送起始信号
    C. 发送重复起始信号
    答案:C
  12. 在I2C通信中,哪个信号标志着通信的结束?
    A. 起始信号
    B. 重复起始信号
    C. 停止信号
    答案:C
  13. Arduino Mega 2560支持的I2C通信速率最高可达多少kHz?
    A. 100
    B. 200
    C. 400
    答案:C
  14. 下列哪个函数用于检查I2C总线上是否有数据可读?
    A. Wire.available() B. Wire.read() C. Wire.onReceive()答案:A
  15. 在I2C通信中,从机是如何被寻址的?
    A. 通过设备地址
    B. 通过引脚号
    C. 通过设备名称
    答案:A

判断题

  1. I2C总线只能支持一个主机和多个从机进行通信。()
    答案:对
  2. 在I2C通信中,主机和从机都可以主动发起通信。()
    答案:错(只有主机可以主动发起通信)
  3. I2C总线上的设备地址是唯一的,不会重复。()
    答案:对(在同一总线上)
  4. Arduino Mega 2560的I2C通信速率是固定的,不能改变。()
    答案:错(可以通过编程调整)
  5. 使用Wire.begin()函数可以初始化Arduino为I2C从机。()
    答案:错(该函数初始化Arduino为I2C主机)
  6. 在I2C通信中,ACK信号表示从机没有成功接收到数据。()
    答案:错(ACK信号表示从机成功接收到数据)
  7. I2C总线上的通信是双向的,主机和从机都可以发送和接收数据。()
    答案:对
  8. I2C总线上的设备可以通过任意两个引脚进行连接。()
    答案:错(必须通过SDA和SCL引脚连接)
  9. 在I2C通信过程中,如果主机没有接收到从机的应答,会立即停止通信。()
    答案:对(可能会发送停止信号或重复起始信号进行错误处理)
  10. Arduino Mega 2560的I2C通信不需要额外的硬件支持,只需要通过软件编程即可实现。()
    答案:对(但需要使用到Arduino板上的SDA和SCL引脚)
  11. 使用Wire.read()函数可以从I2C从机读取数据,但不需要先发送请求。()
    答案:错(需要先使用Wire.requestFrom()函数发送请求)
  12. I2C总线上的通信速率是由从机决定的。()
    答案:错(是由主机决定的)
  13. 在I2C通信中,起始信号和停止信号都是由主机发送的。()
    答案:对
  14. Arduino Mega 2560可以同时作为I2C主机和从机进行通信。()
    答案:错(在同一时刻只能作为主机或从机之一)
  15. I2C总线是一种串行通信协议,适用于短距离、低速率的通信场景。()
    答案:错(I2C总线适用于短距离、中速率的通信场景,虽然速率不是非常高,但也不是低速)

//Created by cslg.
// 由cslg创建
// 引入LCD I2C库
#include <LiquidCrystal_I2C.h>

// 初始化LCD I2C对象,地址为0x27,16列2行
LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // 初始化LCD显示和背光
  lcd.init();                  // 初始化LCD
  lcd.backlight();             // 打开LCD背光
  
  // 设置LED引脚为输出模式
  pinMode(2, OUTPUT);          // 红色LED引脚
  pinMode(3, OUTPUT);          // 黄色LED引脚
  pinMode(4, OUTPUT);          // 绿色LED引脚
}

void loop() {
  // 红色LED亮起,表示停止
  lcd.setCursor(5, 0);         // 设置光标到第1行第6列(列从0开始计数)
  lcd.println("STOP!");        // 在LCD上显示"STOP!"
  digitalWrite(2, HIGH);       // 点亮红色LED
  delay(11000);                // 延迟11秒
  digitalWrite(2, LOW);        // 熄灭红色LED
  lcd.clear();                 // 清除LCD显示
  
  // 黄色LED亮起,表示准备出发
  lcd.setCursor(1, 0);         // 设置光标到第1行第2列
  lcd.println("Prepare to go!"); // 在LCD上显示"Prepare to go!"
  digitalWrite(3, HIGH);       // 点亮黄色LED
  delay(1000);                 // 延迟1秒
  digitalWrite(3, LOW);        // 熄灭黄色LED
  lcd.clear();                 // 清除LCD显示
  
  // 绿色LED亮起,表示可以出发
  lcd.setCursor(6, 0);         // 设置光标到第1行第7列
  lcd.println("GO!");          // 在LCD上显示"GO!"
  digitalWrite(4, HIGH);       // 点亮绿色LED
  delay(7000);                 // 延迟7秒
  
  // 绿色LED闪烁三次
  for (int i = 0; i < 3; i++) {
    digitalWrite(4, LOW);      // 熄灭绿色LED
    delay(500);                // 延迟0.5秒
    digitalWrite(4, HIGH);     // 点亮绿色LED
    delay(500);                // 延迟0.5秒
  }
  digitalWrite(4, LOW);        // 最后熄灭绿色LED
  lcd.clear();                 // 清除LCD显示
  
  // 黄色LED再次亮起,表示准备停止
  lcd.setCursor(0, 0);         // 设置光标到第1行第1列
  lcd.println("Prepare to stop!"); // 在LCD上显示"Prepare to stop!"
  digitalWrite(3, HIGH);       // 点亮黄色LED
  delay(1000);                 // 延迟1秒
  digitalWrite(3, LOW);        // 熄灭黄色LED
  lcd.clear();                 // 清除LCD显示
  
  // 可以根据需要添加延迟或其他逻辑,以避免循环过快
}

 


这段代码是一个用于Arduino的简单程序,它结合了LCD显示屏(通过I2C接口)和LED灯(红色、黄色、绿色)来模拟一个交通信号灯或者某种状态指示器的行为。下面是对代码的详细解释:

引入库和初始化对象

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

cpp复制代码

#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);

#include <LiquidCrystal_I2C.h>: 引入LiquidCrystal_I2C库,这个库用于控制通过I2C接口连接的LCD显示屏。

  • LiquidCrystal_I2C lcd(0x27, 16, 2);: 创建一个LiquidCrystal_I2C对象lcd,指定I2C地址为0x27(这个地址可能因LCD模块而异),并设置LCD为16列2行。

setup() 函数

void setup() {
  lcd.init();
  lcd.backlight();
  pinMode(2, OUTPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
}

cpp复制代码

void setup() {
lcd.init();
lcd.backlight();
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
}

lcd.init();: 初始化LCD显示屏。

  • lcd.backlight();: 打开LCD的背光。
  • pinMode(2, OUTPUT); 等: 设置数字引脚2、3、4为输出模式,这些引脚将用于控制红色、黄色和绿色的LED灯。

loop() 函数

loop() 函数是Arduino程序的主循环,它会不断重复执行其中的代码。

  1. 红色LED亮起,表示停止
lcd.setCursor(5, 0);
lcd.println("STOP!");
digitalWrite(2, HIGH);
delay(11000);
digitalWrite(2, LOW);
lcd.clear();

cpp复制代码

lcd.setCursor(5, 0);
lcd.println("STOP!");
digitalWrite(2, HIGH);
delay(11000);
digitalWrite(2, LOW);
lcd.clear();

设置LCD光标到第1行第6列,并显示"STOP!"。

  • 点亮红色LED(引脚2)。
  • 延迟11秒。
  • 熄灭红色LED。
  • 清除LCD显示。
  1. 黄色LED亮起,表示准备出发
lcd.setCursor(1, 0);
lcd.println("Prepare to go!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();

cpp复制代码

lcd.setCursor(1, 0);
lcd.println("Prepare to go!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();

设置LCD光标到第1行第2列,并显示"Prepare to go!"。

  • 点亮黄色LED(引脚3)。
  • 延迟1秒。
  • 熄灭黄色LED。
  • 清除LCD显示。
  1. 绿色LED亮起,表示可以出发
lcd.setCursor(6, 0);
lcd.println("GO!");
digitalWrite(4, HIGH);
delay(7000);

cpp复制代码

lcd.setCursor(6, 0);
lcd.println("GO!");
digitalWrite(4, HIGH);
delay(7000);

设置LCD光标到第1行第7列,并显示"GO!"。

  • 点亮绿色LED(引脚4)。
  • 延迟7秒。
  1. 绿色LED闪烁三次
for (int i = 0; i < 3; i++) {
  digitalWrite(4, LOW);
  delay(500);
  digitalWrite(4, HIGH);
  delay(500);
}
digitalWrite(4, LOW);
lcd.clear();

cpp复制代码

for (int i = 0; i < 3; i++) {
digitalWrite(4, LOW);
delay(500);
digitalWrite(4, HIGH);
delay(500);
}
digitalWrite(4, LOW);
lcd.clear();

绿色LED闪烁三次,每次闪烁包括熄灭0.5秒和点亮0.5秒。

  • 最后熄灭绿色LED。
  • 清除LCD显示。
  1. 黄色LED再次亮起,表示准备停止
lcd.setCursor(0, 0);
lcd.println("Prepare to stop!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();

cpp复制代码

lcd.setCursor(0, 0);
lcd.println("Prepare to stop!");
digitalWrite(3, HIGH);
delay(1000);
digitalWrite(3, LOW);
lcd.clear();

设置LCD光标到第1行第1列,并显示"Prepare to stop!"。

  • 点亮黄色LED(引脚3)。
  • 延迟1秒。
  • 熄灭黄色LED。
  • 清除LCD显示。

总结

这个程序通过LCD显示屏和LED灯模拟了一个简单的状态指示器或交通信号灯。它按照特定的顺序和时间间隔点亮和熄灭不同颜色的LED,并在LCD上显示相应的文字信息。这种类型的程序可以用于教学、演示或作为更复杂项目的一部分。