目录
一、本节介绍
在本课中,我们将进行一项有趣的试验——模拟交通灯。红绿灯是交通道路引导信号为由彩色灯,红灯停,绿灯行,黄灯的谨慎行事。
二、材料准备
1*-arduinoUNO板
-USB数据线*1
-杜邦线
旋转编码器-1*
3*-LED
电阻器220Ω*(-3)
三、原理讲解
真正的交通指示灯,用于显示红色的时间长度长于绿色和黄色。因此,我们定义两个循环代码:短周期和长周期。在短周期时,交通灯改变的速率大约为每秒一次。另一方面,在长周期变化的旋转编码器,其时间长度来确定红色和绿色。
四、实验步骤
原理图
步骤2:编写程序
步骤3:编译代码
步骤4:上传程序到arduino UNO板
看到这里你应该点亮的红色LED,红色LED和黄色LED、绿色LED、黄色LED和最后一次。
本节课代码:
[scu name=”arduino-ide-post” platform=”arduino:avr:uno”]
/***************************/
//交通灯
//将点亮红色LED,红色LED和黄色LED、绿色LED、黄色LED和最后一次
//2017.11.12
/***************************/
const int redPin = 7; //红灯 配置引脚
const int yellowPin = 8 ; //黄灯
const int greenPin = 9; //绿灯
const int clkPin = 2; //CLK引脚2连接,
const int dtPin = 3; //DT连接到引脚3
const int swPin = 6; // SW连接到引脚6
int encoderVal = 0;
int state = 0;
int shortPeriod = 1000;
int longPeriod = 1000;
int targetCount = shortPeriod;
int count = 0;
void setup()
{
pinMode(clkPin, INPUT); //设置输入clkpin
pinMode(dtPin, INPUT); //设置输入dtpi
pinMode(swPin, INPUT); //设置输入swpin
digitalWrite(swPin, HIGH);
pinMode(redPin, OUTPUT); //设置为输出redpin
pinMode(yellowPin, OUTPUT); //设置为输出yellowpin
pinMode(greenPin, OUTPUT); //设置为输出greenpin
Serial.begin(9600); //设置为输出greenpin
}
void loop()
{
count++;
int change = getEncoderTurn();
longPeriod = longPeriod + change * 1000;
if (digitalRead(swPin) == LOW)
{
setLights(HIGH, HIGH, HIGH);
}
else
{
if (count == targetCount)
{
setState();
count = 0;
}
}
delay(1);
}
void setState(void)
{
if (state == 0)
{
setLights(HIGH, LOW, LOW);
targetCount = longPeriod;
state = 1;
}
else if (state == 1)
{
setLights(HIGH, HIGH, LOW);
targetCount = shortPeriod;
state = 2;
}
else if (state == 2)
{
setLights(LOW, LOW, HIGH);
targetCount = longPeriod;
state = 3;
}
else if (state == 3)
{
setLights(LOW, HIGH, LOW);
targetCount = shortPeriod;
state = 0;
}
}
int getEncoderTurn(void)
{
static int oldA = HIGH;
static int oldB = HIGH;
int result = 0;
int newA = digitalRead(clkPin);
int newB = digitalRead(dtPin);
if (newA != oldA || newB != oldB)
{
//一些事情已经改变
if (oldA == HIGH && newA == LOW)
{
result = (oldB * 2 - 1);
}
}
oldA = newA;
oldB = newB;
return result;
}
//该函数设置指定的LED的状态(ON或OFF),则在高、低和关闭
void setLights(int redState, int yellowState, int greenState)
{
digitalWrite(redPin, redState);
digitalWrite(yellowPin, yellowState);
digitalWrite(greenPin, greenState);
}
[/scu]
本节课程序下载:点击下载
下载密码:
见
好的