#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… Замена его на более качественный решила всю проблему. Спасибо за идею со светодиодом, это принесло несколько камней для броска… 🙂