Помогите сломать логику начинающего ардуинщика

Тема в разделе "Arduino & Shields", создана пользователем kacheika, 21 май 2021.

  1. kacheika

    kacheika Нуб

    В общем,пытаюсь совместить не совместимое(мою логику,и логику по которой работает 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);
        }

    }
     

    Вложения:

    Последнее редактирование: 21 май 2021
  2. a1000

    a1000 Гуру

    Вставьте код по человечески
    Ну и на вскидку
    это жесть!!!
     
  3. Airbus

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

    Чота ору!!!!
    [​IMG]

    Это не жесть—это пи@дец!
    ТС—сделайте флаг. И если флаг TRUE то программа (или какой то блок)выполняется а если нет то нет. TRUE на FALSE меняется приходом правильного кода по IR или нажатием кнопки или еще чего. Как то так
     
    arkadyf нравится это.
  4. akl

    akl Гуру

  5. Airbus

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

    Ну да или так
     
  6. Ariadna-on-Line

    Ariadna-on-Line Гуру

    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. Как может скетч войти в код библиотеки ?
     
  7. Unixon

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

    А нафига там вообще весь этот "random_int"?
     
  8. kacheika

    kacheika Нуб

    Код (C++):
    for (int count = 0; count < random_int(43, 72); count++) {
    Я понимаю что это смешно:)мне самому смешно.но я не волшебник я тольлько учусь,всего то второй день знаком с С++.спасибо кстати за вставку кода на сайт,буду теперь знать.А по поводу флагов...может подскажете как бы их расставить чтобы в любой момент останавливать скрипт?просто там количество повторений действий в блоках по 40-70
     
  9. kacheika

    kacheika Нуб

  10. kacheika

    kacheika Нуб

    1.там на картинке я показал стрелочками как это всё работает(но какбы по моей логике...я не уверен что она правильная).тоесть i =(unsignedlong)fnc_ir_rx_decode();-считывает число с пульта->запись в настройки скетча (в шапку)->сам макрос запрашивает значение i и выполняет "если-то"
    2.я просто эксперементировал с мышью,поэтому строчка появилась.уберу спасибо))
    3.вроде всё компилируется и заливается...
    4.немножко не понял,я же объявил библиотеки,он должен входить,разве нет?
     
  11. kacheika

    kacheika Нуб

    это небольшой бот для игры.там нужны рандомные числа
     
  12. Airbus

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

    Ну если в двух словах то
    Код (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; //обнуляем таймер
                               
                               }
                           }
                 
     
    Последнее редактирование: 24 май 2021