После такого вопроса меня нужно расстрелять!!))

Тема в разделе "Arduino & Shields", создана пользователем Motrosoff, 7 май 2017.

  1. Motrosoff

    Motrosoff Гик

    Ребят привет! УВерен, что это до банальности просто, НО я не пойму логику.......почему она не поворачивается на 90 градусов как в коде после нажатия кнопки...??? Там строчка есть serv.write(90); почему она выполняется без нажатия кнопки...подскажите куда внимание обратить, я новичок и мне 29))) и я только начинаю....) подскажите...! Задумка простая...нажал-отпустил кнопку, серва на 90 повернулась и стоит на месте....и всё! :rolleyes: а что то она вперёд паровоза, серва включилась...
    Код (C++):
    #include <Servo.h>
    Servo serv;
    int bat = 5;
    boolean butt_flag = 0;
    boolean butt;
    boolean serv_flag = 0;
    unsigned long last_press;
    void setup() {
      pinMode(bat, INPUT_PULLUP);
      serv.attach(7);
    }
    void loop() {
      butt = !digitalRead(bat); // считать текущее положение кнопки
     
      if (butt == 1 && butt_flag == 0 && millis() - last_press > 100) {
        butt_flag = 1;
        serv_flag = !serv_flag;
        serv.write(90);
        last_press = millis();
      }
      if (butt == 0 && butt_flag == 1) {
        butt_flag = 0;
       
      }
    }
     
    NO_NAME нравится это.
  2. Motrosoff

    Motrosoff Гик

    Этот код я взял с примера "нажал-отпустил, светодиод горит, нажл-отпустил перестал гореть" тут в коде наверное и подтяжка внутреннего резистора не нужна?
     
  3. ostrov

    ostrov Гуру

    В коде много лишнего и не делается так выбор или-или в двух разных условиях.

    Из вопроса не понятно что должно делаться и что делается. По коду при нажатии кнопки серва уходит в 90 и там остается, потому что команды на другой угол нет. Так и задумано?
     
    Motrosoff нравится это.
  4. mcureenab

    mcureenab Гуру

    Код (C++):
    #include <Servo.h>

    Servo serv;
    const uint8_t bat = 5;
    bool butt_flag = false;
    unsigned long last_press = 0;

    void setup()
    {
      pinMode(bat, INPUT_PULLUP);
      serv.attach(7);
    }

    void loop()
    {
      bool butt = digitalRead(bat) == LOW; // считать текущее положение кнопки
      if ( butt && !butt_flag && millis() - last_press > 100 ) {
        butt_flag = true;
        serv.write(90);
        last_press = millis();
      }
      if ( !butt && butt_flag ) {
        butt_flag = false;
        last_press = millis();
      }
    }
     
     
    Последнее редактирование: 7 май 2017
    Motrosoff нравится это.
  5. ostrov

    ostrov Гуру

    Ничего кроме компактности не поменялось. Флаг зачем вообще?
     
    Motrosoff нравится это.
  6. mcureenab

    mcureenab Гуру

    Не всё сразу.
     
    Motrosoff нравится это.
  7. mcureenab

    mcureenab Гуру

    Чтобы действие не происходило при удержании кнопки.
     
    Motrosoff нравится это.
  8. ostrov

    ostrov Гуру

    Его и не будет, как стояло 90 так и останется, разве что время сэкономить на команду. И вообще if - else тут напрашивается по любому. Ну и самое главное: где реакция на отпускание кнопки?
     
    Motrosoff нравится это.
  9. Motrosoff

    Motrosoff Гик

    Ну флаг был из примера, где при нажатии диод горит и при повторном нажатии он гаснет...!! Вы мне подскажите, за меня делать не нужно, я сам, куда и как правильно серво подставить, что бы она на 90 градусов повернулась(или сколько угодно) и там застыла до повторного нажатия, а после повторного нажатия вернулась? Я хочу логику понять....т если можно самым простым языком...!!!
     
  10. Motrosoff

    Motrosoff Гик

    Привет..!!) какие дела, я помню как ты мне помог..спасибо, а ты наверное забыл)))
     
  11. ostrov

    ostrov Гуру

    Тогда нужен флаг состояния сервы, который будет инвертироваться при новом нажатии кнопки. Согласно флагу и менять положение в первом if.
     
    Motrosoff нравится это.
  12. ostrov

    ostrov Гуру

    Напомни, не узнаю в маске.
     
    Motrosoff нравится это.
  13. mcureenab

    mcureenab Гуру

    Не делать ничего и повернуть на 90 это разные вещи с т.з. МК. Пусть даже в результате ничего не меняется.
     
    Motrosoff нравится это.
  14. NikitOS

    NikitOS Шут Администратор

    Поздравляю мне 11:D;)
     
    NO_NAME, Motrosoff и Tomasina нравится это.
  15. mcureenab

    mcureenab Гуру

    Не буду делать как вам надо, вот такой пример.

    Код (C++):
    #include <Servo.h>

    Servo serv;
    const uint8_t bat = 5;
    bool butt_flag = false;
    unsigned long last_press = 0;

    void setup()
    {
      pinMode(bat, INPUT_PULLUP);
      serv.attach(7);
    }

    void loop()
    {
      bool butt = digitalRead(bat) == LOW; // считать текущее положение кнопки
      static int angle = 90; // Угол поворота
      if ( butt && !butt_flag && millis() - last_press > 100 ) {
        butt_flag = true;
        serv.write(angle);
        if(--angle) angle = 90; // Шагаем до 0 и возвращаемся
        last_press = millis();
      }
      if ( !butt && butt_flag ) {
        butt_flag = false;
        last_press = millis(); // При отпускании тоже может быть дребезг
      }
    }
     
     
    Motrosoff нравится это.
  16. Motrosoff

    Motrosoff Гик

    помогал с кодом, я в аттини85 код заливал, который напряжение мерит и смотрел что бы оно не ниже 2.8 вольта опускалось ..
     
  17. Motrosoff

    Motrosoff Гик

    :rolleyes:
     
    NO_NAME и NikitOS нравится это.
  18. NikitOS

    NikitOS Шут Администратор

    :cool:
     
    Motrosoff нравится это.
  19. Motrosoff

    Motrosoff Гик

    неа..она при включении сама на 90 поворачивается
    P,S, я в симуляторе ардуино делаю
     
  20. Motrosoff

    Motrosoff Гик

    Код (C++):
    if(--angle) angle = 90;
    а зачем два минуса перед углом????