Счетчик длинны намотанной верёвки
- Войдите на сайт для отправки комментариев
Вс, 02/02/2020 - 22:00
Приветствую! На работе для её упрощения хочу собрать станок для намотки верёвки. Нужно задать число оборотов двигателю (условно один оборот = одному метру) и по достижению заданного метража выключить мотор.
Другими словами 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;
}
}
Ну, делайте на здоровье. Вопрос- то в чем?
Проблема в том что счетчики дублируются. Если я нажму на кнопку 10 метров то отмотает она только 5
Странная хрень. Должна отматывать 7...
Я так понимаю, что мне надо изолировать счётчики друг от друга, но как это сделать не понимаю
Проблема в том что счетчики дублируются. Если я нажму на кнопку 10 метров то отмотает она только 5
потому что у вас в коде нет кнопки 10 метров, а есть только 5 и 7 :)
Я так понимаю, что мне надо изолировать счётчики друг от друга, но как это сделать не понимаю
Может проще оставить один счетчик, а число оборотов задавать через переменную? - тогда можно будет отматывать и 5, и 10ю и даже, о УЖАС - 22 метра
:) Ну хорошо. Когда я нажму на кнопку 5 всё будет ок. Мотор сделает 5 оборотов и остановится. Но когда я нажму на кнопку 7 то мотор сделает только 2 оборота, так как переменная из второго счетчика не обнулилась и сохранила значение 5
Вся фишка в том, что сложение мне не нужно. Нужно ограничить строго Чили мотков под разные изделия
если вы сами решили, как надо делать - непонятно. зачем вы тут вопросы задаете. Делайте, как знаете
Дык проблема в том, что я не понимаю как их изолировать:( Знаю конечный вид проекта, но вот с его исполнением проблемно
Дык проблема в том, что я не понимаю как их изолировать:(
я вам уже ответил - оставьте один счетчик, тогда и изолировать не придется.
Вот у вас в строчке 38 число витков сравнивается с тупо забитым в код числом 5, а в строке 59 - с числом 7. Что мешает вместо цифры вставить переменную, например Х. Тогда при нажатии на кнопку "5 витков" вы будете присваивать Х = 5, а при нажатии кнопки "10 витков" - Х=10, а потом запускать единый код счетчика на любой метраж
Очевидно же!
Результат будет точно такой же, так как число витков определяется с помощью геркона и данные будут поступать одновременно в оба счётчика
Зачем два счётчика? Достаточно одного. Вводим переменную - сколько оборотов надо сделать. Вводим два состояния - ждём ввода команд, крутимся. В 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 и прочие функции - это псевдокод, демонстрирующий принцип работы алгоритма. Напишете вместо заглушек нужные куски кода - всё заработает. Но для этого надо учиться читать алгоритм.
Результат будет точно такой же, так как число витков определяется с помощью геркона и данные будут поступать одновременно в оба счётчика
Не будут!
Вы глухой. что ли?? - я же сказал. оставьте один счетчик, зачем два.
stupidDemon - смотрите в чем ваша ошибка -
Вам нужно отмерять два размера, 5 и 7 метров, верно? поэтому вы сделали в программе два счетчика - на пять и на семь.
А теперь подумайте, как бы вы поступили, если бы вам надо было отмерять 50 разных вариантов длины - например все целые метры от 1 до 50. Неужели бы Вы в коде делали бы 50 разных счетчиков? - это же бред...
Может этот пример вас убедит, что эта задача так не решается.