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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    void setup()  
    {    

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

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

      
    attachInterrupt(0, fireUp, RISING);  
    }  
    void callback() {  timerCount++; }  

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

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

    // Функция обработки прерывания на падение  
    void fireDown()  
    {  
       
    lengthImpuls = timerCount;  
      
    detachInterrupt(0);  
      
    attachInterrupt(0, fireUp, RISING);  
    } 
    Последний раз редактировалось Chip; 01.11.2011 в 13:39.

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

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

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

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

    По умолчанию 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(12, 11, 7, 6, 5, 4);

    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 boost, voltage;
    byte bytes[8]; 

    void setup() 
     {
      
    lcd.begin(16, 2);
      
    pinMode(2, INPUT); 
      
    pinMode(3, INPUT); 
       
    // * LOW когда на порту LOW
       // * CHANGE , с LOW на HIGH и наоборот
       // * RISING  с LOW на HIGH
       // * FALLING  с HIGH на LOW
      
    attachInterrupt(0, int_on, RISING);
      
    //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(3, HIGH, 100000);  // Считывание длительности положительного импульса
        
    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(mapp, 358, 384, 735, 780);// 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 >= 0 && val <= 269)
    {
       
    senstvaz = map(val, 0, 269, -50, -1);
    }
    else if (
    val >= 270 && val <= 503)
    {
       
    senstvaz = map(val, 270, 503, 0, 19) + 2;
    }
    else if (
    val >= 504 && val <= 821)
    {
       
    senstvaz = map(val, 504, 821, 20, 55) + 2;
    }
    else if (
    val >= 822 && val <= 875)
    {
       
    senstvaz = map(val, 822, 875, 56, 65) + 2;
    }
    else if (
    val >= 876 && val <= 930)
    {
       
    senstvaz = map(val, 876, 930, 66, 80) + 2;
    }
    else if (
    val >= 931 && val <= 946)
    {
       
    senstvaz = map(val, 931, 946, 81, 85) + 2;
    }
    else if (
    val >= 947 && val <= 965)
    {
       
    senstvaz = map(val, 947, 965, 86, 97) + 2;
    }
    else if (
    val >= 966 && val <= 1002)
    {
       
    senstvaz = map(val, 966, 1002, 98, 126) + 2;
    }
    else if (
    val >= 1003 && val <= 1015)
    {
       
    senstvaz = map(val, 1003, 1015, 127, 140) + 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(0, 0);
     
    //lcd.print(dinaimpulsov);
       
    lcd.print("RPM ");
       
    lcd.print(taxo);
       
    lcd.setCursor(9, 0);
       
    lcd.print("V ");
       
    lcd.print(voltage,1);
       
    lcd.setCursor(0, 1);
       
    lcd.print("SPD ");
       
    lcd.print(ValSpCurr);
       
    lcd.setCursor(8, 1);
       
    lcd.print("BT ");
       
    lcd.print(boost);
     }
     if (
    ir == 1641431231)
     {
       
    lcd.clear(); 
       
    lcd.setCursor(0, 0);
       
    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.write( bytes,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
    Возраст
    51
    Сообщений
    320
    Вес репутации
    356

    По умолчанию 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(12, 11, 7, 6, 5, 4);

    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 boost, voltage;
    byte bytes[8]; 

    void setup() 
     {
      
    lcd.begin(16, 2);
      
    pinMode(2, INPUT); 
      
    pinMode(3, INPUT); 
       
    // * LOW когда на порту LOW
       // * CHANGE , с LOW на HIGH и наоборот
       // * RISING  с LOW на HIGH
       // * FALLING  с HIGH на LOW
      
    attachInterrupt(0, int_on, RISING);
      
    //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(3, HIGH, 70000);  // Считывание длительности положительного импульса
        
    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(mapp, 358, 384, 735, 780);// 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 >= 0 && val <= 269)
    {
       
    senstvaz = map(val, 0, 269, -50, -1);
    }
    else if (
    val >= 270 && val <= 503)
    {
       
    senstvaz = map(val, 270, 503, 0, 19) + 2;
    }
    else if (
    val >= 504 && val <= 821)
    {
       
    senstvaz = map(val, 504, 821, 20, 55) + 2;
    }
    else if (
    val >= 822 && val <= 875)
    {
       
    senstvaz = map(val, 822, 875, 56, 65) + 2;
    }
    else if (
    val >= 876 && val <= 930)
    {
       
    senstvaz = map(val, 876, 930, 66, 80) + 2;
    }
    else if (
    val >= 931 && val <= 946)
    {
       
    senstvaz = map(val, 931, 946, 81, 85) + 2;
    }
    else if (
    val >= 947 && val <= 965)
    {
       
    senstvaz = map(val, 947, 965, 86, 97) + 2;
    }
    else if (
    val >= 966 && val <= 1002)
    {
       
    senstvaz = map(val, 966, 1002, 98, 126) + 2;
    }
    else if (
    val >= 1003 && val <= 1015)
    {
       
    senstvaz = map(val, 1003, 1015, 127, 140) + 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(0, 0);
     
    //lcd.print(taxometr);
       
    lcd.print("RPM ");
       
    lcd.print(taxo);
       
    lcd.setCursor(9, 0);
       
    lcd.print(taxometr);
       
    //lcd.print("V ");
     //  lcd.print(voltage,1);
       
    lcd.setCursor(0, 1);
       
    lcd.print("SPD ");
       
    lcd.print(ValSpCurr);
       
    lcd.setCursor(8, 1);
      
    // lcd.print("BT ");
       
    lcd.print(dinaimpulsov);
     }
     if (
    ir == 1641431231)
     {
      
    // irper = 0; 
       
    lcd.clear(); 
       
    lcd.setCursor(0, 0);
       
    lcd.print("PBST ");
       
    lcd.print(pboost);
       
    lcd.setCursor(8, 1);
        
    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.write( bytes,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)

Ваши права

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