关于#c语言#的问题:但是只有第一次按压crash有反应,但是LED灯和按压器都没反应

img

img


// 定义引脚号
#define CRASH_SWITCH 6
#define TOUCH_SENSOR 4
#define BUZZER 10
#define LED_PIN 8

// 定义状态常量
const int INITIAL_STATE = 0;
const int CRASH_PRESSED = 1;
const int TOUCH_PRESSED = 2;
const int SECOND_CRASH_PRESSED = 3;

// 定义LED状态常量
const int LED_OFF = 0;
const int LED_GREEN = 1;
const int LED_RED = 2;

// 初始化状态
int state = INITIAL_STATE;
int ledState = LED_OFF;

void setup() {
  // 初始化引脚模式
  pinMode(CRASH_SWITCH, INPUT_PULLUP);
  pinMode(TOUCH_SENSOR, INPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
}

void loop() {
  // 检测 crash 开关是否被按下
  if (digitalRead(CRASH_SWITCH) == LOW) {
    delay(50); // 延迟一段时间以消除抖动
    if (digitalRead(CRASH_SWITCH) == LOW) {
      switch (state) {
        case INITIAL_STATE:
          // 第一次按下 crash 开关
          state = CRASH_PRESSED;
          ledState = LED_GREEN;
          tone(BUZZER, 600);
          break;
        case CRASH_PRESSED:
          // 第二次按下 crash 开关
          state = SECOND_CRASH_PRESSED;
          ledState = LED_OFF;
          noTone(BUZZER);
          break;
        case TOUCH_PRESSED:
          // 第二次按下 crash 开关
          state = SECOND_CRASH_PRESSED;
          ledState = LED_OFF;
          noTone(BUZZER);
          break;
        case SECOND_CRASH_PRESSED:
          // 重置状态
          state = INITIAL_STATE;
          break;
      }
    }
  }
  
  // 检测触摸传感器是否被触摸
  int touchValue = analogRead(TOUCH_SENSOR);
  if (touchValue < 800) {
    switch (state) {
      case CRASH_PRESSED:
      case SECOND_CRASH_PRESSED:
        // 触摸传感器被触摸
        state = TOUCH_PRESSED;
        ledState = LED_RED;
        tone(BUZZER, random(700, 1200));
        break;
      case TOUCH_PRESSED:
        // 不需要做任何事情
        break;
      case INITIAL_STATE:
        // 触摸传感器无效
        break;
    }
  } else {
    if (state == TOUCH_PRESSED) {
      // 触摸传感器没有被触摸
      state = CRASH_PRESSED;
      ledState = LED_GREEN;
      tone(BUZZER, 600);
    }
  }
 // 更新LED状态
  switch (ledState) {
    case LED_OFF:
      digitalWrite(LED_PIN, LOW);
      break;
    case LED_GREEN:
      digitalWrite(LED_PIN, HIGH);
      break;
    case LED_RED:
      digitalWrite(LED_PIN, (millis() / 100) % 2 == 0 ? HIGH : LOW); // 闪烁
      break;
  }
} 


为什么我上面这个代码编译都正确,但是只有第一次按压crash有反应,但是LED灯和按压器都没反应

img


第二张图帮我实现一下

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
问题可能是由于电路连接不正确或硬件问题引起的。请先检查电路连接是否正确。

另外,通过观察代码,可以看到按压器的引脚被定义为INPUT_PULLUP模式。这意味着在按下按压器时,引脚会变为LOW,但在未按下时,引脚为HIGH。因此,检测按压器状态的代码应该检查引脚是否为HIGH

在更新LED状态的代码中,可以尝试将闪烁的部分替换为:

digitalWrite(LED_PIN, ledState == LED_RED && (millis() / 100) % 2 == 0 ? HIGH : ledState == LED_GREEN ? HIGH : LOW);

这将根据LED的状态和当前时间决定将LED设置为高电平还是低电平。

第二张图片中的代码示例:

#define CRASH_SWITCH 6
#define TOUCH_SENSOR 4
#define BUZZER 10
#define LED_PIN 8
const int INITIAL_STATE = 0;
const int CRASH_PRESSED = 1;
const int TOUCH_PRESSED = 2;
const int SECOND_CRASH_PRESSED = 3;
const int LED_OFF = 0;
const int LED_GREEN = 1;
const int LED_RED = 2;
int state = INITIAL_STATE;
int ledState = LED_OFF;
void setup() {
  pinMode(CRASH_SWITCH, INPUT_PULLUP);
  pinMode(TOUCH_SENSOR, INPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
}
void loop() {
  if (digitalRead(CRASH_SWITCH) == HIGH) {
    delay(50);
    if (digitalRead(CRASH_SWITCH) == HIGH) {
      switch (state) {
        case INITIAL_STATE:
          state = CRASH_PRESSED;
          ledState = LED_GREEN;
          tone(BUZZER, 600);
          break;
        case CRASH_PRESSED:
          state = SECOND_CRASH_PRESSED;
          ledState = LED_OFF;
          noTone(BUZZER);
          break;
        case TOUCH_PRESSED:
          state = SECOND_CRASH_PRESSED;
          ledState = LED_OFF;
          noTone(BUZZER);
          break;
        case SECOND_CRASH_PRESSED:
          state = INITIAL_STATE;
          break;
      }
    }
  }
  int touchValue = analogRead(TOUCH_SENSOR);
  if (touchValue < 800) {
    switch (state) {
      case CRASH_PRESSED:
      case SECOND_CRASH_PRESSED:
        state = TOUCH_PRESSED;
        ledState = LED_RED;
        tone(BUZZER, random(700, 1200));
        break;
      case TOUCH_PRESSED:
        break;
      case INITIAL_STATE:
        break;
    }
  } else {
    if (state == TOUCH_PRESSED) {
      state = CRASH_PRESSED;
      ledState = LED_GREEN;
      tone(BUZZER, 600);
    }
  }
  digitalWrite(LED_PIN, ledState == LED_RED && (millis() / 100) % 2 == 0 ? HIGH : ledState == LED_GREEN ? HIGH : LOW);
}

如果我的回答解决了您的问题,请采纳!

参考CHATGPT和自己的理解回答,希望能帮到你.

根据提供的代码,我注意到你定义了一些引脚和状态常量,并初始化了一些变量。在setup()函数中,你将引脚模式设置为输入或输出模式。在loop()函数中,你检测crash开关和触摸传感器是否被按下或触摸,并在不同的状态下执行不同的操作。你还更新了LED的状态,以便根据状态常量设置LED的亮灭。

既然你说只有第一次按压crash有反应,但是LED灯和按压器都没反应,那么可能是以下几个问题导致的:

硬件连接问题。请检查硬件连接是否正确,例如是否将LED灯和按压器正确连接到了对应的引脚。也请确保您的硬件部件正常工作,例如检查您的LED灯是否正常发光。

代码逻辑问题。请检查您的代码逻辑是否正确。例如,当触摸传感器被触摸时,您将进入TOUCH_PRESSED状态并将ledState设置为LED_RED,但是在该状态下,您没有指定LED的状态。这可能会导致LED灯不亮。

电源问题。请检查您的电源是否充足,特别是在使用大量的LED灯和声音输出时。

如果你排除了硬件问题和电源问题,我建议您仔细检查您的代码逻辑,以确保每个状态下的操作正确。另外,您可以使用串口监视器来检查程序的运行情况,以帮助您确定问题的根本原因。

c语言运行程序崩溃(crash)的原因
可以借鉴下
https://blog.csdn.net/w1050321758/article/details/125830366

引用chatGPT作答,这段代码可能存在以下问题:

1.按压开关抖动
在检测按压开关是否被按下时,代码中使用了延迟函数delay(50)来消除按键抖动,这种方式并不是最好的方式,因为它会占用处理器的时间,可能会导致其他代码的执行受阻。更好的方式是使用外部中断或者轮询的方式来检测按键状态,可以避免抖动带来的问题。

2.触摸传感器阈值
在检测触摸传感器是否被触摸时,代码中使用了一个阈值800,这个阈值可能不是最优的,可能需要根据具体的硬件配置和使用场景来调整阈值。

3.蜂鸣器持续时间
在蜂鸣器响起时,代码中并没有设置持续时间,可能会导致蜂鸣器一直响,需要在蜂鸣器响起后一段时间后停止。

4.LED状态更新
在更新LED状态时,代码中使用了millis()函数来控制LED闪烁,这种方式可能会占用处理器的时间,影响其他代码的执行。更好的方式是使用定时器或者硬件PWM来控制LED状态。

针对以上问题,可以对代码进行优化,改进上述问题,以下是修改后的代码:

// 定义引脚号
#define CRASH_SWITCH 6
#define TOUCH_SENSOR 4
#define BUZZER 10
#define LED_PIN 8
 
// 定义状态常量
const int INITIAL_STATE = 0;
const int CRASH_PRESSED = 1;
const int TOUCH_PRESSED = 2;
const int SECOND_CRASH_PRESSED = 3;
 
// 定义LED状态常量
const int LED_OFF = 0;
const int LED_GREEN = 1;
const int LED_RED = 2;
 
// 初始化状态
int state = INITIAL_STATE;
int ledState = LED_OFF;
 
// 定义变量
unsigned long previousMillis = 0;
const unsigned long blinkInterval = 500; // LED闪烁时间间隔
 
void setup() {
  // 初始化引脚模式
  pinMode(CRASH_SWITCH, INPUT_PULLUP);
  pinMode(TOUCH_SENSOR, INPUT);
  pinMode(BUZZER, OUTPUT);
  pinMode(LED_PIN, OUTPUT);
 
  // 配置外部中断
  attachInterrupt(digitalPinToInterrupt(CRASH_SWITCH), handleCrash, FALLING);
}
 
void loop() {
  // 更新LED状态
  unsigned long currentMillis = millis();
  if (ledState == LED_RED && currentMillis - previousMillis >= blinkInterval) {
    previousMillis = currentMillis;
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
  } else if (ledState == LED_GREEN) {
    digitalWrite(LED_PIN, HIGH);
  } else {
    digitalWrite(LED_PIN, LOW);
  }
 
  // 检测触摸传感器是否被触摸
  int touchValue = analogRead(TOUCH_SENSOR);
  if (touchValue < 800) {
    switch (state) {
      case CRASH_PRESSED:
      case SECOND_CRASH_PRESSED:
        // 触摸传感器被触摸
        state = TOUCH_PRESSED;
        ledState = LED_RED;
        tone(BUZZER, random(700, 1200));
        break;
      case TOUCH_PRESSED:
        // 不需要做任何事情
        break;
      case INITIAL_STATE:
        // 触摸传感器无效
        break;
    }
  } else {
    if (state == TOUCH_PRESSED) {
      // 触摸传感器没有被触摸
      state = CRASH_PRESSED;
      ledState = LED_GREEN;
      noTone(BUZZER);
    }
  }
}
 
// 处理按压开关中断
void handleCrash() {
  switch (state) {
    case INITIAL_STATE:
      // 第一次按下 crash 开关
      state = CRASH_PRESSED;
      ledState = LED_GREEN;
      tone(BUZZER, 600);
      break;
    case CRASH_PRESSED:
      // 第二次按下 crash 开关
      state = SECOND_CRASH_PRESSED;
      ledState = LED_OFF;
      noTone(BUZZER);
      break;
    case TOUCH_PRESSED:
      // 第二次按下 crash 开关
      state = SECOND_CRASH_PRESSED;
      ledState = LED_OFF;
      noTone(BUZZER);
      break;
    case SECOND_CRASH_PRESSED:
      // 重置状态
      state = INITIAL_STATE;
      break;
  }
}