Программирование

Lemanade
Offline
Зарегистрирован: 29.02.2016

Доброго времени суток, господа. Хочу сразу предупредить что не силен в программирований. В общем столкнулся с такой задачей, что нужно установить обратную связь с частотником который управляет двигателем. Двигатель нагнетает воздух в трубу, а уже в трубе есть шарик. Который, естественно, поднимается вверх или опускается в зависимости от того как меняеться частота. 

Так же в трубе есть отверстия и что то вроде заслонки в ввиде диафрагмы фотоапарата. Таким образом при перекрываний одних из этих штук шарик поднимается. 

Задача в том чтобы заставить Ардуино снизить или повысить частоту чтобы ранне упомянутый шар стоял на месте.

Мое творение работает с ЦАПом так как аналоговые входы ПЧ реагирует только на 0-10В. И расчитывает положение шарика с помощью Ультрозвукового датчика дальности HС-SR501. Все устройства работают нормально, но возникла проблема в коде. 

После того как МК получает данные с датчика он решает повысить или понизить напряжение. Реализовал я это с помощью оператора for. Выглядит это так:

for (int i=level; dis<q; i++){  
        K = (byte(i));
        digitalWrite(2, bitRead(K, 7));
        digitalWrite(3, bitRead(K, 6));
        digitalWrite(4, bitRead(K, 5));
        digitalWrite(5, bitRead(K, 4));
        digitalWrite(6, bitRead(K, 3));
        digitalWrite(7, bitRead(K, 2));
        digitalWrite(8, bitRead(K, 1));
        digitalWrite(9, bitRead(K, 0));
        delay(500);
 }

 for (int i=level; dis>q; i--) {
        K = (byte(i));
        digitalWrite(2, bitRead(K, 7));
        digitalWrite(3, bitRead(K, 6));
        digitalWrite(4, bitRead(K, 5));
        digitalWrite(5, bitRead(K, 4));
        digitalWrite(6, bitRead(K, 3));
        digitalWrite(7, bitRead(K, 2));
        digitalWrite(8, bitRead(K, 1));
        digitalWrite(9, bitRead(K, 0));
        delay(500);
 }

После того как он проверяет условие и начинает повышать или понижать его уже не остановить. В идеале хотелось бы добиться чтобы МК после повышения значения на 1 еденицу снова мерил растояние шарика и проверял условие. Этого я добиться не смог. Прошу помощи у адекватных професионалов, которые объяснят как же мне этого добиться. Заранее спасибо! 

Полный код (если кому интересно) приведен ниже.

#define trigPin 10
#define echoPin 11
#define keyPin 12
#define diodPin 13
unsigned int K=0;
unsigned int Q;
long dur;
int dis;
int q=0;
 
void setup() {
//Распиновка
 Serial.begin(9600);
 pinMode(2, OUTPUT);
 pinMode(3, OUTPUT);
 pinMode(4, OUTPUT);
 pinMode(5, OUTPUT);
 pinMode(6, OUTPUT);
 pinMode(7, OUTPUT);
 pinMode(8, OUTPUT);
 pinMode(9, OUTPUT);
 pinMode(trigPin, OUTPUT);
 pinMode(echoPin, INPUT);
 pinMode(keyPin, INPUT);


}

void loop() {

// Начало Работы Датчика
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
 dur = pulseIn(echoPin, HIGH);
 dis = (dur/29.1)/2;
 dis = constrain(dis,0,50);
int level = map(dis,0,50,0,255);


 //Запоминание 

  if (keyPin, HIGH) {
  digitalWrite(diodPin, HIGH);
  delay(500);
  digitalWrite(diodPin, LOW);
  int q=level; 
 }
 
 //Условия
 
 for (int i=level; i<q; i++){  
        K = (byte(i));
        digitalWrite(2, bitRead(K, 7));
        digitalWrite(3, bitRead(K, 6));
        digitalWrite(4, bitRead(K, 5));
        digitalWrite(5, bitRead(K, 4));
        digitalWrite(6, bitRead(K, 3));
        digitalWrite(7, bitRead(K, 2));
        digitalWrite(8, bitRead(K, 1));
        digitalWrite(9, bitRead(K, 0));
        delay(500);
 }

 for (int i=level; i>q; i--) {
        K = (byte(i));
        digitalWrite(2, bitRead(K, 7));
        digitalWrite(3, bitRead(K, 6));
        digitalWrite(4, bitRead(K, 5));
        digitalWrite(5, bitRead(K, 4));
        digitalWrite(6, bitRead(K, 3));
        digitalWrite(7, bitRead(K, 2));
        digitalWrite(8, bitRead(K, 1));
        digitalWrite(9, bitRead(K, 0));
        delay(500);
 }
 

// Вывод данных на монитор
   Serial.print(dis);
   Serial.println("cm");
   

   delay(500);
 
 }

 

Logik
Offline
Зарегистрирован: 05.08.2014

if (keyPin, HIGH) -  ???!!!

После 50-й строки вообще ход мысли путаный. У Вас ЦАП - начните с схемы.

 

Lemanade
Offline
Зарегистрирован: 29.02.2016

Это можете игнорировать, нужна для работы с ПЧ. Видите ли МК должен отталкиваться от какой то высоты. После того когда я задал высоту (через регулировку частоты на ПЧ) я нажимаю кнопку и данная высота равняеться q и управление переходит к МК. Далее как видно в коде q и начальная дистанция сравнивается и далее выполняется код (добавляет +1 или -1)Просто я не могу заставить МК после каждого +-1 снова проверить условие. Для меня это очень сложно обьяснить это на словах. Так как начинаеться какой то когнетивный дессонанс. Так что если сильно будет нужно постараюсь донести свою мысль в ввиде блок-схемы чуть позже.

 

p.s. ЦАП работает идеально, схема впорядке.