Последовательные входные значения работают только в течение очень коротких секунд

Я только что сделал очень простую схему со светодиодом и резистором. Я также написал программу, которая должна принимать данные о том, как долго должен гореть светодиод. Он отлично работает для более коротких промежутков времени, таких как 10 секунд, но как только я пытаюсь ввести время, например 120 секунд, светодиод никогда не выключается.
Мой код ниже. Что может быть не так?

int light=9;

void setup() {
  Serial.begin(9600); 
  pinMode(light, OUTPUT); 
  }

void loop() {
  Serial.println("How long do you want the light on for (in seconds)?"); 
  while(Serial.available()==0){} 
  int on_time = (Serial.parseInt() * 1000); 
  digitalWrite(light, HIGH); 
  delay(on_time); 
  digitalWrite(light, LOW); 
  Serial.print("The light was just on for "); 
  Serial.print(on_time/1000);
  Serial.print(" seconds. ");
}  

, 👍2

Обсуждение

пожалуйста, включите всю информацию .... ваш код выводится на последовательную консоль ... что вы видите распечатанным?, @jsotola

Какая у тебя Ардуино? В Uno int имеет значения от -32 768 до 32 767. unsigned int находится от 0 до 65 535 (т.е. это всего 16 бит). Попробуйте использовать unsigned long вместо int, чтобы увидеть, поможет ли это., @stevieb

Хорошо, это имеет большой смысл. Я попробую это. Спасибо! И да, у меня есть Уно, кстати, @ThisUsernameHasBeenTaken

Это полностью исправило мою программу, большое спасибо!, @ThisUsernameHasBeenTaken

«светодиод никогда не выключается» не совсем так. Он выключится, но с очень большой задержкой., @AnT


1 ответ


2

Если вы добавите Serial.println(on_time); сразу после int on_time = (Serial.parseInt() * 1000);, вы увидите проблему. Например, если вы введете число 33, напечатанное значение integer будет равно -32536. Допустимым типом данных для delay() является unsigned long, поэтому отрицательное число вызывает проблему.

Разумное использование Serial.println() может быть очень полезным при отладке скетча.

,

Привет! Спасибо, что нашли время помочь! Я только что сделал, как вы предложили, да, я видел отрицательное число. 2 вопроса: 1) Почему так происходит? Разве это не должно быть просто 33x1000? Я полный нуб, поэтому я не понимаю, что такое "unsigned long". 2) Как я могу решить эту проблему/избежать этой проблемы в будущем?, @ThisUsernameHasBeenTaken

1) В UNO наибольшее «число», которое вы можете сохранить в «целом числе», равно 32767. 33 секунды умножить на 1000 мс = 33000, что превышает максимум 32767, поэтому целое число становится отрицательным «числом». Переменная unsigned long может содержать «число» до 4 294 967 295. 2) Чтобы избежать подобных проблем, вооружитесь знаниями. Я обнаружил, что примеры, прилагаемые к IDE, очень помогают определить, какие типы переменных использовать и как их использовать. Еще одним источником информации о типах переменных, функциях и т. д. является Справочник по языку, который можно найти здесь: https://www.arduino.cc/reference/en/., @VE7JRO

Все это имеет смысл. Еще раз спасибо!, @ThisUsernameHasBeenTaken

@ThisUsernameHasBeenTaken: Re «_Почему это происходит?_»: поскольку вы используете число _signed_, старший бит интерпретируется как бит знака. Вот как работает арифметика [дополнение до двух](https://en.wikipedia.org/wiki/Two%27s_complement)., @Edgar Bonet