вступление: Всем привет, прошу понять и простить, в этом деле я 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; } }
Тут частенько обсуждают подобные вопросы, попробуйте обратиться к поиску. Если в кратце, то вам нужно зафиксировать время когда светодиод зажегся/потух, в общем цикле обычным ифом проверять не прошлоли заданное вами время горения/негорения диода и, если прошло, то изменить состояние светодиода.
Спасибо тебе добрый человек, буду копать)) Как я и говорил, я ноль в этом, мне непонятно как мой (чужок) или тот который вы скинули, запустился ТОЛЬКО по нажатию моей кнопки на джостике ps2 Но всё равно спасибо)
Сколько можно это повторять ? если не будете учиться, так и останетесь нулем. А чтобы учиться - надо читать учебники и решать примеры, а не просить готовое на форумах.
Я не прошу ничего готовое. просто спросил как делается так что код работает от нажатия кнопки. Сам всё дедал, НО мигания не происходит. Основной код и код мигания уже давно написано. проблема просто в кнопке. А тема закрыта, нашёл другое решение. (с двумя ардуинами или просто собрать отдельно модуль стробоскоп). Всем удачи.
Ну как вы все не можете понять, что ваш код работает всегда. Только он работает по правилам, которые заложены в МК, а не у вас в голове. Неужели так сложно выучить эти простые правила?
Ню-ню Под каждую новую кнопку новую ардуину? - лишь бы не учиться... Может стоило все же запустить поиск по инету. как работает код от кнопки, изучить примеры?
Здравствуйте, сразу скажу я не силен в языке си. Понадобилось сделать несложное меню. У меня сделано на 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; } Меню построено следующим образом - имеется главный пункт и 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(¤tM); } void longPress_down() { /*обработчик длинного*/ } // кнопка 2 void press_up() { /*обработчик короткого*/ Up(¤tM); } void longPress_up() { /*обработчик длинного*/ } // кнопка 3 void press_ok() { /*обработчик короткого*/ } void longPress_ok() { /*обработчик длинного*/ } // кнопка 4 void press_prev() { /*обработчик короткого*/ Prev(¤tM); } void longPress_prev() { /*обработчик длинного*/ } // кнопка 5 void press_next() { /*обработчик короткого*/ Next(¤tM); } 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; }*/