Увеличение и уменьшение переменной

Constantstep

✩✩✩✩✩✩✩
10 Сен 2019
14
0
Привет всем! Не знаю как увеличить переменную с 0 до 100 за 10 сек и уменьшить со 100 до 0 за это же время

CSS:
#include <AccelStepper.h>


AccelStepper stepper1(1, 3, 4);

int z = 0; 

void setup()
{ 
  stepper1.setAcceleration(300); 
}

void loop(){


  stepper1.setMaxSpeed(z);
  stepper1.moveTo(10000);
  stepper1.run();
}
 
Изменено:

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Вот код, не совсем 100% , но вполне рабочий. надо чуть поиграть с ним. через 5 секунд после запуска будет увеличивать переменную A пропорционально времени. Правда в конце вместо 100 дает 99, но уж тут сам подумай, что сделать. может быть надо еще 0.5+ дописать перед 100.0, попробуй , округление еще никто не отменял

C++:
byte A=0;
uint16_t deltat=10000; // в миллисекундах
uint32_t starttime =5000;
uint32_t Ntime;



void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(A);
  Ntime=millis();
  if (((Ntime-starttime)>0)&&((Ntime-starttime)<deltat))
    {
      A=(byte)(100.0/(float)deltat*(float)(Ntime-starttime));
      };   
}
 
  • Лойс +1
Реакции: Constantstep

Constantstep

✩✩✩✩✩✩✩
10 Сен 2019
14
0
Вот код, не совсем 100% , но вполне рабочий. надо чуть поиграть с ним. через 5 секунд после запуска будет увеличивать переменную A пропорционально времени. Правда в конце вместо 100 дает 99, но уж тут сам подумай, что сделать. может быть надо еще 0.5+ дописать перед 100.0, попробуй , округление еще никто не отменял

C++:
byte A=0;
uint16_t deltat=10000; // в миллисекундах
uint32_t starttime =5000;
uint32_t Ntime;



void setup() {
  // put your setup code here, to run once:
   Serial.begin(9600);
}

void loop() {
  // put your main code here, to run repeatedly:
  Serial.println(A);
  Ntime=millis();
  if (((Ntime-starttime)>0)&&((Ntime-starttime)<deltat))
    {
      A=(byte)(100.0/(float)deltat*(float)(Ntime-starttime));
      };  
}
Спасибо за код, но у меня не получилось увеличивать со 100 до 200 и уменьшать.
 

Constantstep

✩✩✩✩✩✩✩
10 Сен 2019
14
0
@Старик Похабыч, Я нашел коды которые увеличивают и уменьшают переменную, только не получается сделать так чтобы после первого кода заработал второй.

C++:
int time = 30;      //время в секундах                  
int number = 100;   //количество изменений за время time
int z = 0;          //переменная которую увеличиваем
int segment;        //время между изменениями
unsigned long prev_time;


void setup()
{
  Serial.begin(9600);

  segment = (time*1000)/number;
  prev_time = millis();
}

void loop(){
  Serial.println(z);
  if (((millis()-prev_time) >= segment) && z <= number){  //увеличивает
    z++;
    prev_time = millis();
  }

  if (z == 100){
  if (((millis()-prev_time) >= segment) && z >= 0){       //уменьшает
    z--;
    prev_time = millis();
    }
  }
}
 
Изменено:

Александр Симонов

★★★★✩✩✩
2 Авг 2018
727
208
@Старик Похабыч, Я нашел коды которые увеличивают и уменьшают переменную, только не получается сделать так чтобы после первого кода заработал второй.

C++:
int time = 30;      //время в секундах                  
int number = 100;   //количество изменений за время time
int z = 0;          //переменная которую увеличиваем
int segment;        //время между изменениями
unsigned long prev_time;


void setup()
{
  Serial.begin(9600);
}

void loop(){
  Serial.println(z);
  if (((millis()-prev_time) >= segment) && z <= number){  //увеличивает
    z++;
    prev_time = millis();
  }

  if (z == 100){
  if (((millis()-prev_time) >= segment) && z >= 0){       //уменьшает
    z--;
    prev_time = millis();
    }
  }
}
Введи переменную "шаг приращения" и прибавляй её к z. Меняй "шаг приращения" на 1 или -1 в зависимости от того, дошёл z до верхней границы, или до нижней.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Спасибо за код, но у меня не получилось увеличивать со 100 до 200 и уменьшать.
м

byte A=0; это начальное значение переменной

uint16_t deltat=10000; время за которое меняет свое значение переменная А

uint32_t starttime =5000; - начальное время старта изменения переменной А, в моем случае сделано по наступлению 5-ой секунды работы программы. если по событию, то достаточно сделать starttime =millis(); при возникновении события (нажатие кнопки, сигнал от датчика)

для изменения начального и конечного значений А надо править эту формулу: она для А от 0 до 100
A=(byte)(100.0/(float)deltat*(float)(Ntime-starttime));

если менять от 100 до 200, то достаточно сдлеать
A=(byte)(100+(0.5+100.0/(float)deltat*(float)(Ntime-starttime)));
если А может быть любым, а изменение разное, то можно написать так
А_base=100; - запомнить начальное значение где то 1 раз!
Delta_A=100; там же ввести на сколько должна меняться величина А, можно со знаком минус, для уменьшения.
A=(byte)(A_base+(0.5+Delta_A/(float)deltat*(float)(Ntime-starttime)));

Можно методом тыка подобрать щаг приращения так, что бы значение менялось за 10 секунд , но код будет зависим от скорости работы, а если в цикле будет еще какая то обработка, то о какой либо точности можно забыть и забить.

Ну тот код делает практически то же что и мой.
 

Constantstep

✩✩✩✩✩✩✩
10 Сен 2019
14
0
@Старик Похабыч, Почему когда я ставлю от 400 до 600 то в переменной разные числа увеличиваются?
A=(byte)(400+(0.5+200.0/(float)deltat*(float)(Ntime-starttime)));
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,267
1,303
Москва
Вот тебе код, который увеличивает или уменьшает переменную А от 100 до 200 и обратно в течении 10 секунд. Что бы начать увеличение надо замкнуть 4-ый цифровой контакт на землю, что бы начать уменьшение замкнуть 6-ой контакт на землю. Операция изменения переменной не прерываема! т.е. если пошло увеличение, то уже до 200 .

C++:
int A = 100;
int  Up_A = 200;
int  Bot_A = 100;
short GrowSlow = 0; //0 А не меняется, 1 увеличивается, -1 уменьшается.
short OldGrow = 0; //0 А не меняется, 1 увеличивается, -1 уменьшается.
uint16_t deltat = 10000; // в миллисекундах
uint32_t starttime;
uint32_t Ntime;



void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(4, INPUT_PULLUP);
  pinMode(6, INPUT_PULLUP);
}

void loop() {
  //сделать 2 кнопки, при нажатии 1-ой если GrowSlow=0 , то сделать  GrowSlow=1;
  //сделать 2 кнопки, при нажатии 2-ой если GrowSlow=0 , то сделать  GrowSlow=-1;
  // сильно упрощенно с кнопками
  if (!digitalRead(4) && GrowSlow == 0 && A<200) GrowSlow = 1;
  if (!digitalRead(6) && GrowSlow == 0 && A>100) GrowSlow = -1;
  if (OldGrow != GrowSlow)
  {
    starttime = millis();
    OldGrow = GrowSlow;
  };
  if  (GrowSlow != 0)
  {
    uint32_t delta = millis() - starttime;
     // A=(byte)(100.0/(float)deltat*(float)(Ntime-starttime));
     int delta_a = (byte)((float)(Up_A - Bot_A) * (float)delta / (float)deltat);
    if (delta > deltat)
    {delta_a =Up_A - Bot_A;  
    };  
    if (GrowSlow < 0) A = Up_A - delta_a; else A = Bot_A + delta_a;
    if (delta > deltat){
      GrowSlow = 0;
      OldGrow=0;
      };
  };

  Serial.println(A);
}
 
  • Лойс +1
Реакции: Constantstep