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
Arduino代码:
(我尝试这样做但它似乎无法工作,它总是会打开所有灯,当我按下按钮时,灯会一个接一个地亮起,因为间隔为 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
,因此您必须使用 String
将 char *
转换为 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
。您可能需要编写一些代码来处理该问题
这是 link 以便你们可以编辑 code/arduino 并在此处尝试:https://www.tinkercad.com/things/kKwzIR4EKkq-project-test/editel?sharecode=_1bgBJa_dekYA2zOBAmrX-fSEpjp10qO9cC2JzeooZg
基本上我希望人们将时间输入串行监视器并将其分配给“长间隔”变量。我该怎么做呢? Arduino 图片:Digital Hourglass
Arduino代码: (我尝试这样做但它似乎无法工作,它总是会打开所有灯,当我按下按钮时,灯会一个接一个地亮起,因为间隔为 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
,因此您必须使用 String
将 char *
转换为 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
。您可能需要编写一些代码来处理该问题