【问题标题】:Understanding the logic behind the code for controlling an 8x8 dot matrix with a joystick [closed]了解使用操纵杆控制 8x8 点阵的代码背后的逻辑 [关闭]
【发布时间】:2020-05-13 05:22:54
【问题描述】:

我在网上找到了这段代码,用于使用 Arduino 控制 max7219 8x8 矩阵,但我很难理解关于代码的一些内容。这是整个代码:

#include <LedControl.h>

int UD = 0;
int LR = 0; //Setting up controller//
LedControl lc=LedControl(8,10,9,1); //10 is to CLOCK, 9 = CS, 8=DIN//

void setup() {
 Serial.begin(9600);
 lc.shutdown(0,false); // turn off power saving, enables display
 lc.setIntensity(0,1); // sets brightness (0~15 possible values)
 lc.clearDisplay(0); // clear screen
}

void loop() {
 UD = analogRead(A0);
 LR = analogRead(A1);
 char x_translate = map(LR, 1021, 0, 7, 0); //map(value, fromLow, fromHigh, toLow, toHigh)
 char y_translate = map(UD, 1021, 0, 0, 7);

 Serial.print("UD = ");
 Serial.print(UD, DEC);
 Serial.print(", LR = ");
 Serial.print(LR, DEC);
 Serial.print(", x = ");
 Serial.print(x_translate, DEC);
 Serial.print(", y = ");
 Serial.println(y_translate, DEC);
 // not in shutdown mode
 lc.clearDisplay(0);
 lc.setLed(0,x_translate,y_translate,true);
 delay(150); //adjust delay to get your joystick correct//
}

我的第一个问题与Serial.begin(9600) 的含义有关。

我最大的问题是将操纵杆的模拟输入转换为点亮矩阵上的 LED:

char x_translate = map(LR, 1021, 0, 7, 0); //map(value, fromLow, fromHigh, toLow, toHigh)
char y_translate = map(UD, 1021, 0, 0, 7);

1021 来自哪里,为什么它是 fromLow 值,而它似乎是它扩展的任何范围的最大值? 7 是从哪里来的,为什么会出现在他们现在的位置上?

最后,所有Serial.print() 语句到底发生了什么?什么是 Serial,什么是 DEC?

如您所知,我对 C++ 还很陌生,因此我们将不胜感激,谢谢。

【问题讨论】:

  • “Serial”表示它使用串行传输协议。 DEC 表示十进制。
  • 如你所知,我对 C++ 还很陌生 -- 仅供参考 -- 你提出的问题与 C++ 语言几乎没有关系,更多的是使用 Arduino API 函数。一位没有对 Arduino 做过任何事情的 C++ 专家无法回答您提出的问题。
  • 请不要问可以参考Arduino手册回答的问题
  • DEC 意味着写这篇文章的人可能不太清楚他们在做什么。 DEC 是打印语句的默认值。当您看到这通常表明某人对 Arduino 编码不那么流利时。它们中的每一个都可以在不更改任何内容的情况下删除。

标签: arduino led joystick arduino-c++


【解决方案1】:

来自 Arduino 手册:

Serial.begin(baud)

设置串行数据的数据速率(以每秒位数(波特)为单位) 传输。

所以在你的情况下它是 9600 baud

Serial.print()

将数据作为人类可读的 ASCII 文本打印到串行端口。一个 可选的第二个参数指定要使用的基础(格式); 允许的值为 BIN(二进制或以 2 为底)、OCT(八进制或以 8 为底)、 DEC(十进制,或以 10 为底),HEX(十六进制,或以 16 为底)。用于浮动 点数,该参数指定小数位数 使用。例如-

Serial.print(78, BIN) 给出“1001110”

Serial.print(78, OCT) 给出“116”

Serial.print(78, DEC) 给出“78”

Serial.print(78, HEX) 给出“4E”

Serial.print(1.23456, 0) 给出“1”

Serial.print(1.23456, 2) 给出“1.23”

Serial.print(1.23456, 4) 给出“1.2345”

map(value, fromLow, fromHigh, toLow, toHigh)

将数字从一个范围重新映射到另一个范围。也就是说,一个值为 fromLow 将被映射到 toLow,一个 fromHigh 到 toHigh 的值, 中间值到中间值等。

:要映射的数字。 fromLow:值的下限 当前范围。

fromHigh:值当前范围的上限。

toLow:值的目标范围的下限。

toHigh:值的目标范围的上限。

值 1021 是由编写该代码的人选择的,因为他想将范围 [1021-0] 映射到 [7-0],很可能是因为最大操纵杆伸长产生了模拟值 1021。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2015-08-14
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多