Последовательные входные значения работают только в течение очень коротких секунд
Я только что сделал очень простую схему со светодиодом и резистором. Я также написал программу, которая должна принимать данные о том, как долго должен гореть светодиод. Он отлично работает для более коротких промежутков времени, таких как 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. ");
}
1 ответ
Если вы добавите 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
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Использовать все контакты как цифровые входы/выходы
- Float печатается только 2 десятичных знака после запятой
- Arduino как USB HID
- Serial1' was not declared in this scope
- Очень простая операция Arduino Uno Serial.readString()
- AT-команда не отвечает на последовательный монитор
пожалуйста, включите всю информацию .... ваш код выводится на последовательную консоль ... что вы видите распечатанным?, @jsotola
Какая у тебя Ардуино? В Uno
int
имеет значения от -32 768 до 32 767.unsigned int
находится от0
до65 535
(т.е. это всего 16 бит). Попробуйте использоватьunsigned long
вместоint
, чтобы увидеть, поможет ли это., @steviebХорошо, это имеет большой смысл. Я попробую это. Спасибо! И да, у меня есть Уно, кстати, @ThisUsernameHasBeenTaken
Это полностью исправило мою программу, большое спасибо!, @ThisUsernameHasBeenTaken
«светодиод никогда не выключается» не совсем так. Он выключится, но с очень большой задержкой., @AnT