Проверьте код.

Артем123

✩✩✩✩✩✩✩
10 Фев 2019
1
0
Добрый вечер.
Не буду расписывать ,что я новичек,это и так понятно, для тех кто что то сделал, мои вопросы покажутся....глуповатыми. Но все же.
Вроде вот это работает:
C++:
#include <Servo.h>

Servo gopa;

void setup() {
 gopa.attach(3);

}

void loop() {
  gopa.write(115); //начальное положение
  delay(900000); //время между срабатываниями 15 минут
  gopa.write(140);
  delay(500);  //

}

Но я не совсем понимаю,как работает millis.
Поэтому прошу,отредактировать мой рабочий коТ на millis.И объяснить каким нибудь деревенско простым,как его использовать.
Я не совсем ленивый,поэтом я попробовал написать сам.Но так как я не понимаю,как работает millis,то не уверен,что это правильно. Если не сложно отредактируете/проверьте.
C++:
#include <Servo.h>;
unsigned long last_time;

Servo gopa;

void setup() {
  gopa.attach(3);

}

void loop() {
  gopa.write(115); //начальное положение
{ if (millis() - last_time > (unsigned long) 25 * 60 * 1000)  //время между срабатываниями 25 минут
      gopa.write(140);
      last_time = millis();
}
     { if (millis() - last_time > 500);
      gopa.write(115);
}
}
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
149
Но я не совсем понимаю,как работает millis.
внутри фреймворка есть скрытый код, который использует аппаратный таймер контроллера, который автоматом настраивается тем скрытым кодом
там есть глобальная переменная, куда прибавляется по единице каждую миллисекунду

через примерно 50 дней переменная переполнится

счетчик этот начинает автоматом считать с момента подачи питания и когда ты вызываеш эту функцию, то в твою переменную запишется количество миллисекунд со старта контроллера
через какое-то время если ты еще раз вызовеш функцию, то будет записано еще бОльшее число

если вычесть одно из другого, то получим время с момента выполнения куска кода

millis() - last_time > (unsigned long) 25 * 60 * 1000)
вот тут и вызываем эту функцию прямо сейчас минус время в переменной с последнего раза
далее сравниваем с большим числом (количество миллисекунд в 25 минутах)

и потом снова обновляем
last_time = millis();
чтобы сравнить эту переменную в куске кода выше

там еще между фигурными скобками пропущено слово else

для упрощения написания кода есть библиотека https://alexgyver.ru/gyvertimer012/
она позволит выполнять разные куски кода через заданные промежутки времени, организуя как бы мультизадачность
 
  • Лойс +1
Реакции: Артем123

Артем123

✩✩✩✩✩✩✩
10 Фев 2019
1
0
для упрощения написания кода есть библиотека https://alexgyver.ru/gyvertimer012/
она позволит выполнять разные куски кода через заданные промежутки времени, организуя как бы мультизадачность
Плюс минус понял спасибо.
Для того что бы пользоваться библиотекой-нужно разобраться в основных задачах,что бы прям ПОНИМАТЬ:),как работает(по крайней мере для меня.)Да,библиотека упрощает "общение"
Я немного изменил вот так наверное правильно.
C++:
unsigned long last_time;

Servo gopa;

void setup() {
  gopa.attach(3);

}

void loop() {
  gopa.write(115); //начальное положение
{ if (millis() - last_time > (unsigned long) 25 * 60 * 1000)  //время между срабатываниями 25 минут
      gopa.write(140);
       if (millis() - last_time > 500);
      gopa.write(115);
      last_time = millis();
}
}



код не работает...что то не так
 
Последнее редактирование:

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
149
чтобы понимать, как должен работать твой код, нам надо понимать
задачу в целом
что должен делать конкретный код
что именно он не так делает и в каком месте
 

Артем123

✩✩✩✩✩✩✩
10 Фев 2019
1
0
чтобы понимать, как должен работать твой код, нам надо понимать
задачу в целом
что должен делать конкретный код
Сервопривод из положения 1 (угол 115) поворачивает против часовой стрелки в положение 2(угол 140) один раз в 25 минут
задерживается в положении 2 на 0,5 секунды и возвращается обратно в положение 1

что именно он не так делает и в каком месте
код "переделанный кот"-просто ничего не делает
код "КОТ" из первого поста работает как и задумывалось,но нужно его переписать,используя millis.Говорят,постигнув millis я автоматически стану хацкером всеяруси и мне откроется дзен космического пространства.
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
149
постигнув millis я автоматически стану хацкером всеяруси и мне откроется дзен космического пространства.
ну типа да, но проще использовать готовую библиотеку и сделать код читаемым

в твоем коде лишние фигурные скобки перед иф
 

kalobyte

★★★✩✩✩✩
1 Янв 2020
725
149
я говорю про этот
C++:
void loop() {
  gopa.write(115); //начальное положение
{ if (millis() - last_time > (unsigned long) 25 * 60 * 1000)  //время между срабатываниями 25 минут
      gopa.write(140);
      last_time = millis();
}
     { if (millis() - last_time > 500);
      gopa.write(115);
}
}
должно быть так
C++:
void loop() {
  gopa.write(115); //начальное положение
     if (millis() - last_time > (unsigned long)25 * 60 * 1000)  //время между срабатываниями 25 минут
     {
        gopa.write(140);
        last_time = millis();
     }

    if (millis() - last_time > 500);
        gopa.write(115);
       
}
}
 

Артем123

✩✩✩✩✩✩✩
10 Фев 2019
1
0
@Артем123, Ну вот у меня тоже дергается привод в конвульсиях... напряжение питания упало до 4.5
потому,что код не правильный
код постоянно выполняет вот эту строчку
if (millis() - last_time > 500);
gopa.write(115);
gopa.write(115); //начальное положение

а до задуманной функции не доходит
 
Последнее редактирование: