Lasertag

Snakpz76
Offline
Зарегистрирован: 12.06.2021


Всем привет. В лазертаг использую в одних пушках NANO, в других LGT8F328P. Скетч один. Так вот на LGT скетч работает только с  Serial.begin(9600); в void setup(). (строка 141)Для меня это удивительно, может подскажете почему так. Скетч не мной написан но кое как пытаюсь разобраться .

#include <IRremote.h>  //биб-ка ИК
#include <avr/pgmspace.h> //биб-ка для работы с массивом данных
#include "sounddata.h"    // массив данных

unsigned long oldtime,     // программный таймер
               timeFire,  // скорострельность
               timemillis, //  программный таймер
               timeResist; // время уезвимости
               
byte RECV_PIN = 11;    // выход ИК-приемника
byte button = 2;       //кнопка выстрела
int i,i_end;          // начало конец звук фрагмента
unsigned long ct8khz;  // выборка байта с частотой ~ 8000 Гц
byte speakerPin = 10;  //выход звука
byte LedGameOver = 13; // светодиод повязки
int life;     // жизни        
int bullet;   // патроны
boolean flagGameOver;  //состояние игры
IRsend irsend (3);             // выход ик вывод 3
IRrecv irrecv(RECV_PIN);  //определяем вход
decode_results results;   //результат декодирования


     
void Playsound ()   // подпрограмма вывода звука
     {
       if (i_end>0)           // если байт конца фрагмента равен 0 то звука нет
        {
         if (ct8khz < micros())   // если таймер переполнился 
           {  
       analogWrite(speakerPin, pgm_read_byte(&data[i])); // помещаем байт из массива Шим генерато

             i++;        // увеличить счетчик  в массиве
               ct8khz = micros()+115;  // выборка байта с частотой ~ 8000 Гц
            }
        if (i>i_end)      // если конец фрагмента  конец воспроизведения
                  {
                    i=0;
        i_end=0;
                    
                  }  
        }
     }
   
void Updategame()  //обновление игры
{
   timemillis = millis(); 
    if (timeResist < timemillis)     // Шок 2 сек
     {
      
      if (life > 0) digitalWrite(LedGameOver, LOW);  // выкл светодиод 
     }
     if (life < 1 && flagGameOver == LOW )
       {
        flagGameOver = HIGH;
        
        i=9600;             // звук game
        i_end=18299;         // over
        
        digitalWrite(LedGameOver, HIGH);  // вкл светодиод
       }
     
       
      
  }   
  
  
void UpdateIRin() // обработка принятых данных


{
 
    if (irrecv.decode(&results)) 
     {
       //Serial.println(results.value); //"показываем" принятый код
       if (results.value == 1976) // Пополнение life bullet  
        {
          timeResist = timemillis+2000;
          life = 3;   // + 3 жизни          
          digitalWrite(LedGameOver, LOW);
          bullet = 100;  //  +100 патронов
          i=18300;     //  звук
          i_end=20299; //   перезаряда
          flagGameOver = LOW;
        }
     if (life > 0)   // если живой
     {   
       
      if (results.value == 2024 && timeResist < timemillis) // если выстрел противника 
        {
          
          timeResist = timemillis+2000;  // уязвимость 2с
          
          life--;      //  -1 жизнь 
          i=4800;   //  звук
          i_end=9599;   //  попадания
          digitalWrite(LedGameOver, HIGH); // вкл светодиод
        }
                
       if (results.value == 3772817503) // Game Over   ( Кнопка пульта )
        {
          life = 0;  // 0 жизней
        }
      
    
                      
   }
   irrecv.resume();   
  }
 }
 void UpdateIRout()   // подпрограмма выстрела
   {
    if (life > 0 && timeResist < timemillis)  // если живой и уязвимый
    {
     if (digitalRead(button) == LOW && timeFire < timemillis ) // если нажат курок
      {
       if (bullet > 0) // если есть патроны
         {
          irsend.sendRC5(2000, 10);  //выстрел ( ик данные )
           
            bullet--; // -1 патрон
             
             i=0;    // звук
            i_end=4799; // выстрела
            
              
            irrecv.enableIRIn();      // запускаем прием
         }
          else              // иначе если нет патронов
           {irsend.sendRC5(4000, 10);
              i=19000;    // звук
            i_end=20000 ; // осечки
           }       
         timeFire = timemillis + 110;  //скорострельность  
        }  
       }  
      }     
 
void setup() 
   {
    Serial.begin(9600);
    irrecv.enableIRIn();      // "запускаем" прием



    
    pinMode(button,  INPUT_PULLUP);           // назначить выводу порт ввода
    digitalWrite(button, HIGH);                 // включить подтягивающий резистор
    
    pinMode(LedGameOver,OUTPUT);     // назначить выводу порт ввода
    digitalWrite(LedGameOver,LOW);   // выкл светодиод
    
     TCCR1A = TCCR1A & 0xe0 | 1;     // ШИМ 8 разрядов
     TCCR1B = TCCR1B & 0xe0 | 0x09;  //   62,5 кГц
      
       
      //pinMode(13, OUTPUT);    // назначить выводу порт ввода
    }
    
    
    
void loop() {       
   
 Playsound(); 
  
  UpdateIRin(); 
      
  Updategame();
  
  UpdateIRout();
   
  
}

 

Alexey_Rem
Offline
Зарегистрирован: 09.09.2019
Malish
Offline
Зарегистрирован: 05.07.2021

Здравствуйте. Хотел узнать излучатель на ик диоде? Если есть возможность, не поделитесь чертежами и ПО. Буду премного благодарен. И такой вопрос если использовать ИК лазерный модуль? Мой адрес cetvertakov71@mail.ru