Показано с 1 по 10 из 59

Тема: Arduino и I-BUS

Древовидный режим

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #10
    Модератор Аватар для XsanderS
    Регистрация
    05.05.2008
    Возраст
    43
    Сообщений
    829
    Вес репутации
    410

    По умолчанию Re: Carduino и I-BUS

    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(100ResetPinButton); // Таймер для установки выходов IBUS
      
    Serial.begin(115200);  // открываем порт для передачи в ПК
      
    Spi.mode((<< SPI2X) | (<< CPOL) | (<< CPHA));  //mode 3, clock/4 
      
    Serial1.begin(9600);     // настройка порта IBUS
      
    pinMode(7INPUT);      // Вход мафон
      
    pinMode(8OUTPUT);   // Громкость +
      
    pinMode(9OUTPUT);   // Громкость -
      
    pinMode(10OUTPUT); // Кнопка Next
      
    pinMode(11OUTPUT); // Кнопка Previous
      
    pinMode(12OUTPUT); // Кнопка Dial
      
    pinMode(13OUTPUT); // Кнопка R/T
      
    digitalWrite(8LOW);
      
    digitalWrite(9LOW);
      
    digitalWrite(10LOW);
      
    digitalWrite(11LOW);
      
    digitalWrite(12LOW);
      
    digitalWrite(13LOW);
    }

    void loop()
    {  
    IBUS();
    sensor();
    SPI();


    //*******************I-BUS Шина*********************** 

    void IBUS()
    {
      
    ReadIBUSmsg();
      
    ReadMAfonPin();
    }

    boolean ReadIBUSmsg()
    {
      while( 
    Serial1.available() > )
      {
        for( 
    int i=1i<6i++ )
          
    IBUSbyte[i-1] = IBUSbyte[i];
        
    IBUSbyte[5] = Serial1.read();
        if( 
    IBUSbyte[0] == 0x50 && IBUSbyte[(IBUSbyte[1]+1)] == CalcXOR(IBUSbyte) )
        {
          if( 
    MafonPin )
            
    Serial.write(IBUSbyte6);
          else
          {
            if( 
    IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x11 digitalWrite(8HIGH); // Нажал +
            
    else if( IBUSbyte[3] == 0x32 && IBUSbyte[4] == 0x10 digitalWrite(9HIGH); // Нажал -
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x01 || IBUSbyte[4] == 0x11 ) ) digitalWrite(10HIGH); // Нажата next
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x21 digitalWrite(10LOW); // Отпустил next
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x08 || IBUSbyte[4] == 0x18 ) ) digitalWrite(11HIGH); // Нажата previous
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0x28 digitalWrite(11LOW); // Отпустил previous
            
    else if( IBUSbyte[3] == 0x3B && ( IBUSbyte[4] == 0x80 || IBUSbyte[4] == 0x90 ) ) digitalWrite(12HIGH); // Нажата dial
            
    else if( IBUSbyte[3] == 0x3B && IBUSbyte[4] == 0xA0 digitalWrite(12LOW); // Отпустил dial
          
    }
          if( 
    IBUSbyte[2] == 0xC8 && IBUSbyte[3] == 0x01 digitalWrite(13HIGH); // Нажата R/T
          
    MsTimer2::start();
          return 
    true;
        }
      }
      return 
    false;
    }

    byte CalcXORbyte IBUSbyte[6] )
    {
      
    byte i;
      
    byte checksum 0;
      
    byte length;
      
    length IBUSbyte[1] + 1;
      for(
    0lengthi++)
      {
        
    checksum ^= IBUSbyte[i];
      }
      return 
    checksum;
    }
    void ResetPinButton()
    {
      
    digitalWrite(8LOW);
      
    digitalWrite(9LOW);
      
    digitalWrite(13LOW);
      
    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(13HIGH);   }    // включить светодиод 
      
    else { digitalWrite(13LOW); } // выключить светодиод]   


    //*******************SPI Шина*********************** 

    void SPI()
    {  
      for (
    int i=0;  <= 19i++) 
      { 
        
    MyBuff[i] = Spi.read();  
      }   
        
    Serial.write(MyBuff20); 

    Добавил в прошивку сенсорные кнопки и передачу данных по SPI с дисплея магнитолы в комп.

    1. Программа IR Kay видит все посылки SPI и очень быстро пытаеться среагировать на все это добро, ввиду чего не успевает рассмотреть 6 байт от IBus. Или на фоне SPI данных IR Kay видит 6 байт от IBus по другому . Не знаю что и делать, все клониться к тому что нужен еще один Arduino. Черт как не хотелось бы еще один цеплять. специально для этого брал модель MEGA чтоб реализовать все на одном.

    может кто чего подскажет посоветует?

    ps: если кто увидит в прошивке что я не вижу, просьба ткнуть пальцем.
    Последний раз редактировалось XsanderS; 17.12.2009 в 18:01.
    хороший модем должен качать пиво!
    Мой проект

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

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

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

Ваши права

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