Две функции не работают вместе.
- Войдите на сайт для отправки комментариев
Простите, за корявость и похабность кода - я пытаюсь учиться.
int pwm = 11; volatile unsigned long encoderSet = 0; //необходимое количество оборотов volatile unsigned long encoderValue = 0; //значение счетчика volatile unsigned long vvod_vitkov = 0; //количество витков volatile unsigned long accSpeed = 0; //начальное значение числа ускорения #define accPin A3 // потенциометр подключен к аналоговому входу 3 #define maxSpeedPin A2 // потенциометр подключен к аналоговому входу 2 volatile unsigned long maxSpeed = 0; //максимальная скорость двигателя (0-255) //volatile unsigned long time = 0; //volatile unsigned long time_old = 0; //volatile unsigned long sped = 0; int flag = 0; //void count(void); #include <Wire.h> #include <i2ckeypad.h> #define ROWS 4 #define COLS 4 #define PCF8574_ADDR 0x38 i2ckeypad kpd = i2ckeypad(PCF8574_ADDR, ROWS, COLS); volatile unsigned long mililiters = 0, kolichestvo = 0, promejutok = 0; void setup() { // encoderSet = vvod_vitkov * 4; //Количество импульсов на один полный оборот Serial.begin(9600); pinMode(2, INPUT); //Пин энкодера D2 attachInterrupt(0, count, FALLING); // 0 - таймер прерывания на D2, count - вызываемая функция при сработке таймера Serial.begin(9600); Serial.println("Starting..."); Wire.begin(); kpd.init(); } void loop() { keybord(); counterMotor(); } void keybord() { char key = kpd.get_key(); if (key) { delay(150); Serial.println(key); static int chislo = 0; static byte vvod = 0; if (key >= 'A' && key <= 'D') { chislo = 0; if (key == 'A') vvod = 1; if (key == 'B') vvod = 2; if (key == 'C') vvod = 3; } else if (key == '#' && vvod > 0) { if (vvod == 1) mililiters = chislo, Serial.print("mililiters = "), Serial.println(mililiters); if (vvod == 2) { kolichestvo = chislo; Serial.print("kolichestvo = "); encoderSet = kolichestvo * 4; Serial.println(kolichestvo); } if (vvod == 3) promejutok = chislo, Serial.print("promejutok ="), Serial.println(promejutok); chislo = 0; vvod = 0; } else if (key >= '0' && key <= '9') { if (vvod > 0) { chislo *= 10; chislo += key - 48; } } } } void count() { encoderValue++; } void perPwm (int percent) { maxSpeed = analogRead(maxSpeedPin); // читать аналоговый вход accSpeed = analogRead(accPin); maxSpeed = map(maxSpeed, 0, 1023, 70, 230); accSpeed = map(accSpeed, 0, 1023, 0, 50); percent = percent + accSpeed; percent = constrain(percent, 0, 100); maxSpeed = (maxSpeed * percent) / 100; analogWrite(pwm, maxSpeed); } void counterMotor() { if (encoderValue < encoderSet) { if (encoderValue < (encoderSet * 5) / 100 && encoderValue != 0) //Разгон до 5% { perPwm(20); if (flag==0) { Serial.println("5%"); ++flag; } } if (encoderValue > (encoderSet * 5) / 100 && encoderValue < (encoderSet * 10) / 100) //Разгон до 10% { perPwm(50); if (flag==1) { Serial.println("10%"); ++flag; } } if (encoderValue > (encoderSet * 5) / 100 && encoderValue > (encoderSet * 10) / 100 && encoderValue < (encoderSet * 20) / 100) //Разгон до 20% { perPwm(70); if (flag==2) { Serial.println("20%"); ++flag; } } if (encoderValue > (encoderSet * 5) / 100 && encoderValue > (encoderSet * 10) / 100 && encoderValue > (encoderSet * 20) / 100 && encoderValue < (encoderSet * 30) / 100) //Разгон до 30% { perPwm(100); if (flag==3) { Serial.println("30%"); ++flag; } } if (encoderValue > (encoderSet * 70) / 100 && encoderValue < (encoderSet * 80) / 100) //Остановка 70% { perPwm(70); if (flag==4) { Serial.println("70%"); ++flag; } } if (encoderValue > (encoderSet * 80) / 100 && encoderValue < (encoderSet * 90) / 100) //Остановка 80% { perPwm(50); if (flag==5) { Serial.println("80%"); ++flag; } } if (encoderValue > (encoderSet * 90) / 100) //Остановка 90% { perPwm(20); if (flag==6) { Serial.println("90%"); ++flag; } } } if (encoderValue >= encoderSet) { if (flag==7) { analogWrite(pwm, 0); Serial.println("END 100% namotano"); Serial.println("PWM = 0 STOP!"); ++flag; } } }
Отдельно keybord и counterMotor работают так как надо. Клавиатура выводит в сериал число после #.
counterMotor отрабатывает введенное как константу количество оборотов.
А вот вместе в одном коде - какая то беда.. ((
На двигателе 4 лепестка для датчика.
Клавиатура матричная подлючена через i2c.
Два переменника: максимальная скорость и скорость разгона.
Когда шторка закрывает датчик, после ввода числа и нажатия # - стартует только если толкну его и откроется шторка.
Бывает что наберет обороты определенные и крутит без остановки.
Заметил, что зависит от положения переменных резисторов.
подскажите косяки в коде, пожалуйста. Мучаюсь уже долгое время.. ((
Сериал не тормозит всю программу?
Я уже давно кроме Serial.begin(115200); других цыфр не использую.
Проверял реалтермом 921600 прекрасно работает. Но Ардуино ИДЕ не поддерживает
Да и на i2c не самая быстрая переферия....
Осталось непонятным, при совместной работе все println() выводят нормальные значения или нет? Какой конкретно из них выводит не то? Как понимаю, они у вас натыканы для отладки.
Ну и по косякам в коде. Условия прописаны вроде бы верно, но сильно избыточно. Не так просто понять какое из них срабатывает, а какое нет. Откройте для себя "вложенные условные операторы" или switch(), чтобы использовать предыдущую проверку и не повторять её заново. Но, можно оставить и так, вроде бы все условия верные.
Ну и переменная flag... я бы описал её в начале функции... да и её роль не очень понятна. Как "блокировщик" вывода - она будет работать только при последовательном прохождении ситуаций.
Ну и по сути encoderSet устанавливается keyword. При этом вы должны видеть его значение. При совместной работе - оно показывается? Попробуйте вывести в начале значение encoderValue до проверок...
counterMotor() я так понимаю надо вызывать после ввода всего числа? Поставьте условие что у вас ввод завершен.
Спасибо большое всем за ответы! сериал не тормозил в данном случае. Вывел в начале значение encoderValue до проверок... и офигел... считал мне со скоростью звука при том что двигатель стоял на месте. Оказалась причина в питании. Пин прерывания ловил помехи.
to Arhat109 - переменная flag так и задумывалась в начале для отладки. Что бы не дублировал мне в монитор одно и тоже.
"Условия прописаны вроде бы верно, но сильно избыточно." - подскажите, как проще переписать?
Число вводиться с клавиатуры разное (от 30 до 400), плавно разогнать в зависимости от введенного числа я додумался только считать процент от него и менять скорость. Хотел сделать разгон и остановку еще плавней, добавив еще условий. Но вообще тогда условий будет "гора". А вот как сделать еще "плавней" и упростить код - не могу сообразить.