-2

/* 这个程序控制可伸缩的扰流板。*/

int brightness = 0;
int rainSensor;
int speedSensor;
int currentState;


#define INITIAL_STATE  0
#define ST_SPOILER_DOWN   1
#define ST_SPOILER_UP     2
#define IO_I_RAINSENSOR     3
#define IO_PWM_SPEEDSENSOR  0
#define IO_PWM_LIGHT 7 

#define YES  0
#define NO  1


void setup(){
  currentState = INITIAL_STATE;
  pinMode(IO_I_RAINSENSOR, INPUT);
  pinMode(IO_PWM_SPEEDSENSOR, INPUT);
  pinMode(IO_I_RAINSENSOR, OUTPUT);
  pinMode(IO_PWM_LIGHT, OUTPUT);
  Serial.begin(9600);
  currentState = ST_SPOILER_DOWN;
  brightness = 0;
}

void loop()
{

/* 在这种状态下,扰流板缩回,因此电路灯关闭。下面的代码规定,如果速度传感器或雨量
传感器检测到它们的事件,电路将切换到下一个状态。*/

if(currentState == ST_SPOILER_DOWN){
  rainSensor = digitalRead(IO_I_RAINSENSOR);
  speedSensor = analogRead(IO_PWM_SPEEDSENSOR);
  if ((speedSensor > 100)||(rainSensor == YES)){
  brightness = 255;  
  analogWrite(IO_PWM_LIGHT, brightness);
  currentState = ST_SPOILER_UP;
  Serial.println("- Spoiler Down event detected. \n" );
  }
}

/* 在这种状态下,扰流板被扩展。电路灯亮表示这一点。下面的代码规定,如果速度传感器或雨量传感器检测到它们的事件,电路将切换到下一个状态。*/

if(currentState == ST_SPOILER_UP){
  rainSensor = digitalRead(IO_I_RAINSENSOR);
  speedSensor = analogRead(IO_PWM_SPEEDSENSOR);
  if ((speedSensor <95) && (rainSensor == NO)){
  brightness = 0;
  analogWrite(IO_PWM_LIGHT, brightness);
  currentState = ST_SPOILER_DOWN;
  Serial.println("- Spoiler Up event detected. \n" );
        }
    }
}

这是 tinkerCAD 中代码使用的电路。开关代表雨量传感器,而电位器代表速度传感器。扰流板本身由灯光表示。

当我运行电路时,无论我对开关和电位器做什么,灯都会熄灭,但代码不会显示任何错误。

这是电路:

电路

这是系统应该如何工作的总图:

图表

4

1 回答 1

0

首先我建议删除pinMode(IO_I_RAINSENSOR, OUTPUT);

然后#define IO_PWM_SPEEDSENSOR 0改为#define IO_PWM_SPEEDSENSOR A0

我对 Arduino 的工作不多,但如果我没记错的话,模拟输入是在引脚号前面用“A”定义的。

于 2021-04-28T10:22:32.527 回答