Где может быть ошибка кода?

Тема в разделе "Arduino & Shields", создана пользователем sanik, 8 окт 2013.

  1. Megakoteyka

    Megakoteyka Оракул Модератор

    rebounce() нужно вызывать после switch, иначе эффекта не будет.
     
  2. sanik

    sanik Гик

    Не понял это как?
     
  3. Megakoteyka

    Megakoteyka Оракул Модератор

    void loop()
    {
    switch()
    {
    // ...
    }
    bouncerBtnPlus.rebounce(100);
    }
    Смысл тут в том, чтобы вызывать эту функцию при каждом проходе loop(). Однократный вызов только по нажатию кнопки ни к чему не приведет.
     
    sanik нравится это.
  4. sanik

    sanik Гик

    Это получается вызов на весь цикл полностью и она функция будет работать до самого конца в каком бы месте не нажалась кнопка ? И прописывать на каждое нажатие не нужно. Спасибо за более понятные разьяснения!
     
  5. Megakoteyka

    Megakoteyka Оракул Модератор

    Не совсем так. Эта функция обновляет состояние внутренних переменных в объекте bouncerBtnPlus. Если функция update() обнаруживает, что кнопка не была отпущена в течение заданного количества времени, она повторно устанавливает в объекте флаг "кнопка нажата".
     
    Последнее редактирование: 30 окт 2013
    sanik нравится это.
  6. sanik

    sanik Гик

    Что то не хочет работать.. Ручной режим работает концевики пока не проверял перепаивать надо...
    Кнопки переключаются с огромной скоростью не успеваешь поймать режим убрал эти строки
    //bouncerBtnPlus.rebounce(500);
    // bouncerBtnMinus.rebounce(500);
    не помогает изменил интервал #define DEBOUNCE_INTERVAL 200 тоже не помогает почему идет нажатие с такой скоростью. Мне даже следующие шаги не проверить..
     
  7. sanik

    sanik Гик

    Код (Text):

    // время подавления дребезга кнопок, мс
    #define DEBOUNCE_INTERVAL 200

    // номера пинов для кнопок
    #define btn_SELECT 3
    #define btn_PLUS  7
    #define btn_MINUS  6
    #define btn_START  4
    #define btn_STOP 5 // перепаять со 2
    // номера пинов мотора
    #define pin_A 12
    #define pin_B 11
    #define pin_ENABLE 10
    // пин потенциометра
    #define pin_dist A0
    boolean stop1 = false;// переменная для хранения флага концевика 1
    boolean stop2 = false;// переменная для хранения флага концевика 2
    //пин реле
    #define pin_foc 8 // пин реле фокусировки
    #define pin_shot 9 // пин реле затвора
    #define pin_Rd A2 // пин датчика концевиков
    #define pin_Pit 13 // питание фотоинтерраптора
    int posInt = 0;  // пин фотоинтерраптора, Пин 2 внешнее прерывание 0
    //Таймеры
    unsigned long currentTime;
    unsigned long TimePause,TimeExposure,TimeLag;
    // максимальные значения
    #define MAX_POS_VALUE  4000// для положения каретки
    #define MAX_PAUSE_VALUE  60000// для времени паузы
    #define MAX_EXPOSURE_VALUE  20000// для времени экспозиции
    #define MAX_SHOT_VALUE  4000
    // шаги алгоритма
    typedef enum STEPS {
      STEP1_HELLO,
      STEP2_GET_POTS,
      STEP3_GET_POSITION,
      STEP4_GET_PAUSE,
      STEP5_GET_EXPOSURE,
      STEP6_GET_COUNT,
      STEP7_GET_START,
      STEP8_PAUSE,
      STEP9_EXP,
      STEP_10MOT
    };

    // текущий шаг алгоритма
    STEPS currentStep = STEP1_HELLO;

    // создаем "давилки дребезга" для кнопок
    Bounce bouncerBtnSelect(btn_SELECT, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnPlus(btn_PLUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnMinus(btn_MINUS, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStart(btn_START, DEBOUNCE_INTERVAL);
    Bounce bouncerBtnStop(btn_STOP, DEBOUNCE_INTERVAL);

    void setup()
    {
      Serial.begin(9600);
      // инициализация дисплея, включаем подсветку, очищаем экран
      lcd.init();
      lcd.backlight();
      lcd.clear();
      currentTime = millis();// считываем время, прошедшее с момента запуска программы
      TimePause = currentTime; // таймер паузы
      TimeExposure = currentTime; //таймер эксозиции
      TimeLag = currentTime;// таймер задержки
      attachInterrupt(posInt, handleInt0, RISING);
      pinMode (btn_SELECT, INPUT);
      pinMode (btn_PLUS, INPUT);
      pinMode (btn_MINUS, INPUT);
      pinMode (btn_START, INPUT);
      pinMode (btn_STOP, INPUT);
      pinMode (pin_A, OUTPUT);
      pinMode (pin_B, OUTPUT);
      pinMode (pin_foc, OUTPUT);
      pinMode (pin_shot, OUTPUT);
      pinMode (pin_Pit, OUTPUT);
    }


    int potValue  = 0; // значение потенциометра 1
    volatile int pulse = 0 ;//считаем импульсы с фотоинтерраптора
    int pauseValue = 0; // значение времени паузы
    int exposValue = 0; // значение времени экспозиции
    int countValue = 0; // значение количества кадров
    int shootValue = 0; //значение счетчика кадров
    int control = 0; //значение датчика концевиков
    int posValue  = 0; // значение положения каретки
    int a;//значение скорости мотора
    int LagValue = 20;// задержка на 20мс.


    void hello()
    {
      // установка курсора, печать надписи
      lcd.setCursor(5, 0);
      lcd.print("Hello");
      delay(200);
      lcd.setCursor(0, 1);
      lcd.print(" Slider Timelaps");
      delay(2000);
      lcd.clear();// очистка дисплея.
    }
    void handleInt0() // функция прерывания
    {
      pulse++; //при поступлении импульса увеличиваем счетчик на 1
    }
    void RunMotor1(byte a)
    {
      digitalWrite (pin_A, LOW);
      digitalWrite(pin_B, HIGH);
      analogWrite(pin_ENABLE,a);
    }
    void RunMotor2(byte a)
    {
      digitalWrite (pin_A, HIGH);
      digitalWrite(pin_B, LOW);
      analogWrite(pin_ENABLE,a);
    }

    void StopMotor()
    {
      digitalWrite(pin_ENABLE, 0);
      digitalWrite(pin_A, LOW);
      digitalWrite(pin_B, LOW);
    }
    boolean limit1()
    {
      control = analogRead(pin_Rd);
      return control>= 540 && control <= 550; //есть сигнал с концевика 1
    }
    boolean limit2()
    {
      control = analogRead(pin_Rd);
      return control>= 450 && control <= 460;
    }
    void loop()
    {
      // обновление состояния кнопки
      bouncerBtnSelect.update();
      bouncerBtnPlus.update();
      bouncerBtnMinus.update();
      bouncerBtnStart.update();
      bouncerBtnStop.update();

      switch(currentStep)
      {
        //bouncerBtnPlus.rebounce(500);
      // bouncerBtnMinus.rebounce(500);
      case STEP1_HELLO:
        hello();
        currentStep = STEP2_GET_POTS;
        break;

     

      case STEP6_GET_COUNT:
        lcd.setCursor(0,0);
        lcd.print("Setting shooting");
        if(bouncerBtnPlus.read() == HIGH && shootValue < MAX_SHOT_VALUE)
        {
          shootValue++;
          lcd.setCursor(0,1);
          lcd.print("num shots");
          lcd.print(shootValue);
        }
        if(bouncerBtnMinus.read() == HIGH && shootValue > 0)
        {
          shootValue--;
          lcd.setCursor(0,1);
          lcd.print("num shots");
          lcd.print(shootValue);
        }
        if(bouncerBtnSelect.read() == HIGH)
        {
          currentStep = STEP7_GET_START;//Переходим к шагу 7
        }
        break;

      case STEP7_GET_START:
        lcd.setCursor(0,0);
        lcd.print("Start shooting");
        if(bouncerBtnStop.read() == HIGH)
          lcd.setCursor(0,0);
        lcd.print("    Manyal  ");
        lcd.setCursor(0,1);
        lcd.print("Stop shooting");
        {
          currentStep = STEP2_GET_POTS;//Переходим к шагу 2
        }
        if(bouncerBtnStart.read() == HIGH)
        {
          currentStep = STEP8_PAUSE;//Переходим к шагу 8
        }
        break;
      case STEP8_PAUSE:
        lcd.setCursor(0,0);
        lcd.print("Start shooting");
        lcd.setCursor(0,1);
        lcd.print("shut shots");
        lcd.print(shootValue);
        currentTime = millis();// считываем время, прошедшее с момента запуска программы
        if (currentTime >= (TimePause + pauseValue)) // сравниваем текущий таймер с переменной TimePause
        {
          currentStep = STEP9_EXP;//Переходим к шагу 9
        }
        if(bouncerBtnStop.read() == HIGH)
          lcd.setCursor(0,0);
        lcd.print("    Manyal  ");
        lcd.setCursor(0,1);
        lcd.print("Stop shooting");
        {
          currentStep = STEP2_GET_POTS; //Переходим к шагу 2
        }
        TimePause = currentTime; // в currentTime записываем новое значение
        break;
     
    Последнее редактирование: 31 окт 2013
  8. sanik

    sanik Гик

    Код (Text):
     case STEP9_EXP:
        digitalWrite (pin_Pit, HIGH);// включаем питание фотоинтерраптора
        lcd.setCursor(0,0);
        lcd.print("Start shooting");
        lcd.setCursor(0,1);
        lcd.print("shut shots");
        lcd.print(shootValue);
        currentTime = millis();// считываем время, прошедшее с момента запуска программы
        digitalWrite (pin_foc, HIGH);
        if (currentTime >= (TimeLag + LagValue)) // сравниваем текущий таймер с переменной LagValue
        {

        }
        break;
      }
    }
     
    [/CODE]
     
    Последнее редактирование: 31 окт 2013
  9. Megakoteyka

    Megakoteyka Оракул Модератор

    Чтобы понять, как работает кусок кода, проверяйте работу именно этого куска кода.
    Напишите короткую прошивку, в которой по нажатию кнопки увеличивается счетчик и выводите значение счетчика в монитор. Добавьте rebounce и посмотрите, что из этого получится, затем делайте выводы. Экспериментируйте с кодом, смотрите, как он меняет свое поведение.
    Вы пытаетесь написать сразу всю прошивку, не понимая языка и основных принципов - так ничего не получится, об этом уже не раз говорили. Придется либо потратить время на обучение, либо так и будете бесконечно наугад править код. В голове должно быть ясное понимание того, что делает каждая строка кода, каждая конструкция языка, каждая ветка алгоритма. Иначе программирование превращается в блуждание по ночному лесу с завязанными глазами, как это происходит сейчас.
     
  10. sanik

    sanik Гик

    Вобщем я все понял, зря я затеял написание кода все снова, еще до кучи убил месяц времени... Если это не мое то оно и не дано понять.. Все проект забрасываю достало уже эта возня неизвестно с чем буду копить средства на что то готовое Жалко потраченного времени и средств...:(:confused:
     
  11. sanik

    sanik Гик

    Что же вы молчали!!! Я тут мучался почти месяц, наладил кнопки, а в итоге код вобще не рабочий, отлично вы мне помогли время убить:mad:!!!!
     
  12. Megakoteyka

    Megakoteyka Оракул Модератор

    Никто не молчал, кучу раз советовали разобраться и подучить язык. Вы и сами неоднократно говорили, что мешает незнание языка и малый опыт.
    Бросать ничего не нужно! Нужно решить каждую маленькую задачку отдельно, это гораздо проще. А Вы пытаетесь сразу написать весь код. Меньше эмоций, больше терпения!
    Возьмите справочник по языку, пользуйтесь им при написании кода.
    В последней версии у Вас опять какие-то непонятные скобки:
    Код (Text):
    lcd.print("Stop shooting");
        {
          currentStep = STEP2_GET_POTS;//Переходим к шагу 2
        }
    Зачем они здесь? Какую функцию выполняют? Проверьте код с книжкой по С++ в руках и многое станет понятней.
    Еще пример:
    Код (Text):
    if(bouncerBtnPlus.read() == HIGH && posValue < MAX_POS_VALUE)
        {
          bouncerBtnPlus.rebounce(100);
        }
    Почему Вы сначала не посмотрели пример использования библиотеки bounce? Сразу пытаетесь применить новую для себя функцию, не потратив даже немного времени на попытку понять, что она делает и как работает. Вставлять готовые куски кода, не разбираясь в них - плохой путь, Вы сами должны это понимать. Проверить работу библиотеки на коротеньком скетче - дело получаса времени, зато разберетесь на практике и потом сможете применять библиотеку правильно.

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

    sanik Гик

    Один говорит здесь не нужны скобки другой говорит скобки поставь смотрел и не раз пример использования библиотеки bounce толку от этого даже в отдельной теме задавал вопрос где можно русскоязычное руководство по библиотеке найти... Говорю же мне этого не понять Лучше человеку заплачу за работу я уже договорился... Просто возмущает наша долбаная реклама все просто и легко купите и делайте что хотите а в итоге ни инструкций ничего русскоязычного прислали кусок железа делай с ним что хочешь как всегда развод чистой воды..
     
  14. Megakoteyka

    Megakoteyka Оракул Модератор

    Я программирую 14 лет и могу с уверенностью сказать: у Ардуино действительно очень низкий порог вхождения. Научиться программировать классическими методами в разы сложнее и требует несравнимо больше времени. Все относительно. Посудите по себе - Вам удалось, не имея навыков в программировании, практически не зная языка, запрограммировать не самую простую установку. Ведь, кроме нескольких мест, у Вас все работает как надо! Усидчивости не хватает только. Хотите все и сразу.
    Обычно сперва пробую моргать светодиодом, потом выводить текст на дисплей, потом крутить мотор, потом комбинировать первое со вторым и третьим, ставить эксперименты и таким образом учиться составлять алгоритмы на практике. А Вы сразу бросились писать большую программу.
    Если каждый шаг алгоритма запрограммировать в виде отдельного скетча, задача окажется в разы проще. Одним словом, нужно двигаться от простого к сложному.
    Русскоязычного материала, кстати, навалом. Куча форумов, посвященных программированию контроллеров и просто программированию, книги, статьи, готовые проекты с исходниками и схемами - материала столько, что проще самому всему научиться, чем весь этот материал освоить :)
     
  15. sanik

    sanik Гик

    Моя усидчивость продолжалась с января прошлого года! Сколько можно ещё? Мне достали эти бессоные ночи итак уже хожу как зомби, не с меня довольно!!!!
     
  16. Festour

    Festour Нерд

    Имхо, но это не уважение к помощи Megakoteyka'и, Union'a и других форумчан которые вам помогали. Да *censored* вы хотите опять бросить ваш проект в практически шаге от конца?!? Будьте последовательны блин!
     
  17. sanik

    sanik Гик

    Я благодарен за помощь Megakoteyka' lerik2703 и, Uniхon И воспринимайте как хотите но проект закрыт, у меня действительно нет даже физических сил так как так как месяцы без нормального сна сказались на моем здоровье. Реально сейчас нахожусь в больнице с давлением.
     
  18. sanik

    sanik Гик

    Если человеку не дано понять, то бесполезно что либо делать, я попытался но увы....
     
  19. Unixon

    Unixon Оракул Модератор

    А что сейчас то не работает?
     
  20. sanik

    sanik Гик

    Да вообще ничего не работает кроме ручного режима. В третьем режиме каретка не паркуется а просто дергается , 8 ого и 9 режима нет, 10 режим запускает двигатель на неопределенное расстояние, останавливается и все. Остальное вообще не работает.