0°

(十八)arduino入门:简易交通灯

一、本节介绍

在本课中,我们将进行一项有趣的试验——模拟交通灯。红绿灯是交通道路引导信号为由彩色灯,红灯停,绿灯行,黄灯的谨慎行事。

二、材料准备

1*-arduinoUNO板

-USB数据线*1

-杜邦线

旋转编码器-1*

3*-LED

电阻器220Ω*(-3)

三、原理讲解

真正的交通指示灯,用于显示红色的时间长度长于绿色和黄色。因此,我们定义两个循环代码:短周期和长周期。在短周期时,交通灯改变的速率大约为每秒一次。另一方面,在长周期变化的旋转编码器,其时间长度来确定红色和绿色。

四、实验步骤

image https://bbs.qutaojiao.com/assets/images/1-wWcwKSLtleORiIGv.png

原理图

image https://bbs.qutaojiao.com/assets/images/1-WgwZaOlslkdv74gh.png

步骤2:编写程序

步骤3:编译代码

步骤4:上传程序到arduino UNO板

看到这里你应该点亮的红色LED,红色LED和黄色LED、绿色LED、黄色LED和最后一次。

image https://bbs.qutaojiao.com/assets/images/1-c8wn78g4teVP1LMs.jpeg

本节课代码:

/***************************/
//交通灯
//将点亮红色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);
}

本节课程序下载:点击下载

下载密码:

当前内容已被隐藏,您需要登录才能查看

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论