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

Тема в разделе "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 режим запускает двигатель на неопределенное расстояние, останавливается и все. Остальное вообще не работает.