Мой Arduino останавливается после 1 минуты ожидания

У меня есть небольшое программирование Arduino, которое просто останавливается после первого цикла. Я могу что-то упустить... но я просто ничего не понимаю в том, что происходит.

Вот код

int led = 13;
//int led = 10;
unsigned long windtime = 1000 * 2; // 2 seconds
unsigned long pausetime = 1000 * 60; // 1 minute

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);

  Serial.begin(9600);
}

// the loop routine runs over and over again forever:
void loop() {
  Serial.print("Wind");
  digitalWrite(led, HIGH);
  delay(windtime);               

  Serial.print("Pause");
  digitalWrite(led, LOW);    
  delay(pausetime);
}

Я использовал Serial только как отладочное эхо.

Есть идеи?


person Alex    schedule 03.10.2013    source источник
comment
Программа, которую вы дали, выглядит хорошо... никогда не исключайте аппаратную ошибку. Возможно, у вас включен отладчик с точкой останова?   -  person AndyG    schedule 03.10.2013
comment
Отладчик не активен. И мой Arduino UNO, и Nano просто останавливаются после первого моргания....   -  person Alex    schedule 04.10.2013
comment
Пробовали ли вы использовать millis() вместо задержки. Также попробуйте свою программу без последовательной инициализации и посмотрите, работает ли она. Это также может быть связано с аппаратной проблемой.   -  person praks411    schedule 04.10.2013
comment
Проверьте мой ответ. Я заставил это работать, даже у меня нет окончательного понимания этого.   -  person Alex    schedule 04.10.2013


Ответы (4)


Кажется, вам нужно явно установить для числовых литералов значение long (L), и они их используют. В противном случае это не работает. Если кто-нибудь может объяснить, есть ли какое-либо автоматическое преобразование, это будет здорово, но до тех пор просто используйте:

unsigned long seconds = 1000L; // !!! SEE THE CAPITAL "L" USED!!!
unsigned long minutes = seconds * 60;
unsigned long hours = minutes * 60; 

а затем просто используйте задержку (миллисек), как обычно:

delay(5 * minutes);

Это сработало для меня.

person Alex    schedule 04.10.2013

в вашей строке:

unsigned long pausetime = 1000 * 60; // 1 minute

Arduino будет смотреть на 1000 (целое число) и 60 (целое число) и таким образом выработает ответ, который попытается вставить в... целое число! Это означает, что самый большой ответ, который он может дать для паузы, равен 32 767. Все, что больше этого, будет свернуто, поэтому 60 000 минус два лота по 32 768 дает -5536.

Чтобы увидеть это в действии, добавьте Serial.print(1000 * 60); к настройке и просмотру в меню «Инструменты»> «Последовательный монитор»:

// the setup routine runs once when you press reset:
void setup() {                
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
  Serial.begin(9600);
  Serial.print(1000 * 60);
}

Чтобы заставить Arduino использовать ваши константы как unsigned long, добавьте ul или UL в конец числа.

person askchipbug    schedule 19.05.2014

Возможно, неподписанные длинные строки перезаписываются. В качестве метода отладки попробуйте жестко запрограммировать постоянное значение, например delay(6000), на шесть секунд. Это докажет, работает ли ваше оборудование.

Наконец, не уверен, должно ли значение задержки быть unsigned long, я обычно использую int, а не 60 000, что больше, чем может хранить int (2 байта) на Arduino. Помните, встроенные системы на самом деле являются системами меньшего размера.

этот пример: http://arduino.cc/en/Tutorial/BlinkWithoutDelay подразумевает< /strong> значение задержки должно быть целым числом.

Надеюсь это поможет.

person JackCColeman    schedule 04.10.2013
comment
Как видно из подписи [ arduino.cc/en/Reference/delay ] delay(. ..) принимает unsigned long. - person Alex; 04.10.2013
comment
Проверьте мой ответ. Я заставил это работать, даже у меня нет окончательного понимания этого. - person Alex; 04.10.2013

вместо использования

unsigned long windtime = 1000 * 2; // 2 seconds
unsigned long pausetime = 1000 * 60; // 1 minute

использовать

unsigned long windtime = 2000; // 2 seconds
unsigned long pausetime = 60000; // 1 minute

и сделано.

person RAMESHBHAI GAJJAR    schedule 27.09.2019