Вставить переменную в новый цикл из старого

lopezmil
Offline
Зарегистрирован: 17.02.2015

Есть необходимость расчитать ряд формул в таком порядке:

1  a=u/t;

2  b=a*100;

3  y=b-100;

4 y=y+(a);

Вопрос в следующем: как получить переменную (а) в каждом новом цикле из предыдущего?

 

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

О каком цикле речь? Так и получайте по имени "a"

lopezmil
Offline
Зарегистрирован: 17.02.2015
void setup() {
  Serial.begin(9600);
}
void loop() {
  float a;
  float b;
  float u;
  float t;
  float y;
  a= u/t; 
  b=a*100;
  y=b-100;
  y=y+a;
}
В формуле y=y+a переменная а должна быть из предыдущего цикла, т.е. должна прибавлять к у прошлое значение а
  Забыл сказать, что переменную u я могу изменять сам с помощью потенциометра, а переменная t изменяется датчиком температуры. Не стал писать сюда весь код, задал лишь конкретный вопрос.
Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

в первой строке "float c". В сетапе добавляем строку c=u/t; Строку "y=y+a" меняем на "y=y+c; c=a;"

Зачем считать в цикле а если оно потом всё равно не используется.

lopezmil
Offline
Зарегистрирован: 17.02.2015

в таком виде, как сейчас ни приращения, ни убывания переменной у не происходит.

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Вы понимаете что у Вас никакого приращения и убывания и не будет пока у Вас y локально объявлена?

lopezmil
Offline
Зарегистрирован: 17.02.2015

Как я понял алгоритм работы скетча, сетап выполняется только при первом включении, а дальше выполняются только условия, описанные в лупе. Или я неправильно понял?

 

nevkon
Offline
Зарегистрирован: 20.01.2015

Сделайте объявление переходящих переменных вне процеду/функций/команд. Тогда они будут доступны из всей программы. Только учитывайте что такие переменные постоянно поедают память и нужно делать правильный баланс чтобы избежать переполнения RAM.

lopezmil
Offline
Зарегистрирован: 17.02.2015

Мне всего лишь нужно одну переменную "а" из каждого предыдущего цикла вставлять в новый цикл или новый loop, как понятней не знаю. Неужели такие сложности запомнить одну переменную и вставить её значение в следующий цикл работы программы?

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

3е сообщение прочитайте

lopezmil
Offline
Зарегистрирован: 17.02.2015
#include <OneWire.h>
OneWire ds(10);

void setup() {
  Serial.begin(9600);
  float c;
  float u;
  float t;
  c=u/t;
}
void loop() {
  //инициализация уставки температуры:
  float u = analogRead(0);
  u = map(u, 0, 1023, 0, 40);
  float c;  
  float a;
  float b;
 
  float t=26;
  float y;
  a= u/t; 
  b=a*100;
  y=b-100;
  y=y+c;
  c=a;
  Serial.println(y);
  Serial.println(u);
  Serial.println(t);
  Serial.println(" ");
  delay (3000);  
}

 Вот такой вид принял код. Вроде всделал, как вы сказали, но результат нулевой. 

pastry777
Offline
Зарегистрирован: 16.01.2014

вы снова переназначили float в лупе,зачем вы делаете эту глупость,из-за этого при каждом проходе цикла ваши переменные обнуляются...вместо float u = analogRead(0); нужно писать просто u = analogRead(0); и тд...удалите строки с 15 по 26 вообще,вместо 19 напишите просто t = 29;...все,хеппи енд..

 

вижу у вас там есть еще заморочка с "с",понимаю так что вы пытались сохранять через нее прошлое значение "а"...не могу вам помочь больше,так как не совсем понял суть происходящего в скетче вообще,что вы хотите от него,ну в смысле зачем вам те цифры которые вы получаете в расчете=)

NeiroN
NeiroN аватар
Offline
Зарегистрирован: 15.06.2013

Советую прочитать про "Область видимости переменных C++", если даже после этого понимание не придет - то нанять репититора который сможет "на пальцах" обьяснить что это такое. И как правильно это использовать.

msng
Offline
Зарегистрирован: 07.06.2012

попробуйте так

#include <OneWire.h>
OneWire ds(10);
  float c;
  float u;
  float t;
  float a;
  float b;
  float y;

void setup() {
  Serial.begin(9600);
  c=u/t;
}
void loop() {
  //инициализация уставки температуры:
  float u = analogRead(0);
  u = map(u, 0, 1023, 0, 40);
 
  t=26;
  a= u/t; 
  b=a*100;
  y=b-100;
  y=y+c;
  c=a;
  Serial.println(y);
  Serial.println(u);
  Serial.println(t);
  Serial.println(" ");
  delay (3000);  
}

 

pastry777
Offline
Зарегистрирован: 16.01.2014

тут можно/нужно либо удалить строку 4,либо подправить 16..

msng
Offline
Зарегистрирован: 07.06.2012

да, 16ую можно поправить, но смысл вроде как остается....

lopezmil
Offline
Зарегистрирован: 17.02.2015

Переменная а=u/t, это разность показаний между уставкой и действительной температурой. u соответственно уставка температуры, а t её действительное значение в этом цикле работы программы. Это вырезка из программы, я не стал для вопроса вписывать инициализацию датчика температуры. y- выходная мощность регулятора. А с должна стать поправочным коэффицентом для регулятора, который должен стремиться привести регулятор к 0 выходной мощности. Это обычный регулятор температуры.

msng
Offline
Зарегистрирован: 07.06.2012

ну так сделайте переменные глобальными....

bwn
Offline
Зарегистрирован: 25.08.2014

lopezmil пишет:
Переменная а=u/t, это разность показаний между уставкой и действительной температурой. u соответственно уставка температуры, а t её действительное значение в этом цикле работы программы. Это вырезка из программы, я не стал для вопроса вписывать инициализацию датчика температуры. y- выходная мощность регулятора. А с должна стать поправочным коэффицентом для регулятора, который должен стремиться привести регулятор к 0 выходной мощности. Это обычный регулятор температуры.

Опять за рыбу деньги, вы код вам предложенный попробовали?

lopezmil
Offline
Зарегистрирован: 17.02.2015

Пробовал. В том виде, как его предложили компилятор ругается. Как можно в сетапе написать формулу с переменными, которые ещё не объявлены? Я так понял поэтому он и не компилирует.

pastry777
Offline
Зарегистрирован: 16.01.2014

нет,не поэтому...переменным которым не назначено значение,компилятор по-умолчанию присваивает 0..

 

вот я тупо скопировал код выше и скомпилировал...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

всё объявленное выше лупа, сетапа, процедур-подпрограмм - видно всегда и всем....

Как можно в сетапе написать формулу с переменными, которые ещё не объявлены?

они объявлены ВЫШЕ и видны в сетапе

Я так понял поэтому он и не компилирует.

пришлите текст сообщения, а не что вы поняли.... если код урезанный, то инициализируйте все объявленные переменные чем-нибуть, хоть с потолка...

 

pastry777
Offline
Зарегистрирован: 16.01.2014

зачем вам среда IDE версии 1.6.0,у вас есть плата ардуино due??смените на версию пониже,мне кажется еще и отсюда ноги растут..

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015

Я думаю всё дело в контерстрайке :)

pastry777
Offline
Зарегистрирован: 16.01.2014

только Steam,только по-чесному=)))IDE больше вообще не пользуюсь,как видите юзаю Visual Studio,нарадоваться не могу...

Penni
Penni аватар
Offline
Зарегистрирован: 18.01.2015
float c;
float u;
float t;

void setup()
{
  Serial.begin(9600);
  u = 30;
  t = 24;
  c=u/t;
}

void loop()
{
  t++;
  float a = u/t; 
  float b =a*100;
  float y = b-100;
  y=y+c;
  c=a;
  Serial.println(y);
  Serial.println(c);
  delay (3000);  
}

Вот немного поправлено то что писал msng. Заданная температура 30, начальная с термометра 24. На каждом цикле температура с термометра увеличивается на 1. y расчитывается с использование значения a полученного на предыдущем цикле вычисления. В монитор выводится y и значение c которое будет использовано в следующем цикле.