Arduino 如何让人们从串行监视器输入数字并捕获数字并将其分配给变量

Arduino how do I let people input number from serial monitor and capture the number and assign it to a variable

这是 link 以便你们可以编辑 code/arduino 并在此处尝试:https://www.tinkercad.com/things/kKwzIR4EKkq-project-test/editel?sharecode=_1bgBJa_dekYA2zOBAmrX-fSEpjp10qO9cC2JzeooZg

基本上我希望人们将时间输入串行监视器并将其分配给“长间隔”变量。我该怎么做呢? Arduino 图片:Digital Hourglass

A​​rduino代码: (我尝试这样做但它似乎无法工作,它总是会打开所有灯,当我按下按钮时,灯会一个接一个地亮起,因为间隔为 0,所以我假设它尚未分配?)

const int switchPin = 8;
unsigned long previousTime = 0;
int switchState = 0;
int prevSwitchState = 0;
int led = 2;
long interval =0;
void setup() {
  Serial.begin(9600); 
    delay(2000);  
 
    Serial.println("Input time for alarm in seconds");

 for(int x = 2;x<8;x++){
 pinMode(x, OUTPUT);
 }
 pinMode(switchPin, INPUT);
}
void loop(){
 
  if(Serial.available()){

int val = Serial.parseInt(); //read int or parseFloat for ..float...

Serial.println(val);
long interval =val;
   }
 unsigned long currentTime = millis();
 if(currentTime - previousTime > interval) {
 previousTime = currentTime;
digitalWrite(led, HIGH);
 led++;
 if(led == 7){
 }
 }
 switchState = digitalRead(switchPin);
 if(switchState != prevSwitchState){
 for(int x = 2;x<8;x++){
 digitalWrite(x, LOW);
 }
 led = 2;
 previousTime = currentTime;
 }
 prevSwitchState = switchState;
   
}

您应该使用 Serial.readString() 函数从 Serial monitor 读取数据,然后将该数据传递给 atol(const char *)

atol 接受 const char * 并且 return 接受 long,因此您必须使用 Stringchar * 转换为 char * =19=]

使用此代码

#define DEFAULT_INTERVAL 1000

const int switchPin = 8;
unsigned long previousTime = 0;
int switchState = 0;
int prevSwitchState = 0;
int led = 2;
long interval =0;

void setup() {
    Serial.begin(9600); 
    delay(2000);  
 
    Serial.println("Input time for alarm in seconds");

    for(int x = 2;x<8;x++){
        pinMode(x, OUTPUT);
    }
     
    pinMode(switchPin, INPUT);
}

void loop() {

    static long interval = DEFAULT_INTERVAL;
 
    if(Serial.available()){
        String SerialData = Serial.readString();
        interval = atol(SerialData.c_str());

        Serial.println(interval);

    }
    
    unsigned long currentTime = millis();
    if(currentTime - previousTime > interval) {
        previousTime = currentTime;
        digitalWrite(led, HIGH);
        led++;
    
        if(led == 7){
    
        }
    }
    
    switchState = digitalRead(switchPin);
    if(switchState != prevSwitchState) {
        for(int x = 2;x<8;x++)
            digitalWrite(x, LOW);
        
        led = 2;
        previousTime = currentTime;
    }
    
    prevSwitchState = switchState;
   
}

如果来自 Serial Monitor 的输入不是数字,则 atol 将 return 0。您可能需要编写一些代码来处理该问题