使用Arduino制作Knight Rider LED扫描仪

曾经希望您拥有自己的Knight Industries 2000(KITT)汽车-您知道吗,来自Knight Rider?通过构建LED扫描仪,使您的梦想更接近现实!这是最终结果:

您需要什么

该项目不需要很多零件,您可能已经有很多零件了:

  • 1 x Arduino UNO或类似的
  • 1 x面包板
  • 8 x红色LEDs
  • 8 x 220欧姆电阻
  • 1 x 10k欧姆电位计
  • 公对公连接线
  • 如果您有Arduino入门套件)。

    几乎所有的Arduino都可以使用,只要它有八个可用的引脚即可(绝不

    构建计划

    电路

    将每个LED的阳极(长脚)连接到数字引脚1至8。将阴极(短脚)连接到Arduino地面。

    代码

    创建一个新的草图并将其保存为“ knightRider"。代码如下:

    const int leds[] = {1,2,3,4,5,6,7,8}; // Led pinsconst int totalLeds = 8;int time = 50; // Default speedvoid setup() {    // Initialize all outputs    for(int i = 0; i <= totalLeds; ++i) {        pinMode(leds[i], OUTPUT);    }}void loop() {    for(int i = 0; i < totalLeds - 1; ++i) {        // Scan left to right        time = analogRead(2);        digitalWrite(leds[i], HIGH);        delay(time);        digitalWrite(leds[i + 1], HIGH);        delay(time);        digitalWrite(leds[i], LOW);    }    for(int i = totalLeds; i > 0; --i) {        // Scan right to left        time = analogRead(2);        digitalWrite(leds[i], HIGH);        delay(time);        digitalWrite(leds[i - 1], HIGH);        delay(time);        digitalWrite(leds[i], LOW);    }}

    让我们分解一下。每个LED引脚存储在一个数组中:

    数组本质上是相关项目的集合。这些元素被定义为常量(“ const"),这意味着它们以后无法更改。尽管建议使用常量,但不必使用常量(如果删除“ const",代码将正常工作)。

    使用方括号(“ []")访问数组的元素和一个称为索引的整数。索引从零开始,因此“ leds [2]"将返回数组中的第三个元素—针脚3。数组使代码更快地编写且更易于阅读,它们使计算机难以完成工作!

    一个for循环用于将每个引脚设置为输出:

    for(int i = 0; i <= totalLeds; ++i) {        pinMode(leds[i], OUTPUT);}

    此代码位于“ setup()"函数内部,因为它只需要在程序启动时运行一次即可。 For循环非常有用。它们允许您一次又一次地运行相同的代码,每次都使用不同的值。它们非常适合使用数组。声明了整数“ i",并且只有循环内部的代码才能访问此变量(称为“作用域")。 i的值从零开始,对于循环的每次迭代,i都增加1。一旦i的值小于或等于“ totalLeds"变量,则循环“中断"(停止)。

    The value of i is used to access the “leds” array. This loop accesses every element in the array and configures it as an output. You could manually type “pinMode(pin, OUTPUT)” eight times, but why write eight lines when you can write three?

    某些编程语言可以告诉您数组中有多少个元素(通常是使用array.length之类的语法),Arduino并没有使其变得如此简单(它涉及到更多的数学运算)。由于数组中元素的数量是已知的,所以这不是问题。

    在主循环( void loop())内部还有两个for循环。第一个循环将LED从1 – 8设置为ON,然后关闭。第二个循环将LED从8 – 1设置为ON,然后关闭。请注意,如何将电流引脚设置为ON,同时将电流引脚加一个也设置为ON。这样可以确保始终同时有两个LED,从而使扫描仪看起来更逼真。

    在每个循环开始时,电位计的值都将被读取到“时间"变量中:

    time = analogRead(2);

    此操作执行两次,每个循环一次。这需要不断检查和更新。如果此操作不在循环中,它仍然可以工作,但是会有一个小的延迟-它仅在循环完成执行后才运行。电位计是模拟的,因此为什么要使用“ analogRead(pin)"。这将返回零(最小值)到1023(最大值)之间的值。 Arduino能够将这些值转换为更有用的值,但是对于这种使用情况,它们是完美的选择。

    更改LED的间隔(或扫描仪的速度)之间的延迟以毫秒为单位(1/1000秒) ),因此最长时间仅为1秒。

    高级扫描器

    现在您已经了解了基础知识,下面让我们看一下更复杂的东西。该扫描仪将从外部开始并在工作中成对点亮LED。然后将其反转,从内部到外部成对发光。代码如下:

    const int leds[] = {1,2,3,4,5,6,7,8}; // Led pinsconst int totalLeds = 8;const int halfLeds = 4;int time = 50; // Default speedvoid setup() {    // Initialize all outputs    for(int i = 0; i <= totalLeds; ++i) {        pinMode(leds[i], OUTPUT);    }}void loop() {    for(int i = 0; i < (halfLeds - 1); ++i) {        // Scan outside pairs in        time = analogRead(2);        digitalWrite(leds[i], HIGH);        digitalWrite(leds[(totalLeds - i) - 1], HIGH);        delay(time);        digitalWrite(leds[i], LOW);        digitalWrite(leds[(totalLeds - i) - 1], LOW);        delay(time);    }    for(int i = (halfLeds - 1); i > 0; --i) {        // Scan inside pairs out        time = analogRead(2);        digitalWrite(leds[i], HIGH);        digitalWrite(leds[(totalLeds - i) - 1], HIGH);        delay(time);        digitalWrite(leds[i], LOW);        digitalWrite(leds[(totalLeds - i) - 1], LOW);        delay(time);    }}

    此代码稍微复杂一些。请注意,两个循环如何从零变为“ halfLeds – 1"(3)。这使扫描仪更好。如果两个循环都从4 – 0和0 – 4变为循环,则相同的LED将以相同的顺序闪烁两次-看起来效果不佳。

    您现在应该拥有一台工作正常的Knight Rider LED扫描仪!修改它以使用更多或更大的LED或实现您自己的图案将很容易。这个电路很容易移植到Raspberry Pi(Pi的新手?从这里开始。

    您要构建KITT副本吗?我很乐意在评论中看到Knight Rider的所有内容。

    标签: Arduino 电子技术