Цикл Arduino не останавливается — только с меньшими счетчиками. Arduino Nano Каждый

#c #automation #arduino #relay #garden

Вопрос:

Я не могу объяснить себе, почему этот код в некоторых случаях работает правильно, а в некоторых-нет. Вот такая ситуация:

Я пытаюсь переключить реле с помощью Arduino Nano. Поэтому я взял пример «Мигания» в качестве руководства. Он должен включаться примерно на 5 минут и выключаться примерно на 25 минут. Вот код:

 // the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(2, OUTPUT);               // sets PIN 2 as switcher for the relay
}

// the loop function runs over and over again forever
void loop() {
  int count = 0;
  int run_pump = 300;               // 5 Min run
  int stop_pump = 1500;             // 25 Min stop
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off (HIGH is the voltage level)
  digitalWrite(2, HIGH);            // turn the pump on
  while(count < run_pump) {
    count  ;
    delay(1000);                    // wait for a second
  }
  
  count = 0;              
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on by making the voltage LOW
  digitalWrite(2, LOW);             // turn the pump off
  while(count < stop_pump) {
    count  ;
    delay(1000);                    // wait for a second
  }
}
 

если я запущу этот код на Arduino, он просто включит реле навсегда. НО: Если я установлю run_pump и stop_pump примерно на 10 секунд. это будет работать должным образом! Есть ли объяснение, почему это не работает с большими счетчиками? Это так запутанно….

итак, этот код здесь работает абсолютно нормально, но почему код выше не работает?

 // the setup function runs once when you press reset or power the board
void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(2, OUTPUT);               // sets PIN 2 as switcher for the relay
}

// the loop function runs over and over again forever
void loop() {
  int count = 0;
  int run_pump = 5;               // 5 sec run
  int stop_pump = 10;             // 10 sec stop
  digitalWrite(LED_BUILTIN, LOW);   // turn the LED off (HIGH is the voltage level)
  digitalWrite(2, HIGH);            // turn the pump on
  while(count < run_pump) {
    count  ;
    delay(1000);                    // wait for a second
  }
  
  count = 0;              
  digitalWrite(LED_BUILTIN, HIGH);  // turn the LED on by making the voltage LOW
  digitalWrite(2, LOW);             // turn the pump off
  while(count < stop_pump) {
    count  ;
    delay(1000);                    // wait for a second
  }
}
 

Надеюсь, у кого-нибудь есть ключ к разгадке…. Спасибо!
Том

Комментарии:

1. абсолютно то же самое с циклом for… работают небольшие счетчики.

2. Возможно, это какая-то аппаратная проблема. Проверьте, можете ли вы управлять светодиодом вместо реле. Полностью отсоедините реле от платы для этого теста, просто чтобы убедиться, что оно не будет мешать.

3. Если это проблема с оборудованием, проверьте источник питания. Если вы питаете реле от платы arduino, это может привести к перегрузке регулятора напряжения, и через некоторое время напряжение упадет, и вы получите сброс. И если ваша плата сбросится через несколько секунд после включения насоса, то будет казаться, что петля застряла. Также убедитесь, что вы не запускаете ретранслятор непосредственно с вывода ввода-вывода. Для этого вам нужен транзистор (и диод для подавления скачков напряжения).

4. Эй, @Bill2462, спасибо за ваши идеи! Я проверил его, и он работал нормально. Это привело к мысли, что это может быть любая другая аппаратная часть, например реле. Ретранслятор был дешевым, с китайскими буквами на нем, и это было источником зла! Не знаю почему, но он разговаривал с Ардунино, говоря: «Я делаю то, что хочу, через 10 секунд!». Я заменил его 🙂 Спасибо за вашу помощь!!

Ответ №1:

Ладно, ребята, я решил эту проблему. Проблема заключалась в дешевом реле, которое пыталось связаться с Arduino… Замена его на более качественный решила всю проблему. Спасибо за идею со светодиодом, это принесло несколько камней для броска… 🙂