Библиотеки <IRremote.h> и <MsTimer2.h> не хотят работать вместе, почему?
Библиотеки <IRremote.h> и <MsTimer2.h> не хотят работать вместе, почему?
IRremote.h -эта библиотека использует третий таймер?
Обе библиотеки используют TIMER2
Спасибо Чип!
Тут ещё фигня выяснилась, при подключении этой библиотеки, (делал всё как в этом посте http://www.compcar.ru/forum/showthread.php?t=4959) начинает врать функция pulseIn(). То есть возвращает значение меньше чем должно быть. Например без неё длинна импульса
24000 мкс, а если подключаешь, то 18000 мкс. У меня из-за неё спидометр стал врать.
Как быть?
Используй либу TimerOne
А она может время замерять, длину импульса? функция micros(); у меня занята тахометром.
Вот пример использования
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.
У меня нулевой таймер занят тахометром.
Вабще мот мой скеч, он правда больше похож на черновик))))
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() //обработка прерывания таймера
//{
//}
Вот пока вот так сделал!
Я пультом переключаю экраны на дисплее, а то не вмещается всё!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)