Помогите со скетчем

Тема в разделе "Arduino & Shields", создана пользователем Life818, 14 июл 2018.

  1. Life818

    Life818 Нуб

    вступление: Всем привет, прошу понять и простить, в этом деле я 0, но многого добился методом тыка. Но зашёл в тупик.

    Делаю масинку на ардуино управляемую через джостик от ps2. Всё работает прекрасно.
    Хотел сделать ещё мигалки, умею только через delay, но это не подходит в моём случаи.
    Нашёл в инете скетч который мне подходит, но незнаю как его привязать к своему.

    В общем, нужно чтобы этот процесс мигания, запустился только после нажатия кнопки на джостике.

    кусок скетча машинки, кнопка:
    Код (C++):
    if(ps2x.ButtonPressed(PSB_PINK))

    (чтобы весь нижний код заработал, только после нажатия кнопки (указан выше))

    скетч мигалка:
    Код (C++):
    #include<SmartDelay.h>

    SmartDelay led12(1000000UL);
    SmartDelay led11(777000UL);

    setup () {

    pinMode(12,OUTPUT);
    pinMode(11,OUTPUT);
    }

    byte led12state=0;
    byte led11state=0;

    void loop () {

    if (led12.Now()) {
        digitalWrite(12,led12state);
        led12state=!led12state;

    }
    if (led11.Now()) {
    digitalWrite(11,led11state);
    led11state=!led11state;
    }
    }
     
    Последнее редактирование: 14 июл 2018
  2. Daniil

    Daniil Гуру

    Тут частенько обсуждают подобные вопросы, попробуйте обратиться к поиску.
    Если в кратце, то вам нужно зафиксировать время когда светодиод зажегся/потух, в общем цикле обычным ифом проверять не прошлоли заданное вами время горения/негорения диода и, если прошло, то изменить состояние светодиода.
     
  3. Life818

    Life818 Нуб

    Поищу, спасибо.
    Но, если кто нибудь ещё открыл эту тему и знает как помочь, буду очень благодарен)
     
  4. Mitrandir

    Mitrandir Гуру

  5. Life818

    Life818 Нуб

    Спасибо тебе добрый человек, буду копать))
    Как я и говорил, я ноль в этом, мне непонятно как мой (чужок) или тот который вы скинули, запустился ТОЛЬКО по нажатию моей кнопки на джостике ps2
    Но всё равно спасибо)
     
  6. b707

    b707 Гуру

    Сколько можно это повторять ? если не будете учиться, так и останетесь нулем. А чтобы учиться - надо читать учебники и решать примеры, а не просить готовое на форумах.
     
    DetSimen нравится это.
  7. Life818

    Life818 Нуб

    Я не прошу ничего готовое. просто спросил как делается так что код работает от нажатия кнопки. Сам всё дедал, НО мигания не происходит. Основной код и код мигания уже давно написано. проблема просто в кнопке.
    А тема закрыта, нашёл другое решение. (с двумя ардуинами или просто собрать отдельно модуль стробоскоп).
    Всем удачи.
     
  8. parovoZZ

    parovoZZ Гуру

    Ну как вы все не можете понять, что ваш код работает всегда. Только он работает по правилам, которые заложены в МК, а не у вас в голове. Неужели так сложно выучить эти простые правила?
     
  9. b707

    b707 Гуру

    Ню-ню :)
    Под каждую новую кнопку новую ардуину? - лишь бы не учиться...
    Может стоило все же запустить поиск по инету. как работает код от кнопки, изучить примеры?
     
    Mitrandir нравится это.
  10. Mitrandir

    Mitrandir Гуру

    ага, а под каждое запущенное приложение отдельный компутатор
     
  11. parovoZZ

    parovoZZ Гуру

    И каждому контакту по телефону =)
     
    Mitrandir нравится это.
  12. Здравствуйте, сразу скажу я не силен в языке си. Понадобилось сделать несложное меню. У меня сделано на case, теперь пытаюсь от этого избавляться. Поискал на зарубежных сайтах и нашел (https://www.codeproject.com/Articles/794047/Finite-State-Menu) с виду простой вариант меню на структурах. Приложил ниже заголовочный файл и файл проекта.

    В моем текущем коде пункты меню заданы с помощью перечислений:

    Код (C++):
    enum switchVariants : byte  {  // Определения для переключателя пунктов меню;
      MAIN_MENU, MENU_MANUAL, MENU_AUTO, MENU_SETUP, MENU_DEBUG
    };
    switchVariants switchPointer = MAIN_MENU; // С чего начнем цикл;
    Навигация по меню происходит по веткам в соответствии с рисунком ниже:
    Код (C++):
    switch (switchPointer)  // Все делаем в одном операторе и одной функции;
      {
        case MAIN_MENU:  /***************** Главное меню ***************/

          break;

        case MENU_MANUAL: /***************** Ручной режим ***************/

          break;

        case MENU_AUTO: /***************** Автоматический режим ***************/

          break;

        case MENU_SETUP: /***************** Настройки ***************/

          break;

        case MENU_DEBUG: /***************** Отладка ***************/

          break;
       
      }
    Безымянный.png
    Меню построено следующим образом - имеется главный пункт и 4 подпункта. Взаимный переход между подпунктами невозможен, зайти и выйти можно только через главное меню

    Думаю связать перечисления с объектом BuildMenu. Но не выходит, подскажите как правильно это сделать в моем случае:

    Код (C++):
    BuildMenu(&mainM, manualM, autoM, setM, debugM);
    Код (C++):
    enum switchVariants : byte  {  // Определения для переключателя пунктов меню;
      MAIN_MENU, MENU_MANUAL, MENU_AUTO, MENU_SETUP, MENU_DEBUG
    };
    switchVariants switchPointer = MAIN_MENU; // С чего начнем цикл;
    Код на данный момент
    Код (C++):
    #include "Cl_do_btn_long.h" // подключаем библиотеку для опроса кнопок
    #include "menu.h"
    #include <Wire.h> // библиотека для управления устройствами по I2C
    #include <LiquidCrystal_I2C.h> // подключаем библиотеку для LCD 2004

    LiquidCrystal_I2C lcd(0x27, 16, 2); // присваиваем имя lcd для дисплея 20х4

    //Инициализируем обработчики кнопок управления
    Cl_do_btn_long Btn_down(13);
    Cl_do_btn_long Btn_up(12);
    Cl_do_btn_long Btn_ok(11);
    Cl_do_btn_long Btn_prev(10);
    Cl_do_btn_long Btn_next(9);
    Cl_do_btn_long Btn_none(8);

    uint8_t MenuIndex = 0; //текущий пункт меню,

    enum switchVariants : byte  {  // Определения для переключателя пунктов меню;
      MAIN_MENU, MENU_MANUAL, MENU_AUTO, MENU_SETUP, MENU_DEBUG
    };
    switchVariants switchPointer = MAIN_MENU; // С чего начнем цикл;

    //declare all levels/nodes of menu
    struct level mainM, manualM, autoM, setM, debugM, *currentM;

    void setup(void)
    {
      //Serial.begin(9600);

      BuildMenu(&mainM, manualM, autoM, setM, debugM);

      //Serial.println(currentM->menuEnter);
      //Serial.println(currentM->name);
      init_pins();

      lcd.begin();     // инициализация LCD дисплея
      lcd.backlight(); // включение подсветки дисплея

      currentM = &mainM;

    }

    void loop() {
      Btn_down.run(&press_down, &longPress_down);
      Btn_up.run(&press_up, &longPress_up);
      Btn_ok.run(&press_ok, &longPress_ok);
      Btn_prev.run(&press_prev, &longPress_prev);
      Btn_next.run(&press_next, &longPress_next);
      Btn_none.run(&press_cansel, &longPress_cansel);


      switch (switchPointer)  // Все делаем в одном операторе и одной функции;
      {
        case MAIN_MENU:  /***************** Главное меню ***************/

          break;

        case MENU_MANUAL: /***************** Ручной режим ***************/

          break;

        case MENU_AUTO: /***************** Автоматический режим ***************/

          break;

        case MENU_SETUP: /***************** Настройки ***************/

          break;

        case MENU_DEBUG: /***************** Настройки ***************/

          break;
       
      }
    }

    void init_pins() {
      DDRB = 0x00; // назначить пины кнопок на вход
      PORTB = 0b00111111; // подключить внутренние подтягивающие pull-up резисторы
    }

    // кнопка 1
    void press_down() { /*обработчик короткого*/
      Down(&currentM);
    }
    void longPress_down() { /*обработчик длинного*/

    }
    // кнопка 2
    void press_up() { /*обработчик короткого*/
      Up(&currentM);
    }
    void longPress_up() { /*обработчик длинного*/

    }
    // кнопка 3
    void press_ok() { /*обработчик короткого*/

    }
    void longPress_ok() { /*обработчик длинного*/

    }
    // кнопка 4
    void press_prev() { /*обработчик короткого*/
      Prev(&currentM);
    }
    void longPress_prev() { /*обработчик длинного*/

    }
    // кнопка 5
    void press_next() { /*обработчик короткого*/
      Next(&currentM);  
    }
    void longPress_next() { /*обработчик длинного*/

    }
    // кнопка 6
    void press_cansel() { /*обработчик короткого*/

    }
    void longPress_cansel() { /*обработчик длинного*/

    }
    Заголовочный файл
    Код (C++):
    /*enum switchVariants : byte  {  // Определения для переключателя пунктов меню;
      MAIN_MENU, MENU_MANUAL, MENU_AUTO, MENU_SETUP, MENU_DEBUG
    };
    switchVariants switchPointer = MAIN_MENU;*/
    // С чего начнем цикл;

    struct level {
      //boolean menuEnter = 0;
      //uint8_t flags = 0;
      struct level *next;
      struct level *prev;
      struct level *down;
      struct level *up;
      //switchVariants point; // объект данного перечисления
      //void (*DoWork)(void);
    };

    //void BuildMenu(struct level *currentNode, boolean menuEnter, void (*DoWork)(void) , struct level *prevNode, struct level *nextNode, struct level *upNode, struct level *downNode)
    void BuildMenu(struct level *currentNode, struct level *prevNode, struct level *nextNode, struct level *upNode, struct level *downNode)
    {
      //strcpy(currentNode->name, name);
      //currentNode->Select = Select;
      //currentNode->menuEnter = menuEnter; // Флаг признака
      currentNode->prev = prevNode;
      currentNode->next = nextNode;
      currentNode->up = upNode;
      currentNode->down = downNode;
      //currentNode->DoWork = DoWork;
    }

    void Next(struct level **currentNode)
    {
      //if((*currentNode)->DoWork != 0)
      //(*currentNode)->DoWork();
      //else
      if ((*currentNode) ->next != 0)
        (*currentNode) = (*currentNode)->next;
    }

    void Prev(struct level **currentNode)
    {
      //if((*currentNode)->DoWork != 0)
      //  (*currentNode)->DoWork();
      //else
      if ((*currentNode)->prev != 0)
        (*currentNode) = (*currentNode)->prev;
    }

    void Up(struct level **currentNode)
    {
      if ((*currentNode)->up != 0)
        (*currentNode) = (*currentNode)->up;
    }

    void Down(struct level **currentNode)
    {
      if ((*currentNode)->down != 0)
        (*currentNode) = (*currentNode)->down;
    }

    /*void Ok(struct level **currentNode)
    {
        if ((*currentNode)->ok == menuEnter)
        //if ((void*)NewMenu == (void*)&NULL_ENTRY)
          return;

        menuEnter = !menuEnter;
    }*/

     
     

    Вложения:

    • main.c
      Размер файла:
      1,8 КБ
      Просмотров:
      294
    • menu.h
      Размер файла:
      1,1 КБ
      Просмотров:
      311
    Последнее редактирование: 17 июл 2018