Счетчик длинны намотанной верёвки

stupidDemon
Offline
Зарегистрирован: 31.01.2020

Приветствую! На работе для её упрощения хочу собрать станок для намотки верёвки. Нужно задать число оборотов двигателю (условно один оборот = одному метру) и по достижению заданного метража выключить мотор.

Другими словами Button1 = 5 (метрам) Button2 = 10 (метрам). Я нажимаю на Button 1 и движок начинает вращаться, обороты считываются герконом. После 5 оборотов двигатель останавливается и все значения сбрасываются

const uint8_t btn  = 2; // кнопка пуска мотора
const int ger = 4;  // геркон счётчик
const uint8_t motor = 3; // мотор
const uint8_t btn_7 = 5; //  кнопка 7 метров
int  count_7 = 0;
int  ger_old7 = 1;

int count = 0;// переменная для подсчёта срабатывания геркона
int  ger_old = 1;// предыдущее значение входа герконa для определения срабатывания


void setup() {
 pinMode(btn,  INPUT_PULLUP);
pinMode(motor,  OUTPUT); 
pinMode(ger,  INPUT_PULLUP);
pinMode(btn_7,  INPUT_PULLUP);
Serial.begin  (9600);
}

void loop() {

boolean BTN = !digitalRead(btn);//Кнопка на 5 оборотов
  if(BTN == 1)
  {
  digitalWrite(motor, 1);
  }

  if  ((digitalRead(ger)==LOW)&&(ger_old==1))

  {
  count = count + 1;
  Serial.println(count);
  }
  {
  ger_old = digitalRead(ger);
  delay (10);
  }
  if (count == 5) 
  {
  digitalWrite(motor,  0);
  count = 0;
  }

boolean BTN_7 = !digitalRead(btn_7);// код для кнопки 7 метров.
if (BTN_7 ==  1)
{  
  digitalWrite(motor, 1);
}

if  ((digitalRead(ger)==LOW)&&(ger_old7==1))
{
 count_7 = count_7 + 1;
 Serial.println(count_7);
 
 }
{ger_old7 = digitalRead(ger);
 delay (10);
}
 if (count_7 == 7) {digitalWrite(motor,  0);
  count_7 = 0;
 }
}

 

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Ну, делайте на здоровье. Вопрос- то в чем?

stupidDemon
Offline
Зарегистрирован: 31.01.2020

Проблема в том что счетчики дублируются. Если я нажму на кнопку 10 метров то отмотает она только 5

sadman41
Offline
Зарегистрирован: 19.10.2016

Странная хрень. Должна отматывать 7...

stupidDemon
Offline
Зарегистрирован: 31.01.2020

Я так понимаю, что мне надо изолировать счётчики друг от друга, но как это сделать не понимаю

b707
Offline
Зарегистрирован: 26.05.2017

stupidDemon пишет:

Проблема в том что счетчики дублируются. Если я нажму на кнопку 10 метров то отмотает она только 5

потому что у вас в коде нет кнопки 10 метров, а есть только 5 и 7 :)

b707
Offline
Зарегистрирован: 26.05.2017

stupidDemon пишет:

Я так понимаю, что мне надо изолировать счётчики друг от друга, но как это сделать не понимаю

Может проще оставить один счетчик, а число оборотов задавать через переменную? - тогда можно будет отматывать и 5, и 10ю и даже, о УЖАС - 22 метра

stupidDemon
Offline
Зарегистрирован: 31.01.2020

:) Ну хорошо. Когда я нажму на кнопку 5 всё будет ок. Мотор сделает 5 оборотов и остановится. Но когда я нажму на кнопку 7 то мотор сделает только 2 оборота, так как переменная из второго счетчика не обнулилась и сохранила значение 5

stupidDemon
Offline
Зарегистрирован: 31.01.2020

Вся фишка в том, что сложение мне не нужно. Нужно ограничить строго Чили мотков под разные изделия

b707
Offline
Зарегистрирован: 26.05.2017

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

stupidDemon
Offline
Зарегистрирован: 31.01.2020

Дык проблема в том, что я не понимаю как их изолировать:( Знаю конечный вид проекта, но вот с его исполнением проблемно

b707
Offline
Зарегистрирован: 26.05.2017

stupidDemon пишет:

Дык проблема в том, что я не понимаю как их изолировать:(

я вам уже ответил - оставьте один счетчик, тогда и изолировать не придется.

Вот у вас в строчке 38 число витков сравнивается с тупо забитым в код числом 5, а в строке 59 - с числом 7. Что мешает вместо цифры вставить переменную, например Х. Тогда при нажатии на кнопку "5 витков" вы будете присваивать Х = 5, а при нажатии кнопки "10 витков" - Х=10, а потом запускать единый код счетчика на любой метраж

Очевидно же!

stupidDemon
Offline
Зарегистрирован: 31.01.2020

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Зачем два счётчика? Достаточно одного. Вводим переменную - сколько оборотов надо сделать. Вводим два состояния - ждём ввода команд, крутимся. В loop смотрим - если мы в состоянии ввода команд, то анализируем кнопки. Если какая-то кнопка нажата - сохраняем в переменную кол-во оборотов, соответствующее этой кнопке, и переключаемся на состояние "крутимся". Как только прокрутились - переключаемся на состояние "ввод команд". В псевдокоде это выглядит примерно так:

typedef enum
{
	msWaitForCommands,
	msRotate
} MachineState;

uint32_t toRotate = 0;

MachineState state = msWaitForCommands;

void setup()
{
}

void loop()
{
	switch(state)
	{
		case msWaitForCommands:
		{
			if(button1.IsClicked())
			{
				toRotate = 5;
				motor.run();
				state = msRotate;
			}
			else
			if(button2.IsClicked())
			{
				toRotate = 10;
				motor.run();
				state = msRotate;
			}
		}
		break;

		case msRotate:
		{
			motor.update();

			if(motor.got360Rotation())
			{
				toRotate--;
				if(!toRotate)
				{
					motor.stop();
					state = msWaitForCommands;
				}
			}
		}
		break;
	}
}

Алгоритм, как видно - простейший. Только не спрашивайте - что это за button1, button2, motor и прочие функции - это псевдокод, демонстрирующий принцип работы алгоритма. Напишете вместо заглушек нужные куски кода - всё заработает. Но для этого надо учиться читать алгоритм.

b707
Offline
Зарегистрирован: 26.05.2017

stupidDemon пишет:

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

Не будут!

Вы глухой. что ли?? - я же сказал. оставьте один счетчик, зачем два.

b707
Offline
Зарегистрирован: 26.05.2017

stupidDemon - смотрите в чем ваша ошибка -

Вам нужно отмерять два размера, 5 и 7 метров, верно?  поэтому вы сделали в программе два счетчика - на пять и на семь.

А теперь подумайте, как бы вы поступили, если бы вам надо было отмерять 50 разных вариантов длины - например все целые метры от 1 до 50. Неужели бы Вы в коде делали бы 50 разных счетчиков? - это же бред...

Может этот пример вас убедит, что эта задача так не решается.