PCCar.ru - Ваш автомобильный компьютер

PCCar.ru - Ваш автомобильный компьютер (http://pccar.ru/index.php)
-   iCarDS (http://pccar.ru/forumdisplay.php?f=121)
-   -   iCarDS + Arduino = iCarDuino (http://pccar.ru/showthread.php?t=16718)

Bersenev 28.01.2012 21:44

iCarDS + Arduino = iCarDuino
 
Вложений: 5
Начинаем работы по поддержке Arduino в iCar DS.

Текущая версия плагина поддерживает устройства JoyStick и PultIK http://carmonitor.ru/ru/-c-83_60.html на базе arduino http://www.compcar.ru/forum/showthread.php?t=4959

Для установки

- копируем содержимое архива в папку ..\iCar DS\Extentions\iCarDuino
- Регистрируем плагин запустив RunMe1st.cmd
- В iCarDSConfig закладка Global Vars добавляем duino_com=номер порта и duino_com_baudRate=скорость порта, допустим duino_com=20 и duino_com_baudRate=115200, если для связи с arduino используется COM20 и в скетче для ардуино задана скорость 115200
- Запускаем iCarDS со скином Хамелеон, на четвёртом экране настроек включаем загрузку плагина iCarDuino и перезапускаем iCarDS
- Заходим на четвёртый экран настроек -Настройка кнопок CarDuino
- Нажимаем рулевую кнопку, кнопку на ИК пульте или поворачиваем энкодер, в результате к списку добавиться код данной кнопки.
- Нажимаем на кнопку ЭКРАН или ДИНАМИЧЕСКИЕ КНОПКИ, и выбираем действие для текущей кнопки CarDuino.

http://content.foto.mail.ru/mail/ber...leon/i-505.jpg

- Повторяем действия для всех кнопок
- После выхода из экрана настроек, можно управлять икаром с рулевых кнопок, ИК пульта и энкодера без сторонних программ

Требуется FrameWork 2.0, iCarDS 1.7.0.8 и скин Хамелеон от 28/08/2012


Если вы в состоянии загрузить в arduino другой код, то можете ещё использовать температурные датчики DS18B20, акселерометр, два энкодера и до четырёх блоков реле


http://content.foto.mail.ru/mail/ber...leon/i-504.jpg

http://content.foto.mail.ru/mail/ber...leon/i-506.jpg

Блок реле можно приобрести у меня.
В качестве конструктора 750р за блок, в собранном виде 1000р.
Обращаемся в личку

http://content.foto.mail.ru/mail/ber...leon/i-600.jpg

http://content.foto.mail.ru/mail/ber...leon/i-507.jpg

Для этого соберите устройство по схеме
http://pccar.ru/attachment.php?attac...1&d=1350766943

Загружаете код для adruino , требуются библиотеки IRremote, OneWire

PHP код:

//
#include <IRremote.h> 
#include <OneWire.h>
#include <SPI.h>
#include <EEPROM.h>
  
#define RES_KEY_FLAG_ 0x76  // Флаг первого запуска скетча

byte bytes[4];

//-----------------------------------------
//- входы(пины) ардуино                   -
//-----------------------------------------
int WIRE_PIN 4;       // цифровой вход(пин) 1WIRE-шины ( температурные датчики )
int RECV_PIN 7;       // цифровой вход(пин) ИК приемника 
int REG_SELECT ;    // цифровой вход(пин), управляющий защёлкой (SS в терминах SPI)

int xpin=0;             // аналоговый вход(пин) для оси X акселерометра
int ypin=1;             // аналоговый вход(пин) для оси Y акселерометра
int zpin=2;             // аналоговый вход(пин) для оси Z акселерометра
int ENCODER1_PIN ;  // аналоговый вход(пин) для первого энкодера
int ENCODER2_PIN ;  // аналоговый вход(пин) для второго энкодера 
int RES_PIN ;       // аналоговый вход(пин) для резестивных(рулевых) кнопок 

//-----------------------------------------
//- переменные включения функций скетча   -
//-----------------------------------------
boolean is_ir_key false;
boolean is_temperature_sensors false;
boolean is_accelerometer false;
boolean is_encoder_1 false;
boolean is_encoder_2 false;
boolean is_res_keys false;
boolean is_relay_state false;

//-----------------------------------------
//- Переменные для температурных датчиков -
//-----------------------------------------
OneWire  ds(WIRE_PIN);
byte addr[8];            
byte data[12];
unsigned long temperature_sensors_milles;
unsigned long temperature_sensors_wait_milles 500// Интервал передачи данных от температурных датчиков

//-----------------------------------------
//- Переменные для ИК датчика             -
//-----------------------------------------
IRrecv irrecv(RECV_PIN); 
decode_results results
unsigned long ir_dt;
unsigned long ir_dt_old 0;
unsigned long ir_dt_millis;
unsigned long ir_wait_millis;
unsigned long ir_wait_first 250;  // время ожидания после первого нажатия кнопки
unsigned long ir_wait_next 200;    // время ожидания при удержании

//-----------------------------------------
//- Переменные для акселерометра          -
//-----------------------------------------
int xyz;
int xyz[4];
int n=0
int x_cal=0;
int y_cal=0//калибровка датчика
int z_cal=0;
unsigned long accelerometer_milles;
unsigned long accelerometer_wait_milles 80// Интервал передачи данных от акселерометра

//-----------------------------------------
//- Переменные для первого энкодера       -
//-----------------------------------------
unsigned long encoder1_dt;
unsigned long encoder1_key=0;
unsigned long encoder1_key_old=0;
int encoder1_key1 0;
int encoder1_key2 0;
int encoder1_key3 0;
unsigned long encoder1_millis;
unsigned long encoder1_wait_millis=1;
unsigned long encoder1_key_wait 500;  // время ожидания до следующего нажатия кнопки энкодера
unsigned long encoder1_key_wait_millis;
unsigned long encoder1_key_millis;
unsigned long encoder1_dt_sum 0;  
int encoder1_dt_n 0;

//-----------------------------------------
//- Переменные для второго энкодера       -
//-----------------------------------------
unsigned long encoder2_dt;
unsigned long encoder2_key=0;
unsigned long encoder2_key_old=0;
int encoder2_key1 0;
int encoder2_key2 0;
int encoder2_key3 0;
unsigned long encoder2_millis;
unsigned long encoder2_wait_millis=1;
unsigned long encoder2_key_wait 500;  // время ожидания до следующего нажатия кнопки энкодера
unsigned long encoder2_key_wait_millis;
unsigned long encoder2_key_millis;


//-----------------------------------------
//- Переменные для резестивных кнопок     -
//-----------------------------------------
unsigned long  res_dt 0
unsigned long  res_dt_sum=0
#define RES_DT_COUNT 500 // Количество считываемых данных
#define RES_DT_SKIP_COUNT 100 // Количество данных, которые надо пропустить при нажатии
#define RES_DT_POINT 6 // Точность
int res_dt_n 0;
unsigned long res_key=0;
unsigned long res_key_old=0;
unsigned long res_key_wait_first 500;  // время ожидания после первого нажатия кнопки
unsigned long res_key_wait_next 250;  // время ожидания до следующего нажатия кнопки
unsigned long res_key_wait_millis 0;
unsigned long res_key_millis;
unsigned long res_key_array[51][2];
unsigned int res_key_count 0;
unsigned int res_key_delta 3;

//-----------------------------------------
//- Переменные для управления блоком реле -
//-----------------------------------------
unsigned long relays_milles ;
unsigned long  relays_wait_milles 1000;
static 
uint8_t relays_state1 0x0000;
static 
uint8_t relays_state2 0x0000;
static 
uint8_t relays_state3 0x0000;
static 
uint8_t relays_state4 0x0000;

  
void setup() 

  
Serial.begin(115200); 
  
irrecv.enableIRIn(); // включить приемник 
    
xyz[0]=0;
    
xyz[1]=0// прочитать значение осей
    
xyz[2]=0;
    
ir_wait_millis ir_wait_first;
    
accelerometer_milles millis();
    
temperature_sensors_milles millis();
    
encoder1_key_millis millis();
    
encoder2_key_millis millis();
    
encoder1_millis millis();
    
encoder2_millis millis();
    
res_key_millis millis();
    
relays_milles millis();
    
    
encoder1_key_wait_millis=encoder1_key_wait;
    
encoder2_key_wait_millis=encoder2_key_wait;
    
    
unsigned int first_run_key EEPROM.read(0);
    if ( 
first_run_key == RES_KEY_FLAG_ )
    {
      
res_key_count EEPROM.read(1);
      
//EEPROM.write(addr, val);
      
for(int i=0i<res_key_count;i++) 
      { 
        
res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+50) - res_key_deltares_key_array[i][1] = res_key_array[i][0] + res_key_delta res_key_delta
      }
    }
    for(
int i=res_key_counti<51;i++) 
    { 
      
res_key_array[i][0] = 0xFFFFFFFFres_key_array[i][1] = 0xFFFFFFFF
    }
    
    
// Инициализируем шину SPI. Если используется программная реализация,
    // то вы должны сами настроить пины, по которым будет работать SPI.
    
SPI.begin();
    
pinMode(REG_SELECTOUTPUT);
    
digitalWrite(REG_SELECTLOW); // выбор ведомого - нашего регистра
    
SPI.transfer(relays_state4); // очищаем содержимое регистра
    
SPI.transfer(relays_state3);
    
SPI.transfer(relays_state2);
    
SPI.transfer(relays_state1);
    
// Завершаем передачу данных. После этого регистр установит
    // на выводах Q0-Q7 уровни, соответствующие записанным битам.
    
digitalWrite(REG_SELECTHIGH);
}
 
void loop() 
{
  if (
Serial.available() >= 1// Проверяем наличие команд от компьютера
  
{
     switch (
Serial.read())
    {
     case 
0x01// включить передачу данных от ик-пульта
       
is_ir_key true;
     break;

     case 
0x02// включить передачу данных от датчиков температуры
       
is_temperature_sensors true;
     break;

     case 
0x03// включить передачу данных от акселерометра
       
is_accelerometer true;
     break;

     case 
0x04// включить передачу данных от первого энкодера
       
is_encoder_1 true;
     break;

     case 
0x05// включить передачу данных от второго экнодера
       
is_encoder_2 true;
     break;

     case 
0x06// включить передачу данных от резестивных кнопок
       
is_res_keys true;
     break;

     case 
0x07// включить передачу данных о состоянии реле
       
is_relay_state true;
     break;

     case 
0x17// восстановить состояние реле
     
{
       
relays_state1 EEPROM.read(211);
       
relays_state2 EEPROM.read(212);
       
relays_state3 EEPROM.read(213);
       
relays_state4 EEPROM.read(214);

       
digitalWrite(REG_SELECTLOW);
       
SPI.transfer(relays_state4);
       
SPI.transfer(relays_state3);
       
SPI.transfer(relays_state2);
       
SPI.transfer(relays_state1);
       
digitalWrite(REG_SELECTHIGH);

       
bytes[0] = 0xBF;          // преобразовать в 4-байта  
       
bytes[1] = 0xFF;  
       
bytes[2] = 0xFF
       
bytes[3] = 0xFF
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
       
bytes[0] = relays_state4;          // преобразовать в 4-байта  
       
bytes[1] = relays_state3;  
       
bytes[2] = relays_state2
       
bytes[3] = relays_state1
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
     
}
     break;

     case 
0x81// выключить передачу данных от ик-пульта
       
is_ir_key false;
     break;

     case 
0x82// выключить передачу данных от датчиков температуры
       
is_temperature_sensors false;
     break;

     case 
0x83// выключить передачу данных от акселерометра
       
is_accelerometer false;
     break;

     case 
0x84// выключить передачу данных от первого энкодера
       
is_encoder_1 false;
     break;

     case 
0x85// выключить передачу данных от второго энкодера
       
is_encoder_2 false;
     break;

     case 
0x86// выключить передачу данных от резестивных кнопок
       
is_res_keys false;
     break;

     case 
0x87// выключить передачу данных от резестивных кнопок
       
is_relay_state false;
     break;

     case 
0x27// сохранить текущее состояние реле и отключить их
     
{
       
EEPROM.write(211,relays_state1);
       
EEPROM.write(212,relays_state2);
       
EEPROM.write(213,relays_state3);
       
EEPROM.write(214,relays_state4);

       
relays_state1 0;
       
relays_state2 0;
       
relays_state3 0;
       
relays_state4 0;

       
digitalWrite(REG_SELECTLOW);
       
SPI.transfer(relays_state4);
       
SPI.transfer(relays_state3);
       
SPI.transfer(relays_state2);
       
SPI.transfer(relays_state1);
       
digitalWrite(REG_SELECTHIGH);

       
bytes[0] = 0xBF;          // преобразовать в 4-байта  
       
bytes[1] = 0xFF;  
       
bytes[2] = 0xFF
       
bytes[3] = 0xFF
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
       
bytes[0] = relays_state4;          // преобразовать в 4-байта  
       
bytes[1] = relays_state3;  
       
bytes[2] = relays_state2
       
bytes[3] = relays_state1
       
Serial.writebytes,4); // отправить прочитаное значение компьютеру
     
}
     break;

     case 
0xAA// выключить передачу данных от резестивных кнопок
     
{
       while (
Serial.available() < 5) {}
       
int i Serial.read();
       
bytes[0] = Serial.read();          // преобразовать в 4-байта  
       
bytes[1] = Serial.read();  
       
bytes[2] = Serial.read(); 
       
bytes[3] = Serial.read(); 
       
unsigned long key_res_min 0key_res_min bytes[0]; key_res_min key_res_min 256 bytes[1];  
       
unsigned long key_res_max 0key_res_max bytes[2]; key_res_max key_res_max 256 bytes[3];  
       
res_key_array[i-1][0] = key_res_min
       
res_key_array[i-1][1] = key_res_max;
     }
     break;

     case 
0xAB// сбросить настройки резестивных кнопок в EEPROM
     
{
       
EEPROM.write(0,0); // сбросить флаг первого запуска
       
res_key_count 0// сбросить количество резистивных кнопок 
       
EEPROM.write(1,0); //
       
for(int i=0i<51;i++) 
       { 
        
res_key_array[i][0] = 0xFFFFFFFFres_key_array[i][1] = 0xFFFFFFFF
       }
     } 
     break;

     case 
0xBB// Команда управление реле
     
{
       while (
Serial.available() < 2) {}
       
byte relay_number Serial.read();
       
byte relay_command Serial.read();
       if( 
relay_number == && relay_command == 0xFF )
       {
          
bytes[0] = 0xBF;          // преобразовать в 4-байта  
          
bytes[1] = 0xFF;  
          
bytes[2] = 0xFF
          
bytes[3] = 0xFF
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
bytes[0] = relays_state4;          // преобразовать в 4-байта  
          
bytes[1] = relays_state3;  
          
bytes[2] = relays_state2
          
bytes[3] = relays_state1
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
       
}
       else
       {
         
uint8_t one ;
         switch (
relay_command)
         {
           case 
0x00// выключить реле № relay_number
           
if(relay_number <=8)
           {
             
relays_state1 relays_state1 & ~( one << (relay_number 1) );
           }
           else
           {
             if(
relay_number <=16)
             {
               
relays_state2 relays_state2 & ~( one << (relay_number 9) );
             }
             else
             {
               if(
relay_number <=24)
               {
                 
relays_state3 relays_state3 & ~( one << (relay_number 17) );
               }
               else
               {
                 if(
relay_number <=32)
                 {
                   
relays_state4 relays_state4 & ~( one << (relay_number 25) );
                 }
               }
             }
           }
           
digitalWrite(REG_SELECTLOW);
           
SPI.transfer(relays_state4);
           
SPI.transfer(relays_state3);
           
SPI.transfer(relays_state2);
           
SPI.transfer(relays_state1);
           
digitalWrite(REG_SELECTHIGH);

            
bytes[0] = 0xBF;          // преобразовать в 4-байта  
            
bytes[1] = 0xFF;  
            
bytes[2] = 0xFF
            
bytes[3] = 0xFF
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
            
bytes[0] = relays_state4;          // преобразовать в 4-байта  
            
bytes[1] = relays_state3;  
            
bytes[2] = relays_state2
            
bytes[3] = relays_state1
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
           
break;

           case 
0x01// включить реле № relay_number
           
if(relay_number <=8)
           {
             
relays_state1 relays_state1 | ( one << (relay_number 1) );
           }
           else
           {
             if(
relay_number <=16)
             {
               
relays_state2 relays_state2 | ( one << (relay_number 9) );
             }
             else
             {
               if(
relay_number <=24)
               {
                 
relays_state3 relays_state3 | ( one << (relay_number 17) );
               }
               else
               {
                 if(
relay_number <=32)
                 {
                   
relays_state4 relays_state4 | ( one << (relay_number 25) );
                 }
               }
             }
           }
           
digitalWrite(REG_SELECTLOW);
           
SPI.transfer(relays_state4);
           
SPI.transfer(relays_state3);
           
SPI.transfer(relays_state2);
           
SPI.transfer(relays_state1);
           
digitalWrite(REG_SELECTHIGH);

            
bytes[0] = 0xBF;          // преобразовать в 4-байта  
            
bytes[1] = 0xFF;  
            
bytes[2] = 0xFF
            
bytes[3] = 0xFF
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
            
bytes[0] = relays_state4;          // преобразовать в 4-байта  
            
bytes[1] = relays_state3;  
            
bytes[2] = relays_state2
            
bytes[3] = relays_state1
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
           
break;
         }

       }
     }
     break;
    }
  } 
  if( 
is_ir_key ir_key();                            //  ИК приёмник
  
if( is_temperature_sensors temperature_sensors();  //  температурные датчики
  
if( is_accelerometer accelerometer();              //  акселерометр
  
if( is_encoder_1 encoder_1();                      //  первый энкодер
  
if( is_encoder_2 encoder_2();                      //  второй энкодер
  
if( is_res_keys res_keys();                        //  резестивные кнопки
  
if( is_relay_state relay_state();
}
//----------------------------------------------------------------------------------
// Функция работы с реле
//----------------------------------------------------------------------------------
void relay_state()
{
  if( 
relays_milles relays_wait_milles millis() )
  {
    
bytes[0] = 0xBF;          // преобразовать в 4-байта  
    
bytes[1] = 0xFF;  
    
bytes[2] = 0xFF
    
bytes[3] = 0xFF
    
Serial.writebytes,4); // отправить прочитаное значение компьютеру
    
bytes[0] = relays_state4;       // преобразовать в 4-байта  
    
bytes[1] = relays_state3;  
    
bytes[2] = relays_state2
    
bytes[3] = relays_state1
    
Serial.writebytes,4); // отправить прочитаное значение компьютеру

    
relays_milles millis();
  }
}

//----------------------------------------------------------------------------------
// Функция работы с резестивными кнопками
//----------------------------------------------------------------------------------
void res_keys()
{  
  {
    
res_dt analogRead(RES_PIN); // прочитать данные АЦП 
    
if( res_dt >= 0x05 && res_dt <= 0x3F0 )
    { 
      
res_dt_n++;
      if( 
res_dt_n RES_DT_SKIP_COUNT )
      {
        
res_dt_sum += (res_dt << RES_DT_POINT);
        if( 
res_dt_n == RES_DT_COUNT)
        { 

          
res_key = (res_dt_sum / (RES_DT_COUNT RES_DT_SKIP_COUNT));
          
res_key = (((((( res_dt_sum / (( RES_DT_COUNT RES_DT_SKIP_COUNT ) + (2^(RES_DT_POINT-1)-1) ) >> (RES_DT_POINT-1)) + 1) >> 1) + 1)>> 1)); // + 1) >> 1;
          
res_dt_sum 0res_dt_n 0;
        }
       }
    }
    else
    {
      
res_dt_sum 0res_dt_n 0res_key 0;
      
res_key_wait_millis 0;
    }
  }
  if( 
res_key_millis res_key_wait_millis*<= millis() ) { res_key_old 0; }
  if( 
res_key_millis res_key_wait_millis <= millis() )
  {
    if( 
res_key != )
    {
      if( ((
res_key_old res_key_delta) <=  res_key) && (res_key <= (res_key_old res_key_delta)) )
      {
        
res_key_millis millis(); res_key_wait_millis res_key_wait_next;
      }
      else
      {
        
res_key_millis millis(); res_key_wait_millis res_key_wait_first;
      }

        
int i 0int exit = 0;
        while( 
res_key_array[i][0] != 0xFFFFFFFF && exit == )
        {
          if( (
res_key_array[i][0] <= res_key) && (res_key <= res_key_array[i][1]) ) exit = 1; else i++;
        }
        if( exit == 

        { 
          
bytes[0] = 0xAA;          // преобразовать в 4-байта  
          
bytes[1] = 0;  
          
bytes[2] = RES_PIN
          
bytes[3] = i+1
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
        
}
        else
        {
          if( 
res_key_count 50 )
          {
            
res_key_array[res_key_count][0] = res_key res_key_deltares_key_array[res_key_count][1] = res_key res_key_delta;
            
res_key_count++;
            
            
EEPROM.write(1res_key_count); // Запоминаем количество кнопок
            
byte one_byte res_key 256;
            
EEPROM.write(res_key_count+1one_byte ); // Запоминаем старший байт значения кнопки
            
one_byte res_key one_byte 256;
            
EEPROM.write(res_key_count+1+50one_byte ); // Запоминаем младший байт значения кнопки
            
EEPROM.write(0RES_KEY_FLAG_);
          
            
bytes[0] = 0xAA;          // преобразовать в 4-байта  
            
bytes[1] = 0;  
            
bytes[2] = RES_PIN
            
bytes[3] = res_key_count
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
}
          else
          {
            
bytes[0] = 0xAA;          // преобразовать в 4-байта  
            
bytes[1] = 0xAA;  
            
bytes[2] = (res_key 0xFF00) >> 8
            
bytes[3] = res_key 0xFF
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
}
        }
    }
    
res_key_old res_key;
  }
}

//----------------------------------------------------------------------------------
// Функция работы с первым энкодером
//----------------------------------------------------------------------------------
void encoder_1()
{
  if( 
encoder1_key_millis encoder1_key_wait_millis*millis() ) { encoder1_key_old 0; }
  if( 
encoder1_millis encoder1_wait_millis millis() )
  {
    
encoder1_millis millis();
    
encoder1_dt analogRead(ENCODER1_PIN); // прочитать данные АЦП
    
    
if( encoder1_dt >= 0x246 && encoder1_dt <= 0x286 )
    { 
// Здесь обрабатываем удержание кнопки
      
encoder1_key ENCODER1_PIN;
      
encoder1_key = (encoder1_key << 16) | 0x030000EE;
      if ( 
encoder1_key == encoder1_key_old )
      { 
// Здесь обрабатываем удержание кнопки
        
if( encoder1_key_millis encoder1_key_wait_millis millis() )
        { 
          
bytes[0] = encoder1_key 0xFF;          // преобразовать в 4-байта  
          
bytes[1] = (encoder1_key 0xFF00) >> 8;  
          
bytes[2] = (encoder1_key 0xFF0000) >> 16
          
bytes[3] = (encoder1_key 0xFF000000) >> 24;
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
encoder1_key_millis millis(); encoder1_key_wait_millis encoder1_key_wait//ir_wait_next;
        
}
      }
      else 
      { 
// Здесь обрабатываем первое нажатие кнопки
        
encoder1_key_millis millis(); encoder1_key_wait_millis 50//ir_wait_first;
      

      
encoder1_key_old encoder1_key;
    } 
    else
    {
      if( 
encoder1_dt >= 0x3E0 && encoder1_dt <= 0x410 && encoder1_key3 != )
      {
        if( (
encoder1_key2 == 2) && (encoder1_key3 == 3))
        { 
          
bytes[0] = 0xEE;          // преобразовать в 2-байта 
          
bytes[1] = 0
          
bytes[2] = ENCODER1_PIN;
          
bytes[3] = 1;
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
        
}
        else
        {
          if( (
encoder1_key2 == 3) && (encoder1_key3 == 2) )
          {
            
bytes[0] = 0xEE;          // преобразовать в 2-байта 
            
bytes[1] = 0
            
bytes[2] = ENCODER1_PIN;
            
bytes[3] = 2;
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
          
}
        }
        
encoder1_key1=encoder1_key2encoder1_key2=encoder1_key3encoder1_key3=1;
      }
      else
      {
        if( 
encoder1_dt >= 0xA0 && encoder1_dt <= 0xF0 && encoder1_key3 != )
        {
          
encoder1_key1=encoder1_key2encoder1_key2=encoder1_key3encoder1_key3=2;
        }
        else
        {
          if( 
encoder1_dt >= 0x1A0 && encoder1_dt <= 0x200 && encoder1_key3 != )
          {
            
encoder1_key1=encoder1_key2encoder1_key2=encoder1_key3encoder1_key3=3;
          }
        }
      }
    }
  }
}

//----------------------------------------------------------------------------------
// Функция работы со вторым энкодером
//----------------------------------------------------------------------------------
void encoder_2()
{  
  if( 
encoder2_key_millis encoder2_key_wait_millis*millis() ) { encoder2_key_old 0; }
  if( 
encoder2_millis encoder2_wait_millis millis() )
  {
    
encoder2_millis millis();
    
encoder2_dt analogRead(ENCODER2_PIN); // прочитать данные АЦП
    
if( encoder2_dt >= 0x246 && encoder2_dt <= 0x286 )
    { 
// Здесь обрабатываем удержание кнопки
      
encoder2_key ENCODER2_PIN;
      
encoder2_key = (encoder2_key << 16) | 0x030000EE;
      if ( 
encoder2_key == encoder2_key_old )
      { 
// Здесь обрабатываем удержание кнопки
        
if( encoder2_key_millis encoder2_key_wait_millis millis() )
        { 
          
bytes[0] = encoder2_key 0xFF;          // преобразовать в 4-байта  
          
bytes[1] = (encoder2_key 0xFF00) >> 8;  
          
bytes[2] = (encoder2_key 0xFF0000) >> 16
          
bytes[3] = (encoder2_key 0xFF000000) >> 24
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру
          
encoder2_key_millis millis(); encoder2_key_wait_millis encoder2_key_wait//ir_wait_next;
        
}
      }
      else 
      { 
// Здесь обрабатываем первое нажатие кнопки
        
encoder2_key_millis millis(); encoder2_key_wait_millis 50//ir_wait_first;
      

      
encoder2_key_old encoder2_key;
    } 
    else
    {
      if( 
encoder2_dt >= 0x3E0 && encoder2_dt <= 0x410 && encoder2_key3 != )
      {
        if( (
encoder2_key2 == 2) && (encoder2_key3 == 3))
        { 
          
bytes[0] = 0xEE;          // преобразовать в 2-байта 
          
bytes[1] = 0
          
bytes[2] = ENCODER2_PIN;
          
bytes[3] = 1;
          
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
        
}
        else
        {
          if( (
encoder2_key2 == 3) && (encoder2_key3 == 2) )
          {
            
bytes[0] = 0xEE;          // преобразовать в 2-байта 
            
bytes[1] = 0
            
bytes[2] = ENCODER2_PIN;
            
bytes[3] = 2;
            
Serial.writebytes,4); // отправить прочитаное значение компьютеру     
          
}
        }
        
encoder2_key1=encoder2_key2encoder2_key2=encoder2_key3encoder2_key3=1;
      }
      else
      {
        if( 
encoder2_dt >= 0xA0 && encoder2_dt <= 0xF0 && encoder2_key3 != )
        {
          
encoder2_key1=encoder2_key2encoder2_key2=encoder2_key3encoder2_key3=2;
        }
        else
        {
          if( 
encoder2_dt >= 0x1A0 && encoder2_dt <= 0x200 && encoder2_key3 != )
          {
            
encoder2_key1=encoder2_key2encoder2_key2=encoder2_key3encoder2_key3=3;
          }
        }
      }
    }
  }
}

//----------------------------------------------------------------------------------
// Функция работы с ИК приёмником
//----------------------------------------------------------------------------------
void ir_key()
{
  if( 
ir_dt_millis ir_wait_millis*millis() ) { ir_dt_old 0; }
  if (
irrecv.decode(&results))  
  {
   if (
results.value && results.value 0xFFFFFFFF
   {
    
ir_dt results.value;
    if ( 
ir_dt == ir_dt_old )
    { 
// Здесь обрабатываем удержание кнопки
      
if( ir_dt_millis ir_wait_millis millis() )
      { 
        
bytes[0] = ir_dt 0xFF;          // преобразовать в 4-байта  
        
bytes[1] = (ir_dt 0xFF00) >> 8;  
        
bytes[2] = (ir_dt 0xFF0000) >> 16
        
bytes[3] = (ir_dt 0xFF000000) >> 24
        
Serial.writebytes,4); // отправить прочитаное значение компьютеру
        
ir_dt_millis millis(); ir_wait_millis ir_wait_next;
      }
    }
    else 
    { 
// Здесь обрабатываем первое нажатие кнопки
      
bytes[0] = ir_dt 0xFF;          // преобразовать в 4-байта  
      
bytes[1] = (ir_dt 0xFF00) >> 8;  
      
bytes[2] = (ir_dt 0xFF0000) >> 16
      
bytes[3] = (ir_dt 0xFF000000) >> 24
      
Serial.writebytes,4); // отправить прочитаное значение компьютеру
      
ir_dt_millis millis(); ir_wait_millis ir_wait_first;
    } 
    
ir_dt_old ir_dt;
   }
   else
   {
      
ir_dt_millis millis(); ir_wait_millis ir_wait_first;
   }
   
irrecv.resume();
  }
}

//----------------------------------------------------------------------------------
// Функция работы с акселерометром
//----------------------------------------------------------------------------------
void accelerometer()
{
  if( 
accelerometer_milles accelerometer_wait_milles millis() )
  {
    
xyz[0]=analogRead(xpin);
    
xyz[1]=analogRead(ypin); // прочитать значение осей
    
xyz[2]=analogRead(zpin);
    
xyz[3]=0;

    
bytes[0] = 0xEFbytes[1] = 0xFFbytes[2] = 0xFFbytes[3] = 0xFF
    
Serial.writebytes,4); // отправить 0xEFFFFFFF - код данных от акселерометра
    
Serial.write( (byte*)&xyz,8); // отправить значения осей 
    
accelerometer_milles millis();
  }
}

//----------------------------------------------------------------------------------
// Функция определение температуры датчиков DS18B20
//----------------------------------------------------------------------------------
void temperature_sensors()
{
  if( 
temperature_sensors_milles temperature_sensors_wait_milles millis() )
  {
    
temperature_sensors_milles millis();
  
    
byte i;

    if (!
ds.search(addr)) 
    {                       
// поиск нового датчика
      
ds.reset_search();    // если не нашли, сбрасываем поиск в начало
      
return;               // и выходим 
    
}
  
    
// Часть кода, которая ниже, выполняется только если
    // найден новый датчик, с которым ещё не работали в
    // главном цикле до сброса поиска

    
if (OneWire::crc8addr7) != addr[7]) // Проверка CRC 
    

      return; 
// Если не пройдена, то в начало главного цикла и продолжаем поиск других датчиков
    
}
  
    if (
addr[0] != 0x28// Проверка того, что найденное устройство - температурный датчик DS18B20 
    
{        
      return; 
// Если не он, то опять в начало главного цикла на продолжение поиска
    
}
  
    
ds.reset();
    
ds.select(addr);
    
ds.write(0x44,1);
    
ds.reset();
    
ds.select(addr);
    
ds.write(0xBE);

    
bytes[0] = 0xFFbytes[1] = 0xFFbytes[2] = 0xFFbytes[3] = 0xFF
    
Serial.writebytes,4); // отправить 0xFFFFFFFF - код температурного датчика
    
Serial.writeaddr,8); // отправить 8 байтовый номер температурного датчика 
  
    
for ( 09i++) // получаем данные с датчика
    
{         
      
data[i] = ds.read();
    }
    
bytes[0] = 0;          // отправляем байты содержащие температуру  
    
bytes[1] = 0;  
    
bytes[2] = data[0]; 
    
bytes[3] = data[1]; 
    
Serial.writebytes,4); // значение температурного датчика 
  
}


Устанавливаете плагин iCarDuino 1.0.0.5

В duino.ini добавляем такие строки, если их там нет


duino_shift_state=0
calibrate_x=418
calibrate_y=400
calibrate_z=568
calibrate_n=15
calibrate_a=48
plugin_iCarDuino_is=1

и эти переменные, которые включают или выключают использование ик пульта, энкодеров или резестивных кнопок, если что то вами не используется. 0 - выключено, 1 - включено.

duino_is_ir_key=1
duino_is_encoder_1=1
duino_is_encoder_2=1
duino_is_res_keys=1



Запускаете икар, при первом запуске в папке используемого скина ..\Chameleon\DuinoKey будет создан файл duino_temp_sensors.ini с таким содержимым, у вас будут свои номера датчиков

temp_sensor_28FFC919030000D6=28FFC919030000D6
temp_sensor_2812EA1903000003=2812EA1903000003

Меняем название датчиков, допустим

temp_sensor_28FFC919030000D6=Салон
temp_sensor_2812EA1903000003=Улица

Теперь для того чтобы можно было вывести датчики в скин, в файл ..\Chameleon\Labels\label_list.txt добавляем такие строки

temp_sensor_28FFC919030000D6
temp_sensor_2812EA1903000003

а в ..\Chameleon\Labels\label_ru.ini (имя файла зависит от используемого языка) такие

l_label_temp_sensor_28FFC919030000D6=t салон,С
l_label_temp_sensor_2812EA1903000003=t улица,С

Теперь можно использовать температурные показатели в скине

Alex-NN 28.01.2012 22:37

Потестил дома.
Все работает!!!!:smile2::smile2::smile2:
Огромное спасибо Авторам!!!!:yes4::yes4::yes4:
Конечно, гораздо удобнее все настройки кнопок Ардуино делать в Икаре.
И раньше пробовал Ардуино+ИК-пульт в Икаре, работало, но сейчас гораэдо удобнее!!!

Я так понимаю Икар пока единственная оболочка с такими возможностями.

Надо поразбираться, как градусники прицепить.

Bersenev 28.01.2012 22:46

Цитата:

Сообщение от Alex-NN (Сообщение 209149)
Надо поразбираться, как градусники прицепить.

Градусники это следующий шаг, уже занимаюсь. Но для градусников потребуется менять код в ардуино.

Alex-NN 28.01.2012 22:56

Цитата:

Сообщение от Bersenev (Сообщение 209150)
Градусники это следующий шаг, уже занимаюсь. Но для градусников потребуется менять код в ардуино.

Думаю, Chip сможет помочь.:blush: Наверное, он должен быть заинтересован.

Да, стирание кодов пульта?

Bersenev 28.01.2012 23:05

Подробнее, что именно происходит.

В списке нет уже назначенных кнопок? или они есть, но при выборе кнопки в списке, в правой панели не отображается действие для этой кнопки?

Alex-NN 28.01.2012 23:06

Цитата:

Сообщение от Bersenev (Сообщение 209155)
Подробнее, что именно происходит.

В списке нет уже назначенных кнопок? или они есть, но при выборе кнопки в списке, в правой панели не отображается действие для этой кнопки?

Пардон, перезагрузка Икара помогла. Все отображается.:yes4::blush:

Bersenev 28.01.2012 23:11

Цитата:

Сообщение от Alex-NN (Сообщение 209154)
Думаю, Chip сможет помочь.:blush: Наверное, он должен быть заинтересован.

Да особой необходимости нет, думаю справимся, тем более всё необходимое Chip уже сделал.

Цитата:

Сообщение от Alex-NN (Сообщение 209154)
Да, стирание кодов пульта?

А это нужно?

Alex-NN 28.01.2012 23:16

Цитата:

Сообщение от Bersenev (Сообщение 209157)
А это нужно?

Фиг знает... Не понял пока.:blush::smile2:

ewgen1 29.01.2012 11:11

Цитата:

Сообщение от Bersenev (Сообщение 209150)
Градусники это следующий шаг, уже занимаюсь. Но для градусников потребуется менять код в ардуино.

тоже очень интересует тема градусников

autohirurg 30.01.2012 17:27

Извините что не в тему но так уж вопрос поставили изначально.
Градусники, кнопочки, все клаассно!!!
У меня вопрос!
Андрей надо бы сообразить меню климатконтроля, всместе со всеми градусниками и управлением, т.к я уже давно жду управление климатом, дело в том что после замены двигателя и бльшей части электроники в машине, мой блок климата работает не правильно, он не может связаться с блоком управления двигателем и мне нужно сделать данные действия по другому - через кардуино и разъём OBD2. Т.К через ОБД2 и программу тестер ецу от Валентина8080 кондей включается и работает!

Программа климат контроля на кардуино уже давно сделана в большей степени и висит где то на compcar.ru/ если надо я найду и дам ссылочку. Там единственное надо поменять внешний вид и немного добавить функций управления и датчиков.
Каковы мнения будут.?


Часовой пояс GMT +4, время: 02:45.

Работает на vBulletin® версия 3.8.4.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot