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)

admin 01.06.2013 11:33

Думаю что возможно, http://compcar.ru/forum/showthread.php?t=9462

AlexIz 01.06.2013 15:24

Что-то у меня не получается запустить кардуину. Контроллер на 168 атмеге из carmonitor. Ранее работал с HotKey. Соответственно укоротил скетч Berseneva до необходимого мне. Поключаю только резистивные кнопки и температурные датчики. Скетч такой:
//

#include
#include
#include

#define RES_KEY_FLAG_ 0x76 // Флаг первого запуска скетча

byte bytes[4];

//-----------------------------------------
//- входы(пины) ардуино -
//-----------------------------------------
int WIRE_PIN = 4; // цифровой вход(пин) 1WIRE-шины ( температурные датчики )

int REG_SELECT = 8 ; // цифровой вход(пин), управляющий защёлкой (SS в терминах SPI)


int RES_PIN = 5 ; // аналоговый вход(пин) для резестивных(рулевых) кнопок

//-----------------------------------------
//- переменные включения функций скетча -
//-----------------------------------------
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; // Интервал передачи данных от температурных датчиков



//-----------------------------------------
//- Переменные для резистивных кнопок -
//-----------------------------------------
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;



void setup()
{
Serial.begin(115200);
temperature_sensors_milles = millis();
res_key_millis = millis();


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=0; i {
res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+50) - res_key_delta; res_key_array[i][1] = res_key_array[i][0] + res_key_delta + res_key_delta;
}
}
for(int i=res_key_count; i<51;i++)
{
res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
}

// Инициализируем шину SPI. Если используется программная реализация,
// то вы должны сами настроить пины, по которым будет работать SPI.
SPI.begin();
pinMode(REG_SELECT, OUTPUT);
digitalWrite(REG_SELECT, LOW); // выбор ведомого - нашего регистра

// Завершаем передачу данных. После этого регистр установит
// на выводах Q0-Q7 уровни, соответствующие записанным битам.
digitalWrite(REG_SELECT, HIGH);
}

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: // восстановить состояние реле
{

digitalWrite(REG_SELECT, LOW);

digitalWrite(REG_SELECT, HIGH);

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

Serial.write( bytes,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: // сохранить текущее состояние реле и отключить их
{
}
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 = 0; key_res_min = bytes[0]; key_res_min = key_res_min * 256 + bytes[1];
unsigned long key_res_max = 0; key_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=0; i<51;i++)
{
res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
}
}
break;

case 0xBB: // Команда управление реле
{

}
}
}
}


//----------------------------------------------------------------------------------
// Функция работы с резистивными кнопками
//----------------------------------------------------------------------------------
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 = 0; res_dt_n = 0;
}
}
}
else
{
res_dt_sum = 0; res_dt_n = 0; res_key = 0;
res_key_wait_millis = 0;
}
}
if( res_key_millis + res_key_wait_millis*2 <= millis() ) { res_key_old = 0; }
if( res_key_millis + res_key_wait_millis <= millis() )
{
if( res_key != 0 )
{
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 = 0; int exit = 0;
while( res_key_array[i][0] != 0xFFFFFFFF && exit == 0 )
{
if( (res_key_array[i][0] <= res_key) && (res_key <= res_key_array[i][1]) ) exit = 1; else i++;
}
if( exit == 1 )
{
bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0;
bytes[2] = RES_PIN;
bytes[3] = i+1;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
else
{
if( res_key_count < 50 )
{
res_key_array[res_key_count][0] = res_key - res_key_delta; res_key_array[res_key_count][1] = res_key + res_key_delta;
res_key_count++;

EEPROM.write(1, res_key_count); // Запоминаем количество кнопок
byte one_byte = res_key / 256;
EEPROM.write(res_key_count+1, one_byte ); // Запоминаем старший байт значения кнопки
one_byte = res_key - one_byte * 256;
EEPROM.write(res_key_count+1+50, one_byte ); // Запоминаем младший байт значения кнопки
EEPROM.write(0, RES_KEY_FLAG_);

bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0;
bytes[2] = RES_PIN;
bytes[3] = res_key_count;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
else
{
bytes[0] = 0xAA; // преобразовать в 4-байта
bytes[1] = 0xAA;
bytes[2] = (res_key & 0xFF00) >> 8;
bytes[3] = res_key & 0xFF;
Serial.write( bytes,4); // отправить прочитаное значение компьютеру
}
}
}
res_key_old = res_key;
}
}


//----------------------------------------------------------------------------------
// Функция определение температуры датчиков 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::crc8( addr, 7) != 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] = 0xFF; bytes[1] = 0xFF; bytes[2] = 0xFF; bytes[3] = 0xFF;
Serial.write( bytes,4); // отправить 0xFFFFFFFF - код температурного датчика
Serial.write( addr,8); // отправить 8 байтовый номер температурного датчика

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

Скопмпилировался и записался нормально.
Далее указал порт и скорость, ну и всё, что написано в первом сообщении. При настройках ничего не происходит. Ни температуры, ни нажатия клавиш. Термодатчики тоже не определились. Правда в файле temp_sensor.ini были каких-то 4 адреса, но у меня только два датчика. Куда смотреть?

Bersenev 01.06.2013 19:50

Цитата:

Сообщение от AlexIz (Сообщение 260178)
Контроллер на 168 атмеге из carmonitor.

С данным контроллером я скетч не проверял. Данный скетч работает с EEPROM, вопрос есть ли эта память в твоём ардуино.

Цитата:

Сообщение от AlexIz (Сообщение 260178)
Термодатчики тоже не определились. Правда в файле temp_sensor.ini были каких-то 4 адреса, но у меня только два датчика.

Очисти содержимое файла temp_sensor.ini, запусти икар и потом посмотри его содержимое

OsDima 01.06.2013 22:38

Цитата:

Сообщение от admin (Сообщение 260168)
Думаю что возможно, http://compcar.ru/forum/showthread.php?t=9462

Тема хорошая. Но про мой чип в светодиодах - 2811 там нет. Библиотека дугая и скейтч надо переделывать под неё. SPI уже распаян на реле и поэтому попробывать немогу. Надо еще UNO покупать (это не сейчас). Тем более что мне надо всего одна цифровая линия и опыта пока мало в написании и подгонки программ. LED.showRGB - пока не понимаю как организовать аргументы для неё. Хоть программа по логике очень проста но застрял на этом:

#include "FastSPI_LED2.h"

WS2811Controller800Mhz<5> LED; // задаём через какую ногу выводятся данные для светодиодов
unsigned long nTime, rTime, t;

void setup()
{
// инициализация ленты
{ LED.init(); }
delay(1); //пауза для инициализации ленты
//--------------------
Serial.begin(115200);
}

void loop()
{
uint8_t data;
t = millis(); //получаем текущее время
Serial.write(170); //отправляем байт синхронизации для ПК
if (Serial.read()) //ждем от ПК первый байт с колличеством пикселей ленты
{
uint16_t pix_num = data*3; //получаем общее колличество цветовых каналов ленты
uint16_t eTime = micros()-rTime; //получим время с момента окончания загрузки
if( eTime < 900) delay(eTime); //ждем полной инициализации (минус 100мкс для загрузки след. байта)
for(uint16_t i=0; i { int num = 5; LED.showRGB(num, Serial.read()); //читаем UART и сразу сбрасываем в ленту пиксели
__________________________________________________ ________________________________________________
rTime = micros(); //стартуем счетчик времени инициализации ленты
nTime = t; // //обнулить время простоя
} else {
if((t - nTime) > 4000) ///гасим подсветку если нет потока более 2 сек
{
for(int16_t z=0; z<768; z++) LED.init(); //погасить все пикселы ленты
nTime = t;
}
}
}
//************************************************** *************************
unsigned char uart_read(void)
{ uint8_t val;
for (uint8_t i=0; i<255; ++i) //цикл ожидания байта данных из UART порта, время ожидания 2560мкс
{
if(Serial.read()>0) break; //если байт данных получен, то цикл прерывается
delay(10); //время ожидания байта
}
return val;
}

AlexIz 01.06.2013 23:38

Цитата:

Сообщение от Bersenev (Сообщение 260205)
С данным контроллером я скетч не проверял. Данный скетч работает с EEPROM, вопрос есть ли эта память в твоём ардуино.
Очисти содержимое файла temp_sensor.ini, запусти икар и потом посмотри его содержимое

ATMega168 EEPROM 16кБ

temp_sensor.ini чистил, но ничего туда не записалось. Как проверить видит ли iCar ардуину?

AlexIz 02.06.2013 22:55

Поменял контроллер запустил с полным скетчем. В файле temp_sensor.ini пусто. Контроллер периодически моргает синим диодом "L".
Чего делать то?

Bersenev 03.06.2013 10:50

Цитата:

Сообщение от AlexIz (Сообщение 260291)
Чего делать то?

Давай сделаем так, заливаешь в ардуино скетч от кармонитора для резистивных кнопок. Пробуешь что бы он работал с их программой. Как убеждаешься что всё работает, подключаешь к икару через плагин iCarDuino. Если резистивные кнопки через iCarDuino заработают, то убедимся что всё с плагином нормально и я сделаю тебе скетч только под термодатчики и резистивные кнопки.

AlexIz 03.06.2013 21:52

Т.е. запускать в iCar со скетчем от Chipa? Я правильно понял?

Bersenev 03.06.2013 21:59

Цитата:

Сообщение от AlexIz (Сообщение 260360)
Т.е. запускать в iCar со скетчем от Chipa? Я правильно понял?

Правильно

AlexIz 03.06.2013 22:01

Да, я пробовал и на полном скетче с другим контроллером и на другом компе. Результат одинаковый.

Bersenev 03.06.2013 22:10

Цитата:

Сообщение от AlexIz (Сообщение 260362)
Да, я пробовал и на полном скетче с другим контроллером и на другом компе. Результат одинаковый.

1. В ардуино скетч от Chip-а и программа Chip-а работает?
2. В ардуино скетч от Chip-а и плагин iCarDuino в Настройках кнопок CarDuino что то происходит?

AlexIz 03.06.2013 22:48

Цитата:

Сообщение от Bersenev (Сообщение 260314)
Давай сделаем так, заливаешь в ардуино скетч от кармонитора для резистивных кнопок. Пробуешь что бы он работал с их программой. Как убеждаешься что всё работает, подключаешь к икару через плагин iCarDuino. Если резистивные кнопки через iCarDuino заработают, то убедимся что всё с плагином нормально и я сделаю тебе скетч только под термодатчики и резистивные кнопки.

Сделал, как ты написал, кнопки работают.:tease:
А надо ли какие-то драйверы для ардуино ставить?

Bersenev 03.06.2013 22:56

Цитата:

Сообщение от AlexIz (Сообщение 260366)
Сделал, как ты написал, кнопки работают.:tease:

То есть хочешь сказать, что скетч от Chip-a работает в iCarDuino?

Цитата:

Сообщение от AlexIz (Сообщение 260366)
А надо ли какие-то драйверы для ардуино ставить?

Вообще-то надо, надо. Драйвера от FTDI для создания com-порта

AlexIz 03.06.2013 23:06

Цитата:

Сообщение от Bersenev (Сообщение 260369)
То есть хочешь сказать, что скетч от Chip-a работает в iCarDuino?

Да. При подключении слышны звуки нажатия кнопок.

Цитата:

Сообщение от Bersenev (Сообщение 260369)
Вообще-то надо, надо. Драйвера от FTDI для создания com-порта

Ну, если com порт появляется, значит всё есть.

Bersenev 03.06.2013 23:10

Цитата:

Сообщение от AlexIz (Сообщение 260371)
Да. При подключении слышны звуки нажатия кнопок.

Раз плагин работает, то давай к каким пинам подсоединены резистивные кнопки и термодатчики, сделаю скетч.

AlexIz 04.06.2013 08:04

Всё как на твоей схеме: 5-аналоговый - кнопки, 5 цифровой - термодатчики.

Bersenev 04.06.2013 09:11

Цитата:

Сообщение от AlexIz (Сообщение 260388)
Всё как на твоей схеме: 5-аналоговый - кнопки, 5 цифровой - термодатчики.

Пробуй

Код:

//
#include
#include
 
#define RES_KEY_FLAG_ 0x77  // Флаг первого запуска скетча

byte bytes[4];

//-----------------------------------------
//- входы(пины) ардуино                  -
//-----------------------------------------
int WIRE_PIN = 5;      // цифровой вход(пин) 1WIRE-шины ( температурные датчики )

int RES_PIN = 5 ;      // аналоговый вход(пин) для резестивных(рулевых) кнопок

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

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

//-----------------------------------------
//- Переменные для резестивных кнопок    -
//-----------------------------------------
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 = 5; // дельта для определения кода кнопки
 
void setup()
{
  Serial.begin(115200);
    temperature_sensors_milles = millis();
    t_status = 0;
    res_key_millis = millis();
 
    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=0; i       {
        res_key_array[i][0] = (EEPROM.read(i+2) * 256) + EEPROM.read(i+2+50) - res_key_delta; res_key_array[i][1] = res_key_array[i][0] + res_key_delta + res_key_delta;
      }
    }
    for(int i=res_key_count; i<51;i++)
    {
      res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
    }
   
}
 
void loop()
{
  if (Serial.available() >= 1) // Проверяем наличие команд от компьютера
  {
    switch (Serial.read())
    {

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

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

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

    case 0x86: // выключить передачу данных от резестивных кнопок
      is_res_keys = false;
    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 = 0; key_res_min = bytes[0]; key_res_min = key_res_min * 256 + bytes[1]; 
      unsigned long key_res_max = 0; key_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=0; i<51;i++)
      {
        res_key_array[i][0] = 0xFFFFFFFF; res_key_array[i][1] = 0xFFFFFFFF;
      }
    }
    break;
    }
  }
  if( is_temperature_sensors ) temperature_sensors();  //  температурные датчики
  if( is_res_keys ) res_keys();                        //  резестивные кнопки
}

//----------------------------------------------------------------------------------
// Функция работы с резестивными кнопками
//----------------------------------------------------------------------------------
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 = 0; res_dt_n = 0;
        }
      }
    }
    else
    {
      res_dt_sum = 0; res_dt_n = 0; res_key = 0;
      res_key_wait_millis = 0;
    }
  }
  if( res_key_millis + res_key_wait_millis*2 <= millis() ) { res_key_old = 0; }
  if( res_key_millis + res_key_wait_millis <= millis() )
  {
    if( res_key != 0 )
    {
      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 = 0; int exit = 0;
        while( res_key_array[i][0] != 0xFFFFFFFF && exit == 0 )
        {
          if( (res_key_array[i][0] <= res_key) && (res_key <= res_key_array[i][1]) ) exit = 1; else i++;
        }
        if( exit == 1 )
        {
          bytes[0] = 0xAA;          // преобразовать в 4-байта 
          bytes[1] = 0; 
          bytes[2] = RES_PIN;
          bytes[3] = i+1;
          Serial.write( bytes,4); // отправить прочитаное значение компьютеру
        }
        else
        {
          if( res_key_count < 50 )
          {
            res_key_array[res_key_count][0] = res_key - res_key_delta; res_key_array[res_key_count][1] = res_key + res_key_delta;
            res_key_count++;
           
            EEPROM.write(1, res_key_count); // Запоминаем количество кнопок
            byte one_byte = res_key / 256;
            EEPROM.write(res_key_count+1, one_byte ); // Запоминаем старший байт значения кнопки
            one_byte = res_key - one_byte * 256;
            EEPROM.write(res_key_count+1+50, one_byte ); // Запоминаем младший байт значения кнопки
            EEPROM.write(0, RES_KEY_FLAG_);
         
            bytes[0] = 0xAA;          // преобразовать в 4-байта 
            bytes[1] = 0; 
            bytes[2] = RES_PIN;
            bytes[3] = res_key_count;
            Serial.write( bytes,4); // отправить прочитаное значение компьютеру
          }
          else
          {
            bytes[0] = 0xAA;          // преобразовать в 4-байта 
            bytes[1] = 0xAA; 
            bytes[2] = (res_key & 0xFF00) >> 8;
            bytes[3] = res_key & 0xFF;
            Serial.write( bytes,4); // отправить прочитаное значение компьютеру
          }
        }
    }
    res_key_old = res_key;
  }
}

//----------------------------------------------------------------------------------
// Функция определение температуры датчиков DS18B20
//----------------------------------------------------------------------------------
void temperature_sensors()
{
  if(t_status == 0)
  {

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

    if (OneWire::crc8( addr, 7) != addr[7]) // Проверка CRC
    {
      return; // Если не пройдена, то в начало главного цикла и продолжаем поиск других датчиков
    }
 
    if (addr[0] != 0x28) // Проверка того, что найденное устройство - температурный датчик DS18B20
    {       
      return; // Если не он, то опять в начало главного цикла на продолжение поиска
    }
 
    ds.reset();
    ds.select(addr);
    ds.write(0x44,1);
     
    t_status = 1;
  }
  else
  {
    if( temperature_sensors_milles + temperature_sensors_wait_milles < millis() )
    {
      temperature_sensors_milles = millis();

      byte i;

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


D@nger 04.06.2013 11:02

а пауза при загрузке плагина увеличилось? Раньше быстрее работать начинали кнопки, щас дольше ждать приходится..

Bersenev 04.06.2013 11:11

Цитата:

Сообщение от D@nger (Сообщение 260400)
а пауза при загрузке плагина увеличилось? Раньше быстрее работать начинали кнопки, щас дольше ждать приходится..

Нет, но в плагине есть возможность регулировать её. Для этого в iCarDSConfig -- Global Vars добавляем переменную

duino_resume_timer=20000

которая задаёт время задержки в миллисекундах, понижаем его до тех пор пока работа плагина при выходе из сна стабильна.

AlexIz 04.06.2013 21:10

Цитата:

Сообщение от Bersenev (Сообщение 260397)
Пробуй

Не работает. Да, я дезинформировал по поводу входа температурных датчиков. Они на D4 подключены. В скетче я поправил.

Bersenev 04.06.2013 22:19

Цитата:

Сообщение от AlexIz (Сообщение 260435)
Не работает. Да, я дезинформировал по поводу входа температурных датчиков. Они на D4 подключены. В скетче я поправил.

Честно говоря я выложил код не проверив его, просто не на чем было. Все ардуино стоят в компах. Но сейчас залил этот скетч в комп от 21-й волги, так он сразу запустился, без каких либо проблем и резистивные кнопки и температурные датчики, все четыре штуки.

Давай попробуем так, найди в скетче эти строки

PHP код:

if( is_temperature_sensors temperature_sensors();  //  температурные датчики   
if( is_res_keys res_keys();                        //  резестивные кнопки 

и замени на эти

PHP код:

temperature_sensors();  //  температурные датчики   
res_keys();                        //  резестивные кнопки 


AlexIz 04.06.2013 22:47

УРА!!!! Заработало!!!! СПАСИБО!!!

Bersenev 04.06.2013 22:53

Цитата:

Сообщение от AlexIz (Сообщение 260440)
УРА!!!! Заработало!!!! СПАСИБО!!!

Да это не очень хорошо, должен работать первый вариант скетча, с этим скорее всего будут проблемы при выходе из сна

В файле duino.ini эти переменные какие значения имеют?

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

AlexIz 04.06.2013 23:10

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

Как я понимаю, надо
duino_is_ir_key=0
duino_is_encoder_1=0
duino_is_encoder_2=0
duino_is_res_keys=1

А в чем разница в скетчах? Почему первый не работает?

Bersenev 04.06.2013 23:20

Цитата:

Сообщение от AlexIz (Сообщение 260443)
Как я понимаю, надо
duino_is_ir_key=0
duino_is_encoder_1=0
duino_is_encoder_2=0
duino_is_res_keys=1

Да, в твоём варианте

Цитата:

Сообщение от AlexIz (Сообщение 260443)
А в чем разница в скетчах? Почему первый не работает?

Первый скетч ждёт от плагина команды на включение функций опроса резистивных кнопок и термодатчиков, а второй просто сразу опрашивает, но это иногда приводит к сбоям, если плагин ещё не готов принимать эти данные.

А вот почему у тебя не происходит включение этих функций я пока не знаю.

AlexIz 04.06.2013 23:24

:sad2:

AlexIz 06.06.2013 09:09

Цитата:

Сообщение от Bersenev (Сообщение 260446)


Слушай, а почему у меня на разных компах с разными контроллерами скетч ведёт себя одинаково? Может есть какой отладчик?

Bersenev 06.06.2013 14:04

Цитата:

Сообщение от AlexIz (Сообщение 260566)
Слушай, а почему у меня на разных компах с разными контроллерами скетч ведёт себя одинаково?

У меня тоже ведёт себя на всех компах одинаково, то есть везде работает. Так что не знаю, что именно у тебя мешает нормальной работе, возможно звёзды:smile1:.

Цитата:

Сообщение от AlexIz (Сообщение 260566)
Может есть какой отладчик?

Отладчик для скина есть, но в данном варианте он наверно не поможет. Для начала надо определить где проблема в скетче или в плагине, а для этого желательно поставить какой нибудь монитор com порта и записать лог общения плагина с ардуино, тогда станет ясно где искать проблему в скетче или в плагине.

AlexIz 07.06.2013 22:38

Цитата:

Сообщение от Bersenev (Сообщение 260584)
поставить какой нибудь монитор com порта

Что-то я не нашел ничего подходящего. То с виртуальным портом не работает, то денег просит...

AlexIz 08.06.2013 15:41

Вложений: 1
Какие-то чудеса... Похоже скетч заработал и полный и усечённый... Ничего не делал, просто подоткнул ардуину для снятия лога с com порта, а она испугалась и заработала. Восстановил отключенные строчки из сообщения 461. Работает. Отправляю лог. Один температурный датчик и одна кнопка.

AlexIz 09.06.2013 13:24

CarDuino периодически не запускается. Приходится передёргивать. Не знаю как отследить это. Использую PortMon. C ним тоже какая-то беда - периодически пишет, типа, не могу подключить порт, потому, что он используется. Странно, ведь это как раз и надо...
Да, спящий режим не использую. Всегда отключаю питание компа.

AlexIz 09.06.2013 14:20

Вложений: 1
Ещё обнаружил. При попытке уйти в сон или в ожидание, получл вот это. 16 порт - кардуино.

OsDima 09.06.2013 17:26

Цитата:

Сообщение от AlexIz (Сообщение 260770)
CarDuino периодически не запускается. Приходится передёргивать. Не знаю как отследить это. Использую PortMon. C ним тоже какая-то беда - периодически пишет, типа, не могу подключить порт, потому, что он используется. Странно, ведь это как раз и надо...
Да, спящий режим не использую. Всегда отключаю питание компа.

Ответ нашел такой: Chip писал на другом форуме.
_______________________
У китайских плат Arduino Nano V3 есть ошибка в разводке, на форуме это не однократно обсуждалось
Нога "Test" контроллера FTDI висит в воздухе, а должна быть подтянута к земле

Капнул между 25 и 26 ногой FTDI, заработало как часики. (столько времени потерял в поисках истины)


может поможет, а комбинация со вторым симптомом - похоже что дрова глючные.

AlexIz 09.06.2013 20:02

OK, посмотрю.

AlexIz 09.06.2013 21:29

Цитата:

Сообщение от OsDima (Сообщение 260786)
Ответ нашел такой: Chip писал на другом форуме.
_______________________
У китайских плат Arduino Nano V3 есть ошибка в разводке, на форуме это не однократно обсуждалось
Нога "Test" контроллера FTDI висит в воздухе, а должна быть подтянута к земле

Нет, не мой вариант. Test сидит на корпусе. Новые драйверы помогли.

напор 03.07.2013 18:50

Возникла проблема, и не знаю куда копать.
установлена айкар и joystick. настраиваю как в шапке написано. когда в айкаре пытаюсь прописать кнопки создается впечатление, что залипла одна из кнопок на руле. то есть на какую бы кнопку не нажал, вновь нажатая кнопка появляется в списке, но выделение строчки опять перескакивает на ту кнопку, которая какбы залипла. когда выхожу из настроек в оболочку происходит залипание той функции, которая была назначена на эту кнопку(например уменьшение громкости чтобы я ни делал)
Когда подключил родную музыку такого эффекта нет. всё нормально.
Подскажите, может кто сталкивался или мысли есть какие на эту тему?

И второй вопрос как очистить список кодов кнопок в аикаре?

AlexIz 03.07.2013 21:10

Цитата:

Сообщение от напор (Сообщение 263090)
Возникла проблема, и не знаю куда копать.
установлена айкар и joystick. настраиваю как в шапке написано. когда в айкаре пытаюсь прописать кнопки создается впечатление, что залипла одна из кнопок на руле. то есть на какую бы кнопку не нажал, вновь нажатая кнопка появляется в списке, но выделение строчки опять перескакивает на ту кнопку, которая какбы залипла. когда выхожу из настроек в оболочку происходит залипание той функции, которая была назначена на эту кнопку(например уменьшение громкости чтобы я ни делал)
Когда подключил родную музыку такого эффекта нет. всё нормально.
Подскажите, может кто сталкивался или мысли есть какие на эту тему?

И второй вопрос как очистить список кодов кнопок в аикаре?

А под joystick что понимается?

напор 04.07.2013 00:19

http://carmonitor.ru/ru/joystick-p-1...7eaee553995f77

admin 04.07.2013 00:41

Цитата:

Сообщение от напор (Сообщение 263090)
Возникла проблема, и не знаю куда копать.
установлена айкар и joystick. настраиваю как в шапке написано. когда в айкаре пытаюсь прописать кнопки создается впечатление, что залипла одна из кнопок на руле. то есть на какую бы кнопку не нажал, вновь нажатая кнопка появляется в списке, но выделение строчки опять перескакивает на ту кнопку, которая какбы залипла. когда выхожу из настроек в оболочку происходит залипание той функции, которая была назначена на эту кнопку(например уменьшение громкости чтобы я ни делал)
Когда подключил родную музыку такого эффекта нет. всё нормально.
Подскажите, может кто сталкивался или мысли есть какие на эту тему?

И второй вопрос как очистить список кодов кнопок в аикаре?

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

AlexIz 04.07.2013 08:52

А кнопки обычные резистивные?


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

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