Управление реле, датчик давления - токовая петля

Ponosov
Offline
Зарегистрирован: 05.08.2019

Приветствую всех читающих данную тему!

Полистав форум решил все таки создать тему т.к. оветы на все вопросы не нашел, а тут будет лечге все обьеденить.

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

Время на которое срабатывает реле зависит от показаний датчика давления (4-20 ма). Если показания меняются быстро - реле срабатывает с большей задержкой, если медленно - задержка увеличивается.

В идеале прикрутить экран с управлением от кнопок, но пока это в планах.

Набросал алогритм:

Этой мой второй проект в Ардуино, с программированием на Вы, поэтому прошу помощи.

Первый вопрос, как хранить в переменной показания которые были на датчике секунду назад?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

а сколько таких показаний надо хранить?

Ponosov
Offline
Зарегистрирован: 05.08.2019

Датчик один, одно показание за последнию секунду, и текущее показания что бы потом их сравнивать на сколько быстро меняется давление 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ponosov пишет:

Датчик один, одно показание за последнию секунду, и текущее показания что бы потом их сравнивать на сколько быстро меняется давление 

а как считываете? может тогда одной переменной и хватит, или тогда зарезервируйте две переменных

int d1, d1s
читаем в d1, сравниваем, сохраняем в d1s

Да, я не настоящий сталевар ежели что )))

Ponosov
Offline
Зарегистрирован: 05.08.2019

ua6em пишет:

Ponosov пишет:

Датчик один, одно показание за последнию секунду, и текущее показания что бы потом их сравнивать на сколько быстро меняется давление 

а как считываете? может тогда одной переменной и хватит, или тогда зарезервируйте две переменных

int d1, d1s
читаем в d1, сравниваем, сохраняем в d1s

Да, я не настоящий сталевар ежели что )))

 int sensorValue = analogRead(analogInPin);
 int currentPressure = map(sensorValue, 0, 1023, 0, 160);

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ponosov пишет:

Первый вопрос, как хранить в переменной показания которые были на датчике секунду назад?

А как хранить вообще что-либо в переменной ты знаешь?

В общем, как на парковке, зарезервировать место, оплатить хранение. Если срок превышен, доплатить.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ponosov пишет:

ua6em пишет:

Ponosov пишет:

Датчик один, одно показание за последнию секунду, и текущее показания что бы потом их сравнивать на сколько быстро меняется давление 

а как считываете? может тогда одной переменной и хватит, или тогда зарезервируйте две переменных

int d1, d1s
читаем в d1, сравниваем, сохраняем в d1s

Да, я не настоящий сталевар ежели что )))

 int sensorValue = analogRead(analogInPin);
 int currentPressure = map(sensorValue, 0, 1023, 0, 160);

тут одна переменная явно лишняя

 int currentPressure = map(analogRead(analogInPin) 0, 1023, 0, 160);

 

Ponosov
Offline
Зарегистрирован: 05.08.2019

ua6em пишет:

Ponosov пишет:

ua6em пишет:

Ponosov пишет:

Датчик один, одно показание за последнию секунду, и текущее показания что бы потом их сравнивать на сколько быстро меняется давление 

а как считываете? может тогда одной переменной и хватит, или тогда зарезервируйте две переменных

int d1, d1s
читаем в d1, сравниваем, сохраняем в d1s

Да, я не настоящий сталевар ежели что )))

 int sensorValue = analogRead(analogInPin);
 int currentPressure = map(sensorValue, 0, 1023, 0, 160);

тут одна переменная явно лишняя

 int currentPressure = map(analogRead(analogInPin) 0, 1023, 0, 160);

 

 

Ну да! Спасибо, всем кто решил откликнутся

Ponosov
Offline
Зарегистрирован: 05.08.2019

Ворота пишет:

Ponosov пишет:

Первый вопрос, как хранить в переменной показания которые были на датчике секунду назад?

А как хранить вообще что-либо в переменной ты знаешь?

В общем, как на парковке, зарезервировать место, оплатить хранение. Если срок превышен, доплатить.

 

Как хранить знаю, а как хранить то что было секунду назад  непойму((

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Ponosov пишет:

Ворота пишет:

Ponosov пишет:

Первый вопрос, как хранить в переменной показания которые были на датчике секунду назад?

А как хранить вообще что-либо в переменной ты знаешь?

В общем, как на парковке, зарезервировать место, оплатить хранение. Если срок превышен, доплатить.

 

Как хранить знаю, а как хранить то что было секунду назад  непойму((

добавьте переменную int oldPressure

Ponosov
Offline
Зарегистрирован: 05.08.2019

ua6em пишет:

Ponosov пишет:

Ворота пишет:

Ponosov пишет:

Первый вопрос, как хранить в переменной показания которые были на датчике секунду назад?

А как хранить вообще что-либо в переменной ты знаешь?

В общем, как на парковке, зарезервировать место, оплатить хранение. Если срок превышен, доплатить.

 

Как хранить знаю, а как хранить то что было секунду назад  непойму((

добавьте переменную int oldPressure

Добавил переменную int previousPressure, но как хранить в ней то что было секунду назад?

  unsigned long currentTime = millis();
  int currentPressure = map(analogRead(analogInPin) 0, 1023, 0, 160);
  int previousPressure;
  if (currentTime - previousTime > interval) {
    previousPressure = currentPressure;
    previousTime = currentTime;
  }

Предыдущие показания не хранит:

22:27:56.204 ->  currentTime = 409974 previousTime = 409974 currentPressure = 116 previousPressure = 116
22:27:56.727 ->  currentTime = 410501 previousTime = 409974 currentPressure = 117 previousPressure = 116
22:27:57.247 ->  currentTime = 411026 previousTime = 411026 currentPressure = 117 previousPressure = 117
22:27:57.764 ->  currentTime = 411552 previousTime = 411026 currentPressure = 117 previousPressure = 117
22:27:58.311 ->  currentTime = 412079 previousTime = 412079 currentPressure = 118 previousPressure = 118
22:27:58.831 ->  currentTime = 412605 previousTime = 412079 currentPressure = 118 previousPressure = 118
22:27:59.351 ->  currentTime = 413131 previousTime = 413131 currentPressure = 119 previousPressure = 119
22:27:59.868 ->  currentTime = 413658 previousTime = 413131 currentPressure = 119 previousPressure = 119
 
 
vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014
unsigned long currentTime = millis();
int currentPressure = map(analogRead(analogInPin) 0, 1023, 0, 160);
static  int previousPressure;
if (currentTime - previousTime > interval) {
		Serial.println(currentPressure);
		Serial.println(previousPressure);
  previousPressure = currentPressure;
  previousTime = currentTime;
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Ponosov пишет:

Как хранить знаю, а как хранить то что было секунду назад  непойму((

А Вы начните хранить сейчас, а через секунду оно и будет "то, что было секунду назад". Коньяк ведь тоже наливают в бочку сейчас, а пятилетней выдержки он через пять лет только становится.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

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

Ponosov
Offline
Зарегистрирован: 05.08.2019

vosara пишет:

unsigned long currentTime = millis();
int currentPressure = map(analogRead(analogInPin) 0, 1023, 0, 160);
static  int previousPressure;
if (currentTime - previousTime > interval) {
		Serial.println(currentPressure);
		Serial.println(previousPressure);
  previousPressure = currentPressure;
  previousTime = currentTime;
}

11:30:41.871 -> currentPressure 111 previousPressure 111
11:30:42.879 -> currentPressure 108 previousPressure 111
11:30:44.859 -> currentPressure 106 previousPressure 108
11:30:46.864 -> currentPressure 104 previousPressure 106
11:30:48.877 -> currentPressure 104 previousPressure 104
 
вот так показывает верно - когда вывод на порт внутри цикла, странно почему только значения с порта так плавают в состоянии покоя?(( может кондера на входе не хватает?
И счетчик не равномерно считает по 1 сек
Гриша
Offline
Зарегистрирован: 27.04.2014

Ponosov пишет:

 странно почему только значения с порта так плавают в состоянии покоя?(( может кондера на входе не хватает?

Ponosov
Offline
Зарегистрирован: 05.08.2019

Теперь непонятно как вынести значении переменной previousPressure за пределы цикла что бы сравнить его с текущим значением

Гриша
Offline
Зарегистрирован: 27.04.2014

Ponosov пишет:

Теперь непонятно как вынести значении переменной previousPressure за пределы цикла что бы сравнить его с текущим значением

Область видимости переменных

Этюды для начинающих: Память 3. Динамические и автоматические переменные

Этюды для начинающих: Память 2. Статические переменные.

Квалификатор static

Квалификатор volatile

Квалификатор const

SLKH
Offline
Зарегистрирован: 17.08.2015

Ponosov пишет:

vosara пишет:

unsigned long currentTime = millis();
int currentPressure = map(analogRead(analogInPin) 0, 1023, 0, 160);
static  int previousPressure;
if (currentTime - previousTime > interval) {
		Serial.println(currentPressure);
		Serial.println(previousPressure);
  previousPressure = currentPressure;
  previousTime = currentTime;
}

11:30:41.871 -> currentPressure 111 previousPressure 111
11:30:42.879 -> currentPressure 108 previousPressure 111
11:30:44.859 -> currentPressure 106 previousPressure 108
11:30:46.864 -> currentPressure 104 previousPressure 106
11:30:48.877 -> currentPressure 104 previousPressure 104
 
вот так показывает верно - когда вывод на порт внутри цикла, странно почему только значения с порта так плавают в состоянии покоя?
на глаз - не так уж они и плавают. в функции map используется целочисленное деление с присущим ему юмором. выведи необработанные analogRead().
 
Цитата:
(( может кондера на входе не хватает?
может, и не хватает. Никто, кроме тебя, не знает параметров датчика и схемы его подключения.
 
Цитата:
И счетчик не равномерно считает по 1 сек
попробуй заменить стр. 8 на "previousTime += interval;"
Гриша
Offline
Зарегистрирован: 27.04.2014

SLKH пишет:

Цитата:
И счетчик не равномерно считает по 1 сек
попробуй заменить стр. 8 на "previousTime += interval;"

ИМХО это не поможет, т.к. мне видится, что это кусок большого кода, где похоже есть еще и delay иначе получить такой разбег по времени просто не реально. А суперточность (в разумных МКшных пределах) достигается при испоьзовании таймеров и прерываний.