Запустить цикл всего за 60 секунд

Как запустить код на arduino всего на 60 секунд, а затем закрыть его? Я знаю, что мне нужно использовать функцию millis(), но я не знаю, как это сделать в моем коде. Извините, если это выглядит неясно, но мне нужно только знать, как запрограммировать функцию millis(). Это мой первый код, поэтому у меня нет опыта.

int main(void)
{
pin_mode(A13,INPUT);
pin_mode(A12,INPUT);
pin_mode(A11,INPUT);
pin_mode(A10,INPUT);
pin_mode(A15,INPUT);
pin_mode(D0,OUTPUT);
pin_mode(D1,OUTPUT);
pin_mode(D2,OUTPUT);
pin_mode(D3,OUTPUT);

while (1)
{
    int potmeter1 = read_analog_pin(A13);
    if (potmeter1 >= 1000 && potmeter1 < 1100){
    gen_pwm(D0, 1000, 100);

        int potmeter2 = read_analog_pin(A12);
        if (potmeter2 >= 2000 && potmeter2 < 2050){
        gen_pwm(D1, 1000, 100); 

            int potmeter3 = read_analog_pin(A11);
            if (potmeter3 >= 500 && potmeter3 < 525){
                gen_pwm(D2, 1000, 100);     

                    int potmeter4 = read_analog_pin(A10);
                    if (potmeter4 >= 3500 && potmeter4 < 3510){
                        gen_pwm(D3, 1000, 100);

    {
        int lichtsensor = read_analog_pin(A15);
        if (lichtsensor >= 2000 && lichtsensor < 3500 && potmeter1 >= 1000 && potmeter1 < 1100 && potmeter2 >= 2000 && potmeter2 < 2050 && potmeter3 >= 500 && potmeter3 < 525 && potmeter4 >= 3500 && potmeter4 < 3510){
            gen_pwm(D0, 1000, 100);
            gen_pwm(D1, 1000, 100);
            gen_pwm(D2, 1000, 100);
            gen_pwm(D3, 1000, 100);
            _delay_ms(250);
            gen_pwm(D0, 1000, 0);
            gen_pwm(D1, 1000, 0);
            gen_pwm(D2, 1000, 0);
            gen_pwm(D3, 1000, 0);
            _delay_ms(250);

        }
    }
                }else{
                gen_pwm(D3, 1000, 0);
                }
            }else{
            gen_pwm(D3, 1000, 0);
            gen_pwm(D2, 1000, 0);
            }
        }else{
        gen_pwm(D3, 1000, 0);
        gen_pwm(D2, 1000, 0);   
        gen_pwm(D1, 1000, 0);
        }
    }else{
    gen_pwm(D3, 1000, 0);
    gen_pwm(D2, 1000, 0);
    gen_pwm(D1, 1000, 0);
    gen_pwm(D0, 1000, 0);
    }


                }
            }

Я объединил свою программу с вашей программой и добавил #include "Arduino.h". Функция millis() теперь окрашена и работает. Мой код по-прежнему не останавливается на 60 секундах. Я сделал что-то не так?

#include "hva-xmega.h"
#include "Arduino.h"


unsigned long EndTime;

void setup()
{
    pin_mode(A13,INPUT);
    pin_mode(A12,INPUT);
    pin_mode(A11,INPUT);
    pin_mode(A10,INPUT);
    pin_mode(A15,INPUT);
    pin_mode(D0,OUTPUT);
    pin_mode(D1,OUTPUT);
    pin_mode(D2,OUTPUT);
    pin_mode(D3,OUTPUT);


    EndTime = millis() + (60*1000L);
}


void loop() {
    if( millis() < EndTime ){

while (1)
{
    int potmeter1 = read_analog_pin(A13);
    if (potmeter1 >= 1000 && potmeter1 < 1100){
        gen_pwm(D0, 1000, 100);

        int potmeter2 = read_analog_pin(A12);
        if (potmeter2 >= 2000 && potmeter2 < 2050){
            gen_pwm(D1, 1000, 100);

            int potmeter3 = read_analog_pin(A11);
            if (potmeter3 >= 500 && potmeter3 < 525){
                gen_pwm(D2, 1000, 100);

                int potmeter4 = read_analog_pin(A10);
                if (potmeter4 >= 3500 && potmeter4 < 3510){
                    gen_pwm(D3, 1000, 100);

                    {
                        int lichtsensor = read_analog_pin(A15);
                        if (lichtsensor >= 2000 && lichtsensor < 3500 && potmeter1 >= 1000 && potmeter1 < 1100 && potmeter2 >= 2000 && potmeter2 < 2050 && potmeter3 >= 500 && potmeter3 < 525 && potmeter4 >= 3500 && potmeter4 < 3510){
                            gen_pwm(D0, 1000, 100);
                            gen_pwm(D1, 1000, 100);
                            gen_pwm(D2, 1000, 100);
                            gen_pwm(D3, 1000, 100);
                            _delay_ms(250);
                            gen_pwm(D0, 1000, 0);
                            gen_pwm(D1, 1000, 0);
                            gen_pwm(D2, 1000, 0);
                            gen_pwm(D3, 1000, 0);
                            _delay_ms(250);

                        }
                    }
                    }else{
                    gen_pwm(D3, 1000, 0);
                }
                }else{
                gen_pwm(D3, 1000, 0);
                gen_pwm(D2, 1000, 0);
            }
            }else{
            gen_pwm(D3, 1000, 0);
            gen_pwm(D2, 1000, 0);
            gen_pwm(D1, 1000, 0);
        }
        }else{
        gen_pwm(D3, 1000, 0);
        gen_pwm(D2, 1000, 0);
        gen_pwm(D1, 1000, 0);
        gen_pwm(D0, 1000, 0);
            }
        }
    }   
}
 else {
     // Время истекло! Повесить здесь
     for(;;)
     ;      // бесконечный цикл здесь останавливает дальнейшую обработку
    }
 }

, 👍0

Обсуждение

посмотрите пример кода BlinkWithoutDelay в Arduino IDE, @jsotola

Не похоже, что вы используете ядро Arduino. Какой фреймворк вы используете? Предоставляет ли он что-то похожее на millis()?, @Edgar Bonet

примечание: длинное выражение if излишне длинное... вы тестируете значения, которые уже были проверены, @jsotola

Мой университет разработал собственную плату, но на ней используется микроконтроллер atxmega256a3u. Я не знаю, предоставляет ли он что-то похожее на millis()., @Dennis de Kruijf

@DennisdeKruijf, это не Arduino. это собственная доска и библиотека. мы не можем вам помочь, @Juraj

Я могу использовать те же библиотеки, что и arduino, поэтому думаю, что это примерно та же идея. Но, может быть, я ошибаюсь. Я использую C для программирования с помощью программы Atmel Studio, и это похоже на ту же среду, что и arduino., @Dennis de Kruijf

Ваш отступ полностью перепутался, и, казалось бы, у вас несбалансированные фигурные скобки., @Edgar Bonet


1 ответ


2

Обратите внимание, что в среде Arduino функция main() уже предоставлена вам. Он вызывает вашу функцию void setup(void){ ... } один раз, затем зацикливается навсегда, вызывая вашу функцию void loop(void){ ... }. Любая функция может быть пустой, но должны присутствовать обе.

Не вдаваясь в особенности вашего кода, вот программа, которая соответствует соглашениям Arduino, и будет выполнять какую-то процедуру в течение 60 секунд, а затем зависнет, ничего не делая:

unsigned long EndTime;

void setup()
{
   // Любой код установки, который вам нужен, находится здесь.


   EndTime = millis() + (60*1000L);
}


void loop() {
   if( millis() < EndTime ){
      // Выполняйте свою обработку здесь
   }
   else {
      // Время истекло! Повесить здесь
      for(;;)
         ;      // бесконечный цикл здесь останавливает дальнейшую обработку
   }
}

Мои установочные коды — это режимы pin_modes, верно? а ниже все мое обработка?

Обновление:

Правильно. Поместите режимы вывода и все остальное, что нужно сделать один раз, в начале прогона в setup(). Все остальное идет в цикле(). Или, если вам удобнее писать всю программу, начиная с main() (как мы это делаем в других средах, отличных от Arduino), вы можете использовать функцию setup() точно так же, как и main(), и оставить loop() пустым. . Идея циклической функции заключается в том, что встроенные программы обычно не должны завершаться, пока на устройстве есть питание. Бывают случаи, когда это не совсем так, и у вас, кажется, есть один пример.

У меня есть удалить int main(void) из моего кода, когда я использую ваш код, верно?

Верно: среда Arduino предоставляет функцию main(), поэтому написание вашей собственной функции в этой среде приведет к ошибке множественного определения.

Обновление 2:

"WProgram.h" устарел. Вместо этого используйте: #include <Arduino.h>. Нет никакой функции с именем elapsedMillis(), только millis(). Для этого вам не понадобится оператор include или какие-либо другие стандартные или общие вещи: последовательный ввод-вывод, цифровой ввод-вывод, аналоговый ввод-вывод, определения контактов для конкретных плат и т. д. 'Arduino.h' тянет во всем этом. Ваш университет должен добавить описание собственной платы в файл описания платы Arduino.

(Но если вы/они не используете стандартные библиотеки Arduino, описания плат и т. д., то, возможно, вы несете ответственность за множество скрытых «хозяйственных операций». Это не то, что мы можем знать. ; вам, возможно, придется задать такие вопросы другим, более знакомым со средой программирования вашего университета. Я думаю, маловероятно, что они откажутся от существующих/рабочих ресурсов, но об этом следует помнить.)

,

Альтернативно, if (millis() >= 60000) exit(0);., @Edgar Bonet

Мои установочные коды — это pin_modes, верно? а все что ниже это моя обработка? У меня мало знаний о программировании ^^ . Мне нужно удалить int main (void) из моего кода, когда я использую ваш код, верно? @JRobert, @Dennis de Kruijf

проблема в том, что это не Arduino, поэтому ответ неприменим, @Juraj

Я сделал именно то, что вы сказали, и моя программа все еще работает нормально, за исключением функции millis(). Я добавил библиотеку #include "elapsedMillis.h", но функция millis() остается обычным текстом, поэтому моя программа не останавливается по истечении 60 секунд. Кроме того, он не может найти файл или каталог WProgram.h:. Может быть, вы знаете, как это исправить? @JRobert, @Dennis de Kruijf