Показано с 1 по 10 из 10
  1. #1
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    327

    По умолчанию Библиотеки <IRremote.h> и <MsTimer2.h>

    Библиотеки <IRremote.h> и <MsTimer2.h> не хотят работать вместе, почему?


  2. #2
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    327

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    IRremote.h -эта библиотека использует третий таймер?

  3. #3
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    Обе библиотеки используют TIMER2

  4. #4
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    327

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    Спасибо Чип!
    Тут ещё фигня выяснилась, при подключении этой библиотеки, (делал всё как в этом посте http://www.compcar.ru/forum/showthread.php?t=4959) начинает врать функция pulseIn(). То есть возвращает значение меньше чем должно быть. Например без неё длинна импульса
    24000 мкс, а если подключаешь, то 18000 мкс. У меня из-за неё спидометр стал врать.
    Как быть?

  5. #5
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    Используй либу TimerOne

  6. #6
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    327

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    А она может время замерять, длину импульса? функция micros(); у меня занята тахометром.

  7. #7
    Администратор Аватар для Chip
    Регистрация
    08.06.2007
    Возраст
    54
    Сообщений
    13,380
    Вес репутации
    10

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    Вот пример использования
    PHP код:
    #include <TimerOne.h>  

    #define BTNPIN 2 // Вход сигнала   
      
    volatile uint16_t lengthImpulstimerCount;  

    void setup()  
    {    

    /* LOW — вызов прерывания всякий раз,   
        когда на порту низкий уровень напряжения;  
        CHANGE – прерывание вызывается при изменении   
        значения на входе;  
        RISING – вызов прерывания при изменении уровня   
        напряжения с низкого (LOW) на высокое(HIGH)  
        FALLING – вызов прерывания при изменении уровня   
        напряжения с высокого (HIGH) на низкое (LOW)*/  
         
      
    lengthImpuls=0;  
        
      
    pinMode (BTNPININPUT);   

      
    Timer1.initialize(1);                
      
    Timer1.attachInterrupt(callback);    

      
    attachInterrupt(0fireUpRISING);  
    }  
    void callback() {  timerCount++; }  

    void loop()  
    {  
    //здесь твой основной код   
    }  

    // Функция обработки прерывания на подъем  
    void fireUp()  
    {  
      
    timerCount=0;  
      
    detachInterrupt(0); 
      
    attachInterrupt(0fireDownFALLING);  
    }  

    // Функция обработки прерывания на падение  
    void fireDown()  
    {  
       
    lengthImpuls timerCount;  
      
    detachInterrupt(0);  
      
    attachInterrupt(0fireUpRISING);  

    Последний раз редактировалось Chip; 01.11.2011 в 13:39.

  8. #8
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    327

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    У меня нулевой таймер занят тахометром.

  9. #9
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    327

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    Вабще мот мой скеч, он правда больше похож на черновик))))

    PHP код:
    #include <IRremote.h>
    IRrecv irrecv(9);
    decode_results results
    //#include <DallasTemperature.h>
    //DallasTemperature tempSensor;
    #include <LiquidCrystal.h>
    //#include <MsTimer2.h>
    LiquidCrystal lcd(12117654);

    unsigned long time;
    unsigned long taxometr 0;
    unsigned long dinaimpulsov 0;
    unsigned long ValSpCurr 0;
    unsigned long ir 1641447551;//первая кнопка
    int tmp37 0;
    int kpa 0;
    int volts 0;
    int pboost 0;
    int atmos 0;
    int senstvaz =0;
    int ds// сенсор ds18b20
    int val;
    int mapp;
    int peakrpm 0;
    int peakspeed 0;
    int taxo 0;
    int count 0;

    float peakboost 0;
    float boostvoltage;
    byte bytes[8]; 

    void setup() 
     {
      
    lcd.begin(162);
      
    pinMode(2INPUT); 
      
    pinMode(3INPUT); 
       
    // * LOW когда на порту LOW
       // * CHANGE , с LOW на HIGH и наоборот
       // * RISING  с LOW на HIGH
       // * FALLING  с HIGH на LOW
      
    attachInterrupt(0int_onRISING);
      
    //attachInterrupt(1, inton, FALLING);
    //  MsTimer2::set(30000, flash); // таймер будет срабатывать через каждые 500ms 
    //  MsTimer2::start();//запустить таймер
      //tempSensor.begin(10);
      
    Serial.begin(115200);
     
    //irrecv.enableIRIn(); // включить приемник
     
    pinMode(9,INPUT);
     
    digitalWrite(13,LOW);
    }
    void loop() 
    {
      if ((
    digitalRead(9) == 0)) 
        {
          
    digitalWrite(13,HIGH);
        
    irrecv.enableIRIn(); // включить приемник 
        

        else 
        {
          
    digitalWrite(13,LOW);
        
    // irrecv.resume();
       //  TCCR2A = TCCR2B = 0;
          
    TCCR2B=0x00;
        }
    //  irrecv.resume();
      /////////////////ТАХОМЕТР///////////////////////////////////////
    if (taxometr 6000)
    {
     
    taxo = (80000000 taxometr);
    }
    else 
    {
      
    taxo 0;
    }  
    if (
    taxo peakrpm//pikrpm
      
    {  
        
    peakrpm taxo;
      }
    //////////////// СПИДОМЕТР//////////////////////////////////////
        
    dinaimpulsov pulseIn(3HIGH100000);  // Считывание длительности положительного импульса
        
    ValSpCurr = (650000 dinaimpulsov); // Перевод в км/ч
      
    if (dinaimpulsov 120000 || ValSpCurr 350)
      {
        
    ValSpCurr 0;
      } 
      if (
    ValSpCurr peakspeed//pikspeed
      
    {  
        
    peakspeed ValSpCurr;
      }
    ///////////////////////IR/////////////////////////////////////
    if (irrecv.decode(&results)) 
      {
        if ((
    results.value 0) && (results.value 0xFFFFFFFF))
        {
          
    ir results.value;
        
    //  lcd.clear();
         // lcd.print(ir); 
        
    }
           
    irrecv.resume();
      }

     
     
    mapp analogRead(2);//map-sensor 
     
    kpa = ((mapp*(0.0045)*(51.0)+16));// killopaskali
     
    boost = ((mapp*(0.0045)*(51.0)+16)) / 100 -1//kilopaskali v bar
     
    atmos =map(mapp358384735780);// atmosfernoe davlenie
     
    if (kpa peakboost//pikboost
      
    {  
        
    peakboost kpa;
        
    pboost peakboost;
      }
     
    voltage 14.9 1024.0 analogRead(1); // volts
     
    volts voltage 10;
     
    val analogRead(0);// температура воды ваз 
    if (val >= && val <= 269)
    {
       
    senstvaz map(val0269, -50, -1);
    }
    else if (
    val >= 270 && val <= 503)
    {
       
    senstvaz map(val270503019) + 2;
    }
    else if (
    val >= 504 && val <= 821)
    {
       
    senstvaz map(val5048212055) + 2;
    }
    else if (
    val >= 822 && val <= 875)
    {
       
    senstvaz map(val8228755665) + 2;
    }
    else if (
    val >= 876 && val <= 930)
    {
       
    senstvaz map(val8769306680) + 2;
    }
    else if (
    val >= 931 && val <= 946)
    {
       
    senstvaz map(val9319468185) + 2;
    }
    else if (
    val >= 947 && val <= 965)
    {
       
    senstvaz map(val9479658697) + 2;
    }
    else if (
    val >= 966 && val <= 1002)
    {
       
    senstvaz map(val966100298126) + 2;
    }
    else if (
    val >= 1003 && val <= 1015)
    {
       
    senstvaz map(val10031015127140) + 2;
    }
     
    tmp37 = (analogRead(3) * 5.0 1024.0) / 0.02// tmp37
    /////////////////////////////////////////////
    /*
    if (digitalRead(9) <= 0)
      {
       ds = (tempSensor.getTemperature()),
       lcd.clear(), 
       lcd.print(ds),
       delay(1000);
      }
    */
    if (Serial.available() > 0//priem ot kompa
     
    {  
      
    int  inByte Serial.read();
      if (
    inByte ==1
        {
          
    peakboost 0;
          
    inByte =0;
        }
     }
     
    if (
    digitalRead(8) <= 0
      {
      
    peakboost 0//sbros pikboosta, sbrasivati na minus
      
    peakrpm 0;
      
    peakspeed 0;
      
    lcd.clear();
     
    // lcd.setCursor(0, 0);
      
    lcd.print("PEAKS SBROS");
      
    delay(30);
      
      
      }
     
    ////////////////////////////////////////////////////////////////
     
    if (ir == 1641447551//первая кнопка
     
    {
       
    lcd.clear(); 
       
    lcd.setCursor(00);
     
    //lcd.print(dinaimpulsov);
       
    lcd.print("RPM ");
       
    lcd.print(taxo);
       
    lcd.setCursor(90);
       
    lcd.print("V ");
       
    lcd.print(voltage,1);
       
    lcd.setCursor(01);
       
    lcd.print("SPD ");
       
    lcd.print(ValSpCurr);
       
    lcd.setCursor(81);
       
    lcd.print("BT ");
       
    lcd.print(boost);
     }
     if (
    ir == 1641431231)
     {
       
    lcd.clear(); 
       
    lcd.setCursor(00);
       
    lcd.print("PBST ");
       
    lcd.print(pboost);
    //  lcd.print(taxometr);
      //lcd.print(" ");
     // lcd.print(mapp);
     // lcd.print(" ");
    // lcd.print(atmos);      
     // lcd.print(" ");
     // lcd.print(taxo);
      
      //lcd.print(dinaimpulsov);
      
    lcd.print(" ");
     }
     
    // lcd.print(boost);
      
    lcd.print(" ");
     
    // lcd.print(kpa);
    //  lcd.print(ir);
     // lcd.print(pboost);
     // lcd.print(" ");
      //lcd.print(tmp37);
     //////////////////////////////////////////////////////////////////
      
    bytes[0]=(volts); //volts
      
    bytes[1]=(kpa); //turbo
      
    bytes[2]=(pboost); //pboost
      
    bytes[3]=(senstvaz); //senstvaz
      // bytes[4] = result & 255;                     
      // bytes[5] = (result & 768) >> 8;
      
    bytes[4] = taxo 0xFF// преобразовать в 4-байта  
      
    bytes[5] = (taxo 0xFF00) >> 8;  
      
    bytes[6] = (taxo 0xFF0000) >> 16
      
    bytes[7] = (taxo 0xFF000000) >> 24;  
         
      
    Serial.writebytes,8);      
       
     
    // delay(50);
       
      
    bytes[0] = 0;
      
    bytes[1] = 0;       
      
    bytes[2] = 0
      
    bytes[3] = 0
      
    bytes[4] = 0
      
    bytes[5] = 0;
      
    bytes[6] = 0;
      
    bytes[7] = 0;
          
    }
    /*
    void  inton() 



    */
    void  int_on() 


    count++; //увеличить счетчик volatile

    if (count >= 4)
        {
          
    taxometr micros()-time;  //время прихода 6-ти импульсов
          
    time micros(); //обнулить
         // taxometrrr = count;
          
    count 0;
        }  



    //void flash() //обработка прерывания таймера
    //{
      
    //} 

  10. #10
    Продвинутый
    Регистрация
    03.06.2008
    Возраст
    49
    Сообщений
    320
    Вес репутации
    327

    По умолчанию Re: Библиотеки <IRremote.h> и <MsTimer2.h>

    Вот пока вот так сделал!
    PHP код:
    #include <IRremote.h>
    IRrecv irrecv(9);
    decode_results results
    //#include <DallasTemperature.h>
    //DallasTemperature tempSensor;
    #include <LiquidCrystal.h>
    //#include <MsTimer2.h>
    LiquidCrystal lcd(12117654);

    unsigned long time;
    unsigned long taxometr 0;
    unsigned long dinaimpulsov 0;
    unsigned long ValSpCurr 0;// скорость на lcd
    unsigned long ir 1641447551;//первая кнопка
    int irper 0// переменная для икпульта
    int tmp37 0;
    int kpa 0;
    int volts 0;
    int pboost 0;
    int atmos 0;
    int senstvaz =0;
    int ds// сенсор ds18b20
    int val;
    int mapp;
    int peakrpm 0;
    int peakspeed 0;
    int taxo 0;
    int count 0;

    float peakboost 0;
    float boostvoltage;
    byte bytes[8]; 

    void setup() 
     {
      
    lcd.begin(162);
      
    pinMode(2INPUT); 
      
    pinMode(3INPUT); 
       
    // * LOW когда на порту LOW
       // * CHANGE , с LOW на HIGH и наоборот
       // * RISING  с LOW на HIGH
       // * FALLING  с HIGH на LOW
      
    attachInterrupt(0int_onRISING);
      
    //attachInterrupt(1, inton, FALLING);
    //  MsTimer2::set(30000, flash); // таймер будет срабатывать через каждые 500ms 
    //  MsTimer2::start();//запустить таймер
      //tempSensor.begin(10);
      
    Serial.begin(115200);
     
    //irrecv.enableIRIn(); // включить приемник
     
    pinMode(9,INPUT);
     
    digitalWrite(13,LOW);
    }
    void loop() 
    {

      
    /////////////////ТАХОМЕТР///////////////////////////////////////
    if (taxometr 6000)
    {
     
    taxo = (80000000 taxometr);
    }
    else 
    {
      
    taxo 0;
    }  
    if (
    taxo peakrpm//pikrpm
      
    {  
        
    peakrpm taxo;
      }
    //////////////// СПИДОМЕТР//////////////////////////////////////
        
    dinaimpulsov pulseIn(3HIGH70000);  // Считывание длительности положительного импульса
        
    ValSpCurr = (650000 dinaimpulsov); // Перевод в км/ч
      
    if (dinaimpulsov 75000 || ValSpCurr 350)
      {
        
    ValSpCurr 0;
      } 
      if (
    ValSpCurr peakspeed//pikspeed
      
    {  
        
    peakspeed ValSpCurr;
      }
    ///////////////////////IR/////////////////////////////////////
    if (irper == 0)
    {
      if ((
    digitalRead(9) == 0)) 
        {
        
    //  delay(5);
          
    digitalWrite(13,HIGH);
         
    // delay(10);
        
    irrecv.enableIRIn(); // включить приемник 
        
    irper 1;
        
    ir 0;
        
    lcd.clear();
        
    lcd.print("menu: 1 ili 2"),
        
    //delay(10);
        
    digitalWrite(13,LOW);
      
    //  goto label;
        
        

    }   
      
    //  else 
      //  {
       //   digitalWrite(13,LOW);
        
       //  TCCR2A = TCCR2B = 0;
         // TCCR2B=0x00;
     //   }
    //  irrecv.resume();

    //label:
    //digitalWrite(13,LOW);
    if (irrecv.decode(&results)) 
      {
        if ((
    results.value 0) && (results.value 0xFFFFFFFF))
        {
          
    ir results.value;
         
    // digitalWrite(13,LOW);
        //  lcd.clear();
         // lcd.print(ir);
      //  irper = 0; 
      
    if (results.value == 1641447551 || results.value == 1641431231)
      {
        
    TCCR2A TCCR2B 0;
        
    irper 0
      } 
        }
           
    irrecv.resume();
          
    // irper = 0;
         // TCCR2A = TCCR2B = 0;
           
         //  digitalWrite(13,LOW);
      
    }

     
     
    mapp analogRead(2);//map-sensor 
     
    kpa = ((mapp*(0.0045)*(51.0)+16));// killopaskali
     
    boost = ((mapp*(0.0045)*(51.0)+16)) / 100 -1//kilopaskali v bar
     
    atmos =map(mapp358384735780);// atmosfernoe davlenie
     
    if (kpa peakboost//pikboost
      
    {  
        
    peakboost kpa;
        
    pboost peakboost;
      }
     
    voltage 14.9 1024.0 analogRead(1); // volts
     
    volts voltage 10;
     
    val analogRead(0);// температура воды ваз 
     
    if (val >= && val <= 269)
    {
       
    senstvaz map(val0269, -50, -1);
    }
    else if (
    val >= 270 && val <= 503)
    {
       
    senstvaz map(val270503019) + 2;
    }
    else if (
    val >= 504 && val <= 821)
    {
       
    senstvaz map(val5048212055) + 2;
    }
    else if (
    val >= 822 && val <= 875)
    {
       
    senstvaz map(val8228755665) + 2;
    }
    else if (
    val >= 876 && val <= 930)
    {
       
    senstvaz map(val8769306680) + 2;
    }
    else if (
    val >= 931 && val <= 946)
    {
       
    senstvaz map(val9319468185) + 2;
    }
    else if (
    val >= 947 && val <= 965)
    {
       
    senstvaz map(val9479658697) + 2;
    }
    else if (
    val >= 966 && val <= 1002)
    {
       
    senstvaz map(val966100298126) + 2;
    }
    else if (
    val >= 1003 && val <= 1015)
    {
       
    senstvaz map(val10031015127140) + 2;
    }
     
    tmp37 = (analogRead(3) * 5.0 1024.0) / 0.02// tmp37
    // digitalWrite(13,LOW);
    /////////////////////////////////////////////
    /*
    if (digitalRead(9) <= 0)
      {
       ds = (tempSensor.getTemperature()),
       lcd.clear(), 
       lcd.print(ds),
       delay(1000);
      }
    */
    if (Serial.available() > 0//priem ot kompa
     
    {  
      
    int  inByte Serial.read();
      if (
    inByte ==1
        {
          
    peakboost 0;
          
    inByte =0;
        }
     }
     
    if (
    digitalRead(8) <= 0
      {
      
    peakboost 0//sbros pikboosta, sbrasivati na minus
      
    peakrpm 0;
      
    peakspeed 0;
      
    lcd.clear();
     
    // lcd.setCursor(0, 0);
      
    lcd.print("PEAKS SBROS");
      
    delay(30);
      
      
      }
     
    ////////////////////////////////////////////////////////////////
     
    if (ir == 1641447551//первая кнопка
     
    {
     
    //  irper = 0; 
       
    lcd.clear(); 
       
    lcd.setCursor(00);
     
    //lcd.print(taxometr);
       
    lcd.print("RPM ");
       
    lcd.print(taxo);
       
    lcd.setCursor(90);
       
    lcd.print(taxometr);
       
    //lcd.print("V ");
     //  lcd.print(voltage,1);
       
    lcd.setCursor(01);
       
    lcd.print("SPD ");
       
    lcd.print(ValSpCurr);
       
    lcd.setCursor(81);
      
    // lcd.print("BT ");
       
    lcd.print(dinaimpulsov);
     }
     if (
    ir == 1641431231)
     {
      
    // irper = 0; 
       
    lcd.clear(); 
       
    lcd.setCursor(00);
       
    lcd.print("PBST ");
       
    lcd.print(pboost);
       
    lcd.setCursor(81);
        
    lcd.print(ValSpCurr);
    //  lcd.print(taxometr);
      //lcd.print(" ");
     // lcd.print(mapp);
     // lcd.print(" ");
    // lcd.print(atmos);      
     // lcd.print(" ");
     // lcd.print(taxo);
      
      //lcd.print(dinaimpulsov);
    //  lcd.print(" ");
     
    }
     
    // lcd.print(boost);
    //  lcd.print(" ");
     // lcd.print(kpa);
    //  lcd.print(ir);
     // lcd.print(pboost);
     // lcd.print(" ");
      //lcd.print(tmp37);
     //////////////////////////////////////////////////////////////////
      
    bytes[0]=(volts); //volts
      
    bytes[1]=(kpa); //turbo
      
    bytes[2]=(pboost); //pboost
      
    bytes[3]=(senstvaz); //senstvaz
      // bytes[4] = result & 255;                     
      // bytes[5] = (result & 768) >> 8;
      
    bytes[4] = taxo 0xFF// преобразовать в 4-байта  
      
    bytes[5] = (taxo 0xFF00) >> 8;  
      
    bytes[6] = (taxo 0xFF0000) >> 16
      
    bytes[7] = (taxo 0xFF000000) >> 24;  
         
      
    Serial.writebytes,8);      
       
     
    // delay(50);
       
      
    bytes[0] = 0;
      
    bytes[1] = 0;       
      
    bytes[2] = 0
      
    bytes[3] = 0
      
    bytes[4] = 0
      
    bytes[5] = 0;
      
    bytes[6] = 0;
      
    bytes[7] = 0;
          
    }
    /*
    void  inton() 



    */
    void  int_on() 


    count++; //увеличить счетчик volatile

    if (count >= 4)
        {
          
    taxometr micros()-time;  //время прихода 6-ти импульсов
          
    time micros(); //обнулить
         // taxometrrr = count;
          
    count 0;
        }  



    //void flash() //обработка прерывания таймера
    //{
      
    //} 
    Я пультом переключаю экраны на дисплее, а то не вмещается всё!

    Получается так, нажимаю один раз на пульт (можно на любую кнопку) - подключается приёмник и библиотека (начинает работать таймер2 и пожирать ресурсы), появляется меню на дисплее, нажимаю второй раз на нужную кнопку -
    функция "if (irrecv.decode(&results)) " отрабатывает нажатие, и выключает таймер2.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •