В общем,пытаюсь совместить не совместимое(мою логику,и логику по которой работает C++) Цель сего действия-запускать скетч который уже работает,но делать это с помощью ИК пульта. Тоесть нажал единицу на пульте-алгоритм запустился,нажал 2-остановился.В идеале конечно всё на одну кнопку:нажал-запустился,нажал-остановился,но пока хотя бы так.Помогите люди добрые,как говориться,подскажите что не так,а по хорошему покажите как правильно чтобы я мог сравнить свой вариант с вашим и сломать свою логику Как это видиться мне: я сделал "основной" скетч и скетч который контактирует с пультом,после этого я пытаюсь их совместить,вышло вот что,но оно не работает.я нажимаю 1 на пульте-запускается алгоритм и он бесконечен,нажимая 2 ничего не происходит Код (C++): long i = 0; #include <IRremote.h> IRrecv ir_rx(2); decode_results ir_rx_results; unsigned long fnc_ir_rx_decode() { bool decoded=false; if( ir_rx.decode(&ir_rx_results)) { decoded=true; ir_rx.resume(); } if(decoded) return ir_rx_results.value; else return 0; } long random_int(int a,int b) { if (a > b) { int c = a; a = b; b = c; } return random(a,b); } #include "Keyboard.h" #include "Mouse.h" void setup() { ir_rx.enableIRIn(); randomSeed(analogRead(0)); Mouse.begin(); Keyboard.begin(); delay(500); Serial.begin(9600); } void loop() { i = (unsigned long)fnc_ir_rx_decode(); if (i == 16753245) { for (int count = 0; count < random_int(43, 72); count++) { Keyboard.press('1'); delay(random_int(80, 201)); Keyboard.release('1'); delay(random_int(100, 1101)); } for (int count = 0; count < random_int(1, 3); count++) { Keyboard.press('k'); delay(random_int(80, 131)); Keyboard.release('k'); delay(random_int(100, 501)); } for (int count = 0; count < random_int(5, 15); count++) { Keyboard.press('1'); delay(random_int(80, 201)); Keyboard.release('1'); delay(random_int(100, 1101)); } for (int count = 0; count < random_int(2, 4); count++) { Keyboard.press('4'); delay(random_int(100, 201)); Keyboard.release('4'); delay(random_int(100, 1101)); } for (int count = 0; count < random_int(21, 55); count++) { Keyboard.press('1'); delay(random_int(80, 201)); Keyboard.release('1'); delay(random_int(100, 1101)); } for (int count = 0; count < random_int(2, 4); count++) { Keyboard.press('4'); delay(random_int(100, 201)); Keyboard.release('4'); delay(random_int(100, 1101)); } } if (i == 16736925) { delay(10000000000); } }
Чота ору!!!! Это не жесть—это пи@дец! ТС—сделайте флаг. И если флаг TRUE то программа (или какой то блок)выполняется а если нет то нет. TRUE на FALSE меняется приходом правильного кода по IR или нажатием кнопки или еще чего. Как то так
if (i == 16753245) {... 1. Фиг его знает, может я слепой - но не нашел в коде, где со значением " i " что-то делается, инкрементируется например. 2. В коде нигде не используется мышь. Зачем там она ? 3. Скетч не компилируется со странным (для меня) результатом - " Используем библиотеку IRremote версии 3.3.0 из папки: C:\Users\Alex\Documents\Arduino\libraries\IRremote Используем библиотеку Keyboard версии 1.0.2 из папки: C:\Program Files\Arduino\libraries\Keyboard Используем библиотеку HID версии 1.0 из папки: C:\Program Files\Arduino\hardware\arduino\avr\libraries\HID exit status 1 'Клавиатура' не найдена. Убедитесь входит ли скетч в код '#include <Keyboard.h>'? " Хотя библа на месте. 4. Как может скетч войти в код библиотеки ?
Код (C++): for (int count = 0; count < random_int(43, 72); count++) { Я понимаю что это смешномне самому смешно.но я не волшебник я тольлько учусь,всего то второй день знаком с С++.спасибо кстати за вставку кода на сайт,буду теперь знать.А по поводу флагов...может подскажете как бы их расставить чтобы в любой момент останавливать скрипт?просто там количество повторений действий в блоках по 40-70
1.там на картинке я показал стрелочками как это всё работает(но какбы по моей логике...я не уверен что она правильная).тоесть i =(unsignedlong)fnc_ir_rx_decode();-считывает число с пульта->запись в настройки скетча (в шапку)->сам макрос запрашивает значение i и выполняет "если-то" 2.я просто эксперементировал с мышью,поэтому строчка появилась.уберу спасибо)) 3.вроде всё компилируется и заливается... 4.немножко не понял,я же объявил библиотеки,он должен входить,разве нет?
Ну если в двух словах то Код (Text): bool one = true; // флаг1 int Led = 13; void setup(){ pinMode(Led, OUTPUT); } void loop() { if(one) //если one==TRUE то мигаем { digitalWrite(Led, HIGH); delay(1000); // задержка digitalWrite(Led, LOW); delay(1000); // задержка } else if(!one) //если one==FALSE то тупо светим { digitalWrite(Led, HIGH); } } Состояние флага one можно менять в коде по нужному событию. Нажатие кнопки ,приход символа по UART или IR. Можно завести несколько флагов и по их комбинациям делать что то. Или не делать ничего. В этом случае в скобках ничего не пишем. Типа так { } Вот ещё пример Эхо репитера для радиостанции.Там два флага.По их состояниям делаем различные действия Код (Text): #define rx 0 // вход #define PTT 1 // на PTT #define mod 2 // джампер вид работы #define rd 3 // воспроизведение #define wr 4 // запись bool SQL = false; //шумодав закрыт bool state = true;//защелка взведена char g; unsigned long timeout = 0; int timer = 0; int LIMIT = 5000; //лимит 5 секунд void setup() { pinMode(rx, INPUT); //вход от РС pinMode(PTT, OUTPUT);// выход РТТ pinMode(mod, INPUT);// режим работы pinMode(rd, OUTPUT);//воспроизведение 2 вывод МС pinMode(wr, OUTPUT);//запись 1 вывод МС } void loop() { if (digitalRead(rx == HIGH)) {SQL = true;} else {SQL = false; } if((SQL)&&(state)) //Если шумодав открылся и бит-защелка записи поднята, то.. { for(g=0;g<10;g++) { delay(20); if(!SQL)break; } if(g==10) {digitalWrite(wr, HIGH); state = false; timeout = (millis()); } // и если шумодав по преждему открыт, то врубаем запись и сбрасываем защёлку пускаем таймер } if((SQL)&&(!state)) //Если шумодав открыт и бит-защёлка сброшена, то значит запись УЖЕ ИДЕТ и надо считать время. { timer = (millis()-timeout); //Считаем время if(timer > LIMIT) //Если таймер вышел за лимит, то ограничиваем его рост и прекращаем запись ПРИНУДИТЕЛЬНО! {timer = LIMIT; digitalWrite(wr,LOW);} } if((!SQL)&&(!state)) //Если шумодав отпустился, и защёлка сброшена, то значит БЫЛА ЗАПИСЬ и нам ее надо передать в эфир { digitalWrite(wr,LOW);//прекращаем запись state = true; //поднимаем защелку digitalWrite(PTT, HIGH); delay(250); digitalWrite(rd, HIGH); delay(timer); digitalWrite(rd, LOW); delay(250); digitalWrite(PTT, LOW); timer = 0; //обнуляем таймер } }