Добавил в прошивку сенсорные кнопки и передачу данных по SPI с дисплея магнитолы в комп.PHP код:#include <MsTimer2.h>
#include <CapSense.h>
#include <Spi.h>
CapSense Sensor1 = CapSense(2,3); // пин для сенсорной кнопки
byte MyBuff[20]; // SPI
byte IBUSbyte[6] = {0,0,0,0,0,0}; // массив сообещний
bool MafonPin = false; //true - данные идут в комп; false - управляют пинами ардио
void setup()
{
MsTimer2::set(100, ResetPinButton); // Таймер для установки выходов IBUS
Serial.begin(115200); // открываем порт для передачи в ПК
Spi.mode((1 << SPI2X) | (1 << CPOL) | (1 << CPHA)); //mode 3, clock/4
Serial1.begin(9600); // настройка порта IBUS
pinMode(7, INPUT); // Вход мафон
pinMode(8, OUTPUT); // Громкость +
pinMode(9, OUTPUT); // Громкость -
pinMode(10, OUTPUT); // Кнопка Next
pinMode(11, OUTPUT); // Кнопка Previous
pinMode(12, OUTPUT); // Кнопка Dial
pinMode(13, OUTPUT); // Кнопка R/T
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
digitalWrite(12, LOW);
digitalWrite(13, LOW);
}
void loop()
{
IBUS();
sensor();
SPI();
}
//*******************I-BUS Шина***********************
void IBUS()
{
ReadIBUSmsg();
ReadMAfonPin();
}
boolean ReadIBUSmsg()
{
while( Serial1.available() > 0 )
{
for( int i=1; i<6; i++ )
IBUSbyte[i-1] = IBUSbyte[i];
IBUSbyte[5] = Serial1.read();
if( IBUSbyte[0] == 0x50 && IBUSbyte[(IBUSbyte[1]+1)] == CalcXOR(IBUSbyte) )
{
if( MafonPin )
Serial.write(IBUSbyte, 6);
else
{
if( IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x11 ) digitalWrite(8, HIGH); // Нажал +
else if( IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x10 ) digitalWrite(9, HIGH); // Нажал -
else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x01 || IBUSbyte[4] == 0x11 ) ) digitalWrite(10, HIGH); // Нажата next
else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x21 ) digitalWrite(10, LOW); // Отпустил next
else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x08 || IBUSbyte[4] == 0x18 ) ) digitalWrite(11, HIGH); // Нажата previous
else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x28 ) digitalWrite(11, LOW); // Отпустил previous
else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x80 || IBUSbyte[4] == 0x90 ) ) digitalWrite(12, HIGH); // Нажата dial
else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0xA0 ) digitalWrite(12, LOW); // Отпустил dial
}
if( IBUSbyte[2] == 0xC8 && IBUSbyte[3] == 0x01 ) digitalWrite(13, HIGH); // Нажата R/T
MsTimer2::start();
return true;
}
}
return false;
}
byte CalcXOR( byte IBUSbyte[6] )
{
byte i;
byte checksum = 0;
byte length;
length = IBUSbyte[1] + 1;
for(i = 0; i < length; i++)
{
checksum ^= IBUSbyte[i];
}
return checksum;
}
void ResetPinButton()
{
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(13, LOW);
MsTimer2::stop();
}
void ReadMAfonPin()
{
if( digitalRead(7) == HIGH )
{
delay(2);
if( digitalRead(7) == HIGH ) MafonPin = true;
}
else MafonPin = false;
}
//*******************Sensor Kay***********************
void sensor()
{
long temp1 = Sensor1.capSense(30); // измерить емкость и сохранить
if (temp1 > 60)
{ digitalWrite(13, HIGH); } // включить светодиод
else { digitalWrite(13, LOW); } // выключить светодиод]
}
//*******************SPI Шина***********************
void SPI()
{
for (int i=0; i <= 19; i++)
{
MyBuff[i] = Spi.read();
}
Serial.write(MyBuff, 20);
}
1. Программа IR Kay видит все посылки SPI и очень быстро пытаеться среагировать на все это добро, ввиду чего не успевает рассмотреть 6 байт от IBus. Или на фоне SPI данных IR Kay видит 6 байт от IBus по другому . Не знаю что и делать, все клониться к тому что нужен еще один Arduino. Черт как не хотелось бы еще один цеплять. специально для этого брал модель MEGA чтоб реализовать все на одном.
может кто чего подскажет посоветует?
ps: если кто увидит в прошивке что я не вижу, просьба ткнуть пальцем.




Ответить с цитированием