Запустить цикл всего за 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(;;)
; // бесконечный цикл здесь останавливает дальнейшую обработку
}
}
1 ответ
Обратите внимание, что в среде 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
- Как загрузить код в atmega32u4?
- Почему я получаю разные результаты при компиляции одного и того же кода с разными ide?
- Связывание загрузчика Arduino В Atmel Studio
- Atmega328p с arduino без платы
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
посмотрите пример кода 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