Кормушка для кота

Тема в разделе "Arduino & Shields", создана пользователем ffffff, 2 май 2018.

  1. ffffff

    ffffff Нерд

    Здравствуйте вот код скетча на открывание сервы и закрывание , но проблема в том что нажатие кнопки не реагирует ,то есть не выполняется код при нажатии на нее хотя в серийном порту пишет button on ,если не нажимать на кнопку выполняется код по истечению таймера. Подправьте мой скетч, подскажите что делать, чтобы работало как и от нажатия кнопки так и от таймера

    Код (C++):
    const int buttonPin = 12;     // номер входа, подключенный к кнопке
    //const int ledPin =  13;      // номер выхода светодиода

    // переменные
    int buttonState = 0;         // переменная для хранения состояния кнопки
    long prevmillis = millis();
    long interval = 10000;
    #include <Servo.h> //используем библиотеку для работы с сервоприводом
    Servo servo; //объявляем переменную servo типа Servo
    void setup() {
      Serial.begin(9600);
      servo.attach(9); //привязываем привод к порту 9
      // инициализируем пин, подключенный к светодиоду, как выход
      // pinMode(ledPin, OUTPUT);  
      // инициализируем пин, подключенный к кнопке, как вход
      pinMode(buttonPin, INPUT);
    }
    void loop(){
      buttonState = digitalRead(buttonPin);// считываем значения с входа кнопки
      if (buttonState == HIGH) {     // проверяем нажата ли кнопка
                                     // если нажата, то buttonState будет HIGH:
                                    // включаем светодиод
    Serial.println("Button on");                 // вывести открыть градусы на открытие
    servo.write(0);               //ставим вал под 180(открытие сервы)
    delay(3000);                    //ждем 2 секунды
    servo.write(99);               //ставим вал под 0 (закрытие закрытие)
    delay(3000);                  //ждем 2 секунды
      }
    else if
      (( millis() - prevmillis) > interval){ // если прошедшее время с начала запуска скетча > интервала
         prevmillis = millis();                 // вновь обнуляем время счетчика
        servo.write(0);                         //ставим вал под 180(открытие сервы)
        Serial.println("Open");                 // вывести открыть градусы на открытие
        delay(5000);                            //ждем 2 секунды
        servo.write(99);
        Serial.println("Close");                 // вывести закрытие
        delay(5000);//ставим вал под 0 (закрытие закрытие)
    }
    }
     

    Вложения:

    Последнее редактирование: 2 май 2018
  2. ostrov

    ostrov Гуру

    [​IMG]
    И отформатировать, понятное дело.
     
  3. ffffff

    ffffff Нерд

    еще бы по делу помог и проверь на орфографию раз уж начал
     
  4. ostrov

    ostrov Гуру

    Что к советам прислушался хорошо. Надо иметь уважение к тем, к кому обращаешься за помощью. Теперь можно и посмотреть.

    Хотя нет, не отфарматировано, читать глаза ломать. Сделай автоформат в IDE.

    И насчет орфографии. Не понятно что происходит и что должно происходить. Хорошо бы задачу описать понятнее.
     
  5. citRUS_oleg

    citRUS_oleg Нерд

    за место HIGH надо true
     
  6. Кто сказал?
     
  7. SergeiL

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

    А чем значение "HIGH", от значения "true" отличается? :)
     
    БАРМАТОГРАФ нравится это.
  8. b707

    b707 Гуру

    для компьютера это, как уже верно сказали, без разницы, ибо и то и другое в машинном коде превращается в "1".
    Но в смысловом плане "HIGH" как раз более правильно, потому что в коде речь идет о состояниях пина, которые как раз описываются как HIGH и LOW, а не о логических значениях TRUE-FALSE
     
    arkadyf нравится это.
  9. ffffff

    ffffff Нерд

    По сути вопроса может поможет кто нибудь
     
  10. Belkin

    Belkin Гик

    А у самого-то какие хоть мысли есть по этому поводу, кроме "Подправьте мой скетч..." ?
    Что было опробовано ?
    Какие изменения были сделаны в ходе экспериментов (если они были) ?
    Или сразу "Подправьте мой скетч" ?

    Тогда уж лучше в "Заказы...", там люди заинтересованы, сразу вцепятся похлеще кота некормленного из-за неработающего скетча... ;)
     
  11. ffffff

    ffffff Нерд

    Были закоментированы с кнопкой и без по отдельности работаю а все местете нехотят. Думаю может както через switch case.
     
  12. ffffff

    ffffff Нерд

    я же не прошу сделайте . Тут же можно просто советом помочь мол я бы сделал так то , или лучше сделай то . Все лучше чем советы подправь читаемость кода , орфографию, или поставь True вместо High блин ну дурость какая то взрослые люди
     
  13. Airbus

    Airbus Радиохулиган Модератор

    А в чём проблема?Всё работает.Куда у Вас подключена кнопка?По умолчанию на пине (кнопка отжата) всегда HIGH поэтому сразу срабатывает по умолчанию.Её надо притянуть к GND.При разрыве с GND будет срабатывать.А вообще логика не понятна.Что и как должно работать?
     
  14. ffffff

    ffffff Нерд

    Она и подключена к земле , может я чего то не понимаю, но вот схема подключения. Логика проста есть серва которая поворачивается на 2 положения (Открыты, закрыта). Действия открытие происходят в 2-ух случаях либо это нажатие кнопки либо выдержка по таймеру. Остальное время она находитья в положение закрыто
     

    Вложения:

  15. Belkin

    Belkin Гик

    Правильнее сказать, что в нормальном положении с кнопки считывается "1", а при нажатии на этом пине "0".
    Другими словами - кнопка не "подключена к земле", а "подключается к земле".

    Дальше обдумываем рекомендации Airbus ;)
     
  16. ostrov

    ostrov Гуру

    Судя по схеме, в ненажатом состоянии считывается 0, а в нажатом 1.

    Программа написана жутко. Никакой однотипной логики, какие то разнообразные заплатки. Даже отформатировать не удосужились после моей просьбы.

    Подсказка только из любви к котам. Эта команда: prevmillis=millis(); выполняется после процедуры, а не до. В том виде как у вас программа только и делает что щелкает сервой и выжидает паузы делеем, на опрос кнопки времени не остается, т.к. 5000+5000=10000, то есть интервал. Все решается переносом одной строки на несколько строк вниз.
     
    Airbus нравится это.
  17. ffffff

    ffffff Нерд

    всем спасибо проблема решена
     
  18. Belkin

    Belkin Гик

    Как ?
    Поражают такие "вопрошатели"...
    Зададут вопрос, взбаламутят, а потом - "Спасибо всем..."
    Каков результат (путь) решения ?
    Другим "вопрошателям", возможно, не придется спрашивать, если не поленятся форум полистать...
     
  19. Airbus

    Airbus Радиохулиган Модератор

    А ничё они новую тему откроют.Тут раз в неделю клоны Старых Песен о Главном.Никто ж не читает.
     
  20. ffffff

    ffffff Нерд

    Все просто , были проблемы с кнопкой или резистором , поменял их на другие и приспособление заработало.
    Не стал расписывать почему решение проблемы было решено , так как я понял, что тут несмотря на достижения гуру, гики и прочих магистров форума , попадаються 90 % флудистов . (Поправь мне вид скетча я читать не могу) - хотя другие читают, (поставь True а не HIGH) - да блин это булевая перменная тут либо 1 либо 0 какая разница HiGH или TRUE будет обозначенно в процессе. Но все равно спасибо , так просто осадок отстоявшегося говнеца в 3-ех литровой банки остался от "спецов"