Мне нужна помощь с кодом для моего автоматического компрессора мусорного бака

Вот моя проблема, я работаю над автоматическим компрессором мусорного бака. Когда мусор окажется рядом с датчиком, сработает механизм компрессора. Я использую Arduino Uno в качестве контроллера, оконный двигатель переменного тока 12 В, драйвер двигателя L298N, аккумулятор переменного тока 12 В, ультразвуковой датчик и 2 светодиодных индикатора. Блок-схема выглядит следующим образом: датчик определяет наличие мусора в мусорном баке, если мусора нет, то двигатель не будет вращаться. Если есть мусор, то двигатель начнет вращаться в течение 20-30 секунд, а после того, как двигатель перестанет вращаться, он остановится на 5 секунд, прежде чем вернуться в исходное положение. Есть 2 светодиодных индикатора, зеленый индикатор указывает на то, что двигатель не вращается, а красный светодиод указывает на то, что двигатель используется. На данный момент я могу запрограммировать мотор так, чтобы он вращался в одном направлении без команды на остановку.

const int trigpin = 11;
const int echopin = 10;
int enA = 4;
int SPEED = 250;
int motordirection1 = 3;
int motordirection2 = 2; 
int duration = 0;
int distance = 0;

void setup(){
  pinMode (trigpin, OUTPUT);
  pinMode (echopin, OUTPUT);
  pinMode (enA, OUTPUT);
  pinMode (motordirection1, OUTPUT);
  pinMode (motordirection2, OUTPUT);
  pinMode (trigpin, OUTPUT);
  pinMode (echopin, INPUT);

}

void loop(){
  digitalWrite (trigpin, LOW);
  delayMicroseconds (2);
  digitalWrite (trigpin, HIGH);
  delayMicroseconds (10);
  digitalWrite (trigpin, LOW);

  duration = pulseIn (echopin, HIGH);
  distance = duration*0.034/2;

  if (distance < 1){
  digitalWrite (enA, 0);
  digitalWrite (motordirection1, LOW);
  digitalWrite (motordirection2, LOW);
  }
  else if (distance > 2 && distance <25){
  digitalWrite (enA, SPEED);
  digitalWrite (motordirection1, HIGH);
  delay (10);
  digitalWrite (motordirection2, LOW);
  delay (50);
  digitalWrite (motordirection1, LOW);
  digitalWrite (motordirection2, LOW);
  }
  else if (distance > 15){
  digitalWrite (enA, SPEED);
  digitalWrite (motordirection1, LOW);
  delay (10);
  digitalWrite (motordirection2, HIGH);
  delay (50);
  digitalWrite (motordirection1, LOW);
  digitalWrite (motordirection2, LOW);
  }
}

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

РЕДАКТИРОВАТЬ: я внес изменения в код, и он работает, но теперь проблема в том, что двигатель движется только в одном направлении, когда датчик что-то обнаруживает, но после того, как он выходит за пределы диапазона, двигатель не вращается обратно.

, 👍-1

Обсуждение

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

возвращение в исходное положение... как узнать положение?, @jsotola

PMF - пока я могу написать 2 отдельные программы. Первая программа - когда программа запущена, двигатель начнет вращаться до тех пор, пока программа не будет отключена. Вторая программа заключается в обнаружении с помощью ультразвукового датчика. По задаче видно, что я некомпетентен в программировании, так как начал программировать только в августе этого года. Так что да, я не очень опытен в этом вопросе, @Atek

jsotola - из вопроса, который я разместил, двигатель начнет вращаться в любом направлении в течение 20-30 секунд, затем он просто повернется на 20-30 секунд в направлении, противоположном тому, когда он был запущен., @Atek

@ Atek, разве ты не знаешь, что двигатель замедляется, когда работает?, @jsotola

@jsotola этот проект все еще находится на стадии тестирования, поэтому мне нужно подтверждение, подходит ли написанный мной код или нет. Я не уверен, что вы имеете в виду под замедлением двигателя, уточните, @Atek

у вас нет опыта работы с машинами? ... как насчет вас, вы двигаетесь так же быстро, когда несете тяжелый вес?, @jsotola

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

@jsotola я попробую закодировать то, что ты только что сказал, @Atek


1 ответ


2

Вы писали:

Блок-схема выглядит следующим образом [...]

Вместо блок-схемы вы должны представлять свою систему как конечный конечный автомат и нарисуйте его диаграмму состояний. Внешне диаграмма состояний может выглядеть как блок-схема, но она некоторые специфические свойства:

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

Вот диаграмма состояний, которая может представлять вашу систему:

Диаграмма состояния автоматического компрессора мусорного бака

На этой диаграмме действия неявны (потому что я ленив), но вы может захотеть записать их явно. Например, на переходе IDLE → MOVING_FORWARD двигатель должен быть запущен, а на следующем переход (MOVING_FORWARD → WAITING) должен быть остановлен.

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

После того как у вас есть диаграмма состояний, следующим шагом будет... ее отладка! это необходимо выполнить эту отладку до того, как вы начнете писать какие-либо строка кода. На этом этапе я уже могу заметить пару проблем:

  • Один переход обусловлен тем, что «компрессор» достигает своего дома. должность. Это означает, что вам понадобятся некоторые средства для обнаружения этого событие, например конечную остановку.
  • После сжатия некоторого мусора... в мусорном ведре все еще есть мусор. Тогда после перехода MOVING_BACK → IDLE будет мусор обнаружено, система немедленно перейдет в режим MOVING_FORWARD, и он застрянет в бесконечном цикле.

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

,

Я постараюсь понять, а затем постараюсь реализовать, @Atek