当前位置: 首页 > 知识库问答 >
问题:

Arduino逻辑故障?

姬寂离
2023-03-14

我正在制作一个简单的Led程序,它将成为我项目的一个库。我创建了四种方法,可以让您A)根据需要设置尽可能多的Led引脚,并将其作为输出。B) 在自定义时间闪烁Led灯。C) 打开LED。D) 关闭LED。如果我只运行void循环()中的方法,一切都正常。例如:

Void loop(){

flashLed(pinNum, 2000);
turnOf(pinNum);
turnOn(pinNum);
}

如果我运行上面的代码,它工作得很好,但是它保持循环,因为它显然是在循环中。所以我决定用串口启动串口com。在setup()中开始(9600),然后测试串行com,并使用switch case语句来适当地实现这些方法。我做错了什么?我一点错误都没有。当我输入串行监视器时,什么都没有发生,我相信我的逻辑是正确的,但这就是我在这里的原因。当在串行监视器中键入任何内容时,代码将在switch case语句中运行默认值,仅此而已。我试过用while,如果没有用的话。还测试了串行的反向,这将是!电视连续剧available()以下是我的代码:

//Define the pin numbers
byte pinNum[] = {4, 3, 2};


void setup() {
  //Setup the ledPins
  ledSetup(pinNum);
  Serial.begin(9600);  
}

void loop() {

  while(Serial.available() > 0){
    //Read the incoming byte
    byte ledStatus = Serial.read();
    switch (ledStatus){
      case 0: 
      turnOff(pinNum);
      Serial.println("The Leds Have Been Turned Off");
      break;
      case 1:
      turnOn(pinNum);
      Serial.println("The Leds Have Been Turned On");
      break;
      case 2:
      flashLed(pinNum, 1000); //This will make the Led blink for half a second
      Serial.println("The Leds Will Begin Flashing");
      break;
      default:
      flashLed(pinNum, 1000); //This will make the Led blink for half a second
      break;
    }
  }
}

//Method to declare the pins as output
void ledSetup(byte ledPins[]){
  for (int i = 0; i <= sizeof(ledPins); i++){
    pinMode(ledPins[i], OUTPUT);
  }
}

//Method to blink the Led light/lights
void flashLed(byte ledBlink[], int duration){
  //Time is divided by two because it takes 2 seconds 
  //to run the sketch 
for (int i = 0; i <= sizeof(ledBlink); i++){
  digitalWrite(ledBlink[i], HIGH);
  delay(duration/2);
  digitalWrite(ledBlink[i], LOW);
  delay(duration/2);
}
}

//Method to turn Leds off
void turnOff(byte ledOff[]){
  for(int i = 0; i <= sizeof(ledOff); i++){
    digitalWrite(ledOff[i], LOW);
}
}

//Method to turn Leds On
void turnOn(byte turnOn[]){
for (int i = 0; i <= sizeof(turnOn); i ++){
  digitalWrite(turnOn[i], HIGH);

}
}

共有1个答案

公西志文
2023-03-14

串行监视器发送ASCII格式编码的符号。

e、 g.输入<代码>0<代码>,<代码>串行。read()返回48,这是数字0的ASCII码。由于以下情况中未列出值48,因此采用默认分支:

      case 0: ...
      case 1: ...
      case 2: ...
      default: ...

你的问题有很多解决方案。

1.更改case条件以匹配您发送的内容:

      case '0': ...
      case '1': ...
      case '2': ...

2、更换串行。使用串行读取()。parseInt():

    int ledStatus = Serial.parseInt();

这实际上适用于更通用的输入,例如123,但如果输入缓冲区中的数字有任何不同,它将返回0

3、换行<代码>序列。在atoi()中读取():

    byte ledStatus = atoi(Serial.read());

这比之前的两个选项都要有限,因为现在您的交换机中只能有10个案例。

 类似资料:
  • 逻辑层 App Service 小程序开发框架的逻辑层使用 JavaScript 引擎为小程序提供开发者 JavaScript 代码的运行环境以及京东小程序的特有功能。 逻辑层将数据进行处理后发送给视图层,同时接受视图层的事件反馈。 开发者写的所有代码最终将会打包成一份 JavaScript 文件,并在小程序启动的时候运行,直到小程序销毁。这一行为类似 ServiceWorker,所以逻辑层也称之

  • 问题内容: 我试图更深入地了解后期和前置增量器,但以下表达式有些卡住: 我知道我在某个地方缺少逻辑,但是在哪里? 我尝试过的 从左到右(尽管我知道不建议这样做) 从内部支架开始,然后从那里开始。 谢谢您的帮助 PS:评论是我演算的细节 编辑1 我试图将硬编码值从表达式更改为其他值,结果总是 看这个例子: 该表达式在逻辑上应该相距不远,但确实可以打印出来。 当我使用负数时也会发生同样的情况: 编辑2

  • 从逻辑和有关运算创建的逻辑向量可以用于参考子数组。设X是普通的矩阵,L是由一些逻辑运算得到的同尺寸的矩阵。那么X(L)指定X的元素中L的元素非零的部分。 通过指定逻辑运算为下标表达式,这种下标可以一步完成。设有下列数据集。 x = 2.1 1.7 1.6 1.5 NaN 1.9 1.8 1.5 5.1 1.8 1.4 2.2 1.6 1.8 NaN 表示一次丢失的观察值,譬如对一份问卷调查中

  • 前面我们了解了如何把用户的请求分发到控制器,这小节我们就介绍大家如何来写控制器,首先我们还是从源码分析入手: package controllers import ( "github.com/astaxie/beego" ) type MainController struct { beego.Controller } func (this *MainCont

  • 逻辑回归对应线性回归,但旨在解决分类问题,即将模型的输出转换为从 0 到 1 之间的概率值。逻辑回归直接对分类的可能性进行建模,无需事先假设数据的分布。 最理想的转换函数为单位阶跃函数(也称Heaviside函数),但单位阶跃函数是不连续的,没法在实际计算中使用。故而,在分类过程中更常使用对数几率函数(即sigmoid函数): $$f(x)=\frac{1}{1+e^{-x}}$$ 这样,模型就变

  • 整体逻辑 整体逻辑如下图所示。