Подключение ардуины к габаритам автомобиля

kadushkin
Offline
Зарегистрирован: 18.12.2011

Подключил цифровые входы ардуино с внуир. подтяжкой через диоды шоттки к:

1. Ручному тормозу авто. При включении ручника цепь садится на землю. Все работает. В сериал порту пишет когда ручник вкл. - выкл.

2. К габаритам. При включении габаритов  в цепи появляется питание +12В. В сериал порту ничего не пишется вообще. Ардуино не прошивается при таком подключении. Диод подключен верно. Где ошибка?

Видимо это связано с тем, что в первом случае минусом управляется, а во втором плюсом.

kadushkin
Offline
Зарегистрирован: 18.12.2011

Вот схема

Подключаюсь к комбинации приборов, к сигналам на светодиоды.

maksim
Offline
Зарегистрирован: 12.02.2012

Попробуйте отключить внутреннюю подтяжку с 19 вывода. 

kadushkin
Offline
Зарегистрирован: 18.12.2011

хм, а теоретически это что даст? не спалю?

maksim
Offline
Зарегистрирован: 12.02.2012

Нет, не спалите. Просто когда пропадет 12 вольт с габаритов, лампочка в приборке через диод тянет пин к минусу, в полне возможно, что из-за подтяхки к +5В не получется на пине снизить напряжение до поргового.

kadushkin
Offline
Зарегистрирован: 18.12.2011

А при таком подключении светодиод не будет гореть в полнакала?

maksim
Offline
Зарегистрирован: 12.02.2012

Это как это в полнакала? 

kadushkin
Offline
Зарегистрирован: 18.12.2011

Ну я имею ввиду что с ардуины придет 5в на светодиод.... а с бортсети обычно 12В.

Поэтому и спрашиваю, без подтяжки не будет ардуино питать светодиод в полнакала?

maksim
Offline
Зарегистрирован: 12.02.2012

Не понял.... ???? 

leshak
Offline
Зарегистрирован: 29.09.2011

 

kadushkin пишет:

Ну я имею ввиду что с ардуины придет 5в на светодиод.... а с бортсети обычно 12В.

Поэтому и спрашиваю, без подтяжки не будет ардуино питать светодиод в полнакала?

Будет. Только очень маленьким током.  И происходить это будет не "без подтяжки", а именно "с подтяжкой". Что есть подтяжка? Подключение ноги, через резистор 20K к питанию дуины. Следовательно когда вы уберете 12v с диода, то ток пойдет 5v->резистор подтяжки->нога->диод->светик->земля.

leshak
Offline
Зарегистрирован: 29.09.2011

 И да, кстати, можете еще скетч показать публике... мало-ли что там.

 

maksim
Offline
Зарегистрирован: 12.02.2012

А, понял. Просто на схеме нарисованны лампочки, а не светодиоды.

kadushkin
Offline
Зарегистрирован: 18.12.2011
Код:

int HandBreakPin=0;// Контакт 0 для сигнала от ручного тормоза
int SmallLightPin=1;// Контакт 1 для сигнала от габаритов
...

//0
pinMode(HandBreakPin, INPUT);// Контакт для сигнала от ручного тормоза
digitalWrite(HandBreakPin, HIGH); //внутренняя подтяжка входа +++++ 
//1
pinMode(SmallLightPin, INPUT);// Контакт для сигнала от габаритов
digitalWrite(SmallLightPin, HIGH); //внутренняя подтяжка входа +++++ 

....

Serial.println(digitalRead(SmallLightPin)); 
...
Serial.println(digitalRead(HandBreakPin)); 


Как я понял, строку digitalWrite(SmallLightPin, HIGH) надо убрать

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Это не код, а чер-ти что.....

вы что интернет экономите? Где вся управляющая логика? Я понимаю что там по вашему мнению "все в порядке". И скорее всего это так. Но и вариантов когда "подскользнулись на ровном месте" - бывает куча. Почему сразу не показать скетч целиком? Как есть? ctrl-c, ctrl-v.

Если там все нормально - все. забыть и не думать больше об этом.

kadushkin
Offline
Зарегистрирован: 18.12.2011

Извините, хотел как проще.

Исправляюсь...

#include <EEPROM.h>
//#include <MsTimer2.h>

boolean DEBUG=true; // используется при отладке

////// ********Описание периферии********** ///////////
int HandBreakPin=0;// Контакт 0 для сигнала от ручного тормоза
int SmallLightPin=1;// Контакт 1 для сигнала от габаритов
int TahometrPin = 2; // Контакт 2 для тахометра !!!!!!!!! ПРЕРЫВАНИЕ 0 
int SpeedSensorPin = 3; // Контакт 3 для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1

void setup() 
{

// MsTimer2::set(500, Timer2_Timer); // таймер будет срабатывать через каждые 500ms 
// MsTimer2::start();//запустить таймер
//0
pinMode(HandBreakPin, INPUT);// Контакт для сигнала от ручного тормоза
digitalWrite(HandBreakPin, HIGH); //внутренняя подтяжка входа +++++ 
//1
pinMode(SmallLightPin, INPUT);// Контакт для сигнала от габаритов
digitalWrite(SmallLightPin, HIGH); //внутренняя подтяжка входа +++++ 
//2
pinMode(TahometrPin, INPUT); // Контакт для тахометра !!!!!!!!!ПРЕРЫВАНИЕ 0
digitalWrite(TahometrPin, HIGH); //внутренняя подтяжка входа тахометра 
attachInterrupt(0, TahometrImpulse_on, FALLING); // настройка прерывания и функции на него
//3
pinMode(SpeedSensorPin, INPUT); // Контакт для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1
digitalWrite(SpeedSensorPin, HIGH); //внутренняя подтяжка входа датчика скорости 
attachInterrupt(1, SpeedImpulse_on, FALLING); // настройка прерывания и функции на него
}

void loop()
{
if (DEBUG)
    {
Serial.println(digitalRead(SmallLightPin));
delay(1000);
Serial.println(digitalRead(HandBreakPin));
delay(1000);
  }
}

Далее функции спидометра и тахометра длинные, не имеют отношения к вопросу
Кроме того их при отладке пока не использую.


 

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну первая причина по которой "не работает" и "Ардуино не прошивается при таком подключении" ясна.

В схеме вы нарисовали пины 16,19, а в скетче используете 0,1

Либо вы дали неправильную информацию о подключении, либо подключили 16,19, а читать пытаетеся 0,1

Кроме того. 0,1 - уже занят до вас :) На них работает Serial (и скетчи заливаются). Так что "освободите место". Переезжайте на использование других пинов. Тех же 16,19

Ну и, не существенно, но я бы выкинул строчку 38. Зачем задержка между чтениями двух пинов? Пусть сразу про два говорит, раз в секунду.

p.s. На всяк случай, пины 2,3 - у вас тоже заняты. Спидометром и тахометром. Так что "от 4-того и выше" использовать можно.

leshak
Offline
Зарегистрирован: 29.09.2011

 И еще, по хорошему, в setup нужно бы добавить, в явном виде Serial.begin

kadushkin
Offline
Зарегистрирован: 18.12.2011

Спасибо.

С схеме действительно ошибочно указано 16, 19 - реально подключено к 0 и 1.

Итак:

1. Освободить пины 0 и 1

2. Serial.begin

И самое главное, как советовали ранее подтяжку digitalWrite(SmallLightPin, HIGH) убирать или нет?

 

leshak
Offline
Зарегистрирован: 29.09.2011

 По подтяжке: я бы не убирал. в моем понимании без нее пин, при включении габаритов будет ловить "случайный мусор-помехи из эфира". То 0 возвращать, то 1.

Обратной стороной медали - действительно при выключении габаритов может быть "слабое свечение" диода. От ноги ардуины. Ну думая "маловероятно". Слишком маленький ток. Не хватит его что-бы "зажечь светик" (тем более 12-ти вольтовый).

Зачем Максим советовал выключить подтяжку - я не понял. Хотя в схемотехнике, вроде, он разбирается лучше меня.

В любом случае можете попборовать и так и так. На безопастность это не влияет. В худщем случае - в serial будут видны ложные "срабатывания", и только.

leshak
Offline
Зарегистрирован: 29.09.2011

 >Извините, хотел как проще.

Если не хотите ветку засирать "длинными простынями скетчей" - можно код вставлять в "свернутом виде". На вкладке "дополнительно".

Тут есть картинки где это делать http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukommentarii

И, еще. Постарайтесь не вписывать свой комментарий к коду, внутрь своего кода. Пользуйтесь кнопкой "Предпросмотр". Во первых он там менее заметен, во вторых мешает скопировать код и вставить в свою arduinoIDE, не дает скомпилировать.

leshak
Offline
Зарегистрирован: 29.09.2011

 Я бы, что-бы было удобнее читать в мониторе, выводил вот так пины

Serial.print("Light:");
Serial.print(digitalRead(SmallLightPin));

Serial.print(",   Break:");
Serial.println(digitalRead(HandBreakPin));

delay(1000);

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Ну и если уж, совсем попридиратся, пины лучше объявлять не переменными (так как они никогда не меняются), а через #define

#define HandBreakPin 4 // тормозной пин

Вообщем-то не существенно, на пару байт памяти - экономия на каждом пине. И пара тактов при вызове функции (не нужно читать переменную).

И дебаг, то же можно сделать (если вы не собираетесь включать/выключать этот режим "на ходу", а только в момент компиляции скетча

#define DEBUG 1

тогда "отладочную логику" - тоже можно сделать на препроцессорных диррективах

#if DEBUG
Serial.print("Light:");
Serial.print(digitalRead(SmallLightPin));

Serial.print(",   Break:");
Serial.println(digitalRead(HandBreakPin));

delay(1000);
#endif

Тогде, когда вы сделатте #define DEBUG 0

этот кусок кода вообще проигнорируется компилятором и не будет занимать память. Для ArduinoIDE он перестанет существовать, до тех пор пока DEBUG опять не объявят как 1.

leshak
Offline
Зарегистрирован: 29.09.2011

 И хорошо бы, все-таки, увидеть скетч целиком (вы что, стесняетесь? или там копирайт великий?) . В функциях SpeedImpulse_on, TahometrImpulse_on - тоже можно выстрелить себе в ногу. От которой ваша логика "при отладке пока не использую" может поломатся.

kadushkin
Offline
Зарегистрирован: 18.12.2011

Уф. Да, учту все твои предложения.

Что касается скетча в полном объеме, у меня там мусора много, комментариев, закомметированных мест, пометок - что не забыть и т.д. Копирайты ни при чем :), просто ругать будете за засорение

Ну а функции (относительно без мусора) , вот они, критика приветсвуется:

// обработчик событий тахометра
void  TahometrImpulse_on() //сидит на прерывании 0, срабатывает при возникновении событий на 2 цифровом входе
{ 
//TimeImpulse1=
Tahometr_impulse_count++; //увеличить счетчик импульсов
//Speed=0;
if (Tahometr_impulse_count >=2) //2имп=1 оборот коленвала
  {
Taho_ImpulseTime = micros()-Taho_time;  //время прихода между импульсами
Taho_time = micros(); //обнулить
Taho=((Tahometr_impulse_count*60*1000000)/(2*Taho_ImpulseTime));   // перевод в об/мин, формула универсальна для Тигго, 1 об на 2 ммпульса,1000000 - перевод мкс в сек., 60 - перевод сек в мин.
if (DEBUG)
    {
//Serial.println(Taho_ImpulseTime);
Serial.println(Taho); 
    }
Tahometr_impulse_count = 0;
  }  
} 

// обработчик событий датчика скорости
void  SpeedImpulse_on() //сидит на прерывании 1, срабатывает при возникновении событий на 3 цифровом входе
{ 
//TimeImpulse1=
Speed_impulse_count++; //увеличить счетчик импульсов
//Speed=0;
if (Speed_impulse_count >=2) //2имп=0,8м    5имп=2м
  {
Speed_ImpulseTime = micros()-Speed_time;  //время прихода между импульсами
Speed_time = micros(); //обнулить
Speed=((Speed_impulse_count*2*3.6*1000000)/(5*Speed_ImpulseTime));   // перевод в км/ч, формула универсальна для Тигго, 2=2м за 5 ммпульсов, 3.6 - перевод м/с в км/ч, 1000000 - перевод мкс в сек., 5 - 5 импульсов
if (DEBUG)
    {
//Serial.println(Speed_ImpulseTime);
//Serial.println(Speed); 
    }
Speed_impulse_count = 0;
  }  
} 

 

leshak
Offline
Зарегистрирован: 29.09.2011

 Все. Утомили. Больше талдычить "дайте скетч целиком" - не буду. Кому это нужно, вам или мне?

Вы все время что-то пытаетесь "сократить", вы уверены что "то что вы скрыли" - не играет роли?

Например строчка

Tahometr_impulse_count++;

Может вызывать пробелемы если переменную Tahometr_impulse_count объявили без ключевого слова volatile. Как ее объявили - не ведомо. Партизан на допросе цедит ответы сквозь зубы.

По тому что "видно".

 Serial.print в функциях обработки переменных - вызывать нельзя. Это "слишком долгая операция".

Во вторых: логика функций-обработчиков должна быть минимальная. Нужно выйти из этой функции быстро, как только возможно. Она же прервала нормальный поток. Запретила все прерывания и т.п. В ней нужно делать только "самое необходимое" - увеличивать счетчик, взводить, если нужно, какой-нибудь флаг указывающий что было прерывание. А все расчеты, Serial.print и т.п. - делать внутри loop, глядя на эти счетчики и флаги.

Правда для этого - прийдется отказаться от использования delay внутри loop, везде использовать только функцию millis(). Loop должен крутиться "без запоров". Как можно быстрее и чаще. Что-бы возникала иллюзия "одновременности".

 

 

 

 

kadushkin
Offline
Зарегистрирован: 18.12.2011

Извиняюсь, еще раз, вот весь скетч, но со всем мусором.

Этот скетч набор функционала пока не связанного друг с другом.

В планах скетс будет управлять переключением КПП, видеокамер, света

Библиотека Mystepper.h аналог stepper.h (убрано удержание ШД)

#include <EEPROM.h>
//#include <MsTimer2.h>
#include <Mystepper.h>

boolean DEBUG=true; // используется при отладке

////// ********Описание периферии********** ///////////
int HandBreakPin=0;// Контакт 0 для сигнала от ручного тормоза
int SmallLightPin=1;// Контакт 1 для сигнала от габаритов
int TahometrPin = 2; // Контакт 2 для тахометра !!!!!!!!! ПРЕРЫВАНИЕ 0 
int SpeedSensorPin = 3; // Контакт 3 для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1
// Контакт 4 для реле 1 блока-реле1
// Контакт 5 для реле 2 блока-реле1
// Контакт 6 для реле 3 блока-реле1
// Контакт 7 для реле 4 блока-реле1
int AntiHackSwitchPin=8; // Контакт 8 для противоугонки
int SpeakerSwitchPin=9;// Контакт 9 для выключателя звука
int SpeakerPin=10; // Контакт 10 для динамика
int AFKSwitchPin=11;// Контакт 11 для кнопки АФК (автоматич. функц. контроль)
// Контакт 12 для
int LedPin = 13; // Контакт 13 для светодиода
// Контакт 14 для  реле 5 блока-реле1
// Контакт 15 для  реле 6 блока-реле1
// Контакт 16 для  реле 7 блока-реле1
// Контакт 17 для  реле 8 блока-реле1
// Контакт 18 для !!!!!!!!!ПРЕРЫВАНИЕ 5
// Контакт 19 для !!!!!!!!!ПРЕРЫВАНИЕ 4
int ClutchONButtonPin=20;// Контакт 20 для кнопки выжима сцепления NO !!!!!!!!!ПРЕРЫВАНИЕ 3
int ClutchOFFButtonPin=21;// Контакт 21 для кнопки отжима сцепления NC !!!!!!!!!ПРЕРЫВАНИЕ 2
int Motor1HallSensor1Pin = 22;// Контакт 22 для датчика холла1 первого привода
int Motor1HallSensor2Pin = 23;// Контакт 23 для датчика холла2 первого привода
int Motor1HallSensor3Pin = 24;// Контакт 24 для датчика холла3 первого привода
// Контакт 25 для
// Контакт 26 для
int Motor2HallSensor4Pin = 27;// Контакт 27 для датчика холла4 второго привода
int Motor2HallSensor5Pin = 28;// Контакт 28 для датчика холла5 второго привода
int Motor2HallSensor6Pin = 29;// Контакт 29 для датчика холла6 второго привода
int HoldGearButtonPin = 30; // Контакт 30 для кнопки удержания передачи при выжиме сцепления
int NetralGearButtonPin =31;// Контакт 31 для кнопки включения нейтрали
int P1GearButtonPin=32;// Контакт 32 для кнопки включения 1ой передачи
int P2GearButtonPin=33;// Контакт 33 для кнопки включения 2ой передачи
int P3GearButtonPin=34;// Контакт 34 для кнопки включения 3ей передачи
int P4GearButtonPin=35;// Контакт 35 для кнопки включения 4ой передачи
int P5GearButtonPin=36;// Контакт 36 для кнопки включения 5ой передачи
int RearGearButtonPin=37;// Контакт 37 для кнопки включения заднего хода
int LCDGear1_Indicate_Pin=38;// Контакт 38 для индикации Передачи 1 на ЖКИ
int LCDGear2_Indicate_Pin=39;// Контакт 39 для индикации Передачи 2 на ЖКИ
int LCDGear3_Indicate_Pin=40;// Контакт 40 для индикации Передачи 3 на ЖКИ
int LCDGear4_Indicate_Pin=41;// Контакт 41 для индикации Передачи 4 на ЖКИ
int LCDGearD_Indicate_Pin=42;// Контакт 42 для индикации Передачи D на ЖКИ
int LCDGearN_Indicate_Pin=43;// Контакт 43 для индикации Передачи N на ЖКИ
int LCDGearR_Indicate_Pin=44;// Контакт 44 для индикации Передачи R на ЖКИ
int LCDGearP_Indicate_Pin=45;// Контакт 45 для индикации Передачи P на ЖКИ
int Motor1_Rotate_Side_Pin = 46;// Контакт 46 для первого привода - направление вращения
int Motor1_Online_Direct_Pin = 47;// Контакт 47 для первого привода - прямое управление
int Motor1_Frequency_Pin = 48;// Контакт 48 для первого привода - частота импульсов
int Motor1B2Pin = 49;// Контакт 49 для первого привода !!!!!!!!! свободно 
int Motor2A1Pin = 50;// Контакт 50 для второго привода
int Motor2B1Pin = 51;// Контакт 51 для второго привода
int Motor2A2Pin = 52;// Контакт 52 для второго привода
int Motor2B2Pin = 53;// Контакт 53 для второго привода

//Stepper Motor1(200, Motor1_Rotate_Side_Pin, Motor1_Frequency_Pin, Motor1_Online_Direct_Pin,   Motor1B2Pin);
Stepper Motor1(200, Motor1_Rotate_Side_Pin,  Motor1_Online_Direct_Pin, Motor1_Frequency_Pin,  Motor1B2Pin);
Stepper Motor2(200, Motor2A1Pin, Motor2B1Pin, Motor2A2Pin,   Motor2B2Pin);

//аналоговые входы
int WheelButtonsPin = 0; //A0 // кнопки руля
int OsscillographPin = 1; //A1 // осциллограф
int CurrentSensor1Pin = 2; //A2 //датчик тока1
int CurrentSensor2Pin = 3; //A3 //датчик тока2

int CurrentSensor1Value=0;
int CurrentSensor2Value=0;

//описание переменных
//boolean RelayOn = false;

unsigned long Speed_ImpulseTime = 0; // время между импульсами датчика скорости
unsigned long Speed_time=0;  // время для отсчета импульсов
int Speed_impulse_count = 0;  // кол-во импульсов датчика скорости
float Speed=0; // скорость с датчика скорости

unsigned long Taho_ImpulseTime = 0; // время между импульсами тахометра
unsigned long Taho_time=0;  // время для отсчета импульсов
int Tahometr_impulse_count = 0;  // кол-во импульсов тахометра
float Taho=0; // обороты двигателя


char CurGear='0';
char LastGear='0';
char RecommendGear='0';

byte Motor1_P_135=1; // соответствует положению 1 (датчик холла1) привода 1 - 1,3,5 передачи
byte Motor1_P_Netral=2; // соответствует положению 2 (датчик холла2) привода 1 - нейтраль 
byte Motor1_P_24R=3; // соответствует положению 3 (датчик холла3) привода 1 - 2,4,R передачи
byte Motor2_P_12=4; // соответствует положению 4 (датчик холла4) привода 2 - 1,2 передачи
byte Motor2_P_34=5; // соответствует положению 5 (датчик холла5) привода 2 - 3,4 передачи
byte Motor2_P_5R=6; // соответствует положению 6 (датчик холла6) привода 2 - 5,R передачи
int EEPROMaddrLastMotor1HallSensorNum=0; //адрес в энергонезавсимой памяти куда заносится значение положение привода 1 согласно датчикам холла 1,2 или 3 
int EEPROMaddrLastMotor2HallSensorNum=1; //адрес в энергонезавсимой памяти куда заносится значение положение привода 2 согласно датчикам холла 4,5 или 6


// переменные нажатия рулевых кнопок
unsigned long math_time,old_time,real_time, res_dt1, res_d;     
int LIMIT=10;
char ButtonName='X'; // +, -, >, R=>>|, L=|<<, S=SRC, X=None
// переменные нажатия рулевых кнопок - конец





//общие настройки 
void setup() 
{

// MsTimer2::set(500, Timer2_Timer); // таймер будет срабатывать через каждые 500ms 
// MsTimer2::start();//запустить таймер
//0
pinMode(HandBreakPin, INPUT);// Контакт для сигнала от ручного тормоза
digitalWrite(HandBreakPin, HIGH); //внутренняя подтяжка входа +++++ 
//1
pinMode(SmallLightPin, INPUT);// Контакт для сигнала от габаритов
digitalWrite(SmallLightPin, HIGH); //внутренняя подтяжка входа +++++ 
//2
pinMode(TahometrPin, INPUT); // Контакт для тахометра !!!!!!!!!ПРЕРЫВАНИЕ 0
digitalWrite(TahometrPin, HIGH); //внутренняя подтяжка входа тахометра 
attachInterrupt(0, TahometrImpulse_on, FALLING); // настройка прерывания и функции на него
//3
pinMode(SpeedSensorPin, INPUT); // Контакт для датчика скорости !!!!!!!!!ПРЕРЫВАНИЕ 1
digitalWrite(SpeedSensorPin, HIGH); //внутренняя подтяжка входа датчика скорости 
attachInterrupt(1, SpeedImpulse_on, FALLING); // настройка прерывания и функции на него
// Контакт 4 для
// Контакт 5 для
// Контакт 6 для
// Контакт 7 для
//pinMode(SpeakerPin, OUTPUT); // Контакт для динамика
//pinMode(SpeakerSwitchPin, INPUT);// Контакт для выключателя звука
//digitalWrite(SpeakerSwitchPin, HIGH); //внутренняя подтяжка входа +++++ 
//pinMode(AntiHackSwitchPin, INPUT); // Контакт для противоугонки
//digitalWrite(AntiHackSwitchPin, HIGH); //внутренняя подтяжка входа +++++ 
//pinMode(AFKSwitchPin, INPUT);// Контакт для кнопки АФК (автоматич. функц. контроль)
//digitalWrite(AFKSwitchPin, HIGH); //внутренняя подтяжка входа +++++ 
// Контакт 12 для
pinMode(LedPin, OUTPUT); // Контакт для светодиода
// Контакт 14 для 
// Контакт 15 для
// Контакт 16 для кнопки + повышения передач
// Контакт 17 для кнопки - понижения передач
// Контакт 18 для !!!!!!!!!ПРЕРЫВАНИЕ 5
// Контакт 19 для !!!!!!!!!ПРЕРЫВАНИЕ 4
pinMode(ClutchONButtonPin, INPUT);// Контакт для кнопки выжима сцепления NO !!!!!!!!!ПРЕРЫВАНИЕ 3
digitalWrite(ClutchONButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(ClutchOFFButtonPin, INPUT);// Контакт для кнопки отжима сцепления NC !!!!!!!!!ПРЕРЫВАНИЕ 2
digitalWrite(ClutchOFFButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(Motor1HallSensor1Pin, INPUT);// Контакт для датчика холла1 первого привода
digitalWrite(Motor1HallSensor1Pin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(Motor1HallSensor2Pin, INPUT);// Контакт для датчика холла2 первого привода
digitalWrite(Motor1HallSensor2Pin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(Motor1HallSensor3Pin, INPUT);// Контакт для датчика холла3 первого привода
digitalWrite(Motor1HallSensor3Pin, HIGH); //внутренняя подтяжка входа +++++ 
// Контакт 25 для
// Контакт 26 для
pinMode(Motor2HallSensor4Pin, INPUT);// Контакт для датчика холла4 второго привода
digitalWrite(Motor2HallSensor4Pin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(Motor2HallSensor5Pin, INPUT);// Контакт для датчика холла5 второго привода
digitalWrite(Motor2HallSensor5Pin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(Motor2HallSensor6Pin, INPUT);// Контакт для датчика холла6 второго привода
digitalWrite(Motor2HallSensor6Pin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(HoldGearButtonPin, INPUT); // Контакт для кнопки удержания передачи при выжиме сцепления
digitalWrite(HoldGearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(NetralGearButtonPin, INPUT);// Контакт для кнопки включения нейтрали
digitalWrite(NetralGearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(P1GearButtonPin, INPUT);// Контакт для кнопки включения 1ой передачи
digitalWrite(P1GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(P2GearButtonPin, INPUT);// Контакт для кнопки включения 2ой передачи
digitalWrite(P2GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(P3GearButtonPin, INPUT);// Контакт для кнопки включения 3ей передачи
digitalWrite(P3GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(P4GearButtonPin, INPUT);// Контакт для кнопки включения 4ой передачи
digitalWrite(P4GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(P5GearButtonPin, INPUT);// Контакт для кнопки включения 5ой передачи
digitalWrite(P5GearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 
pinMode(RearGearButtonPin, INPUT);// Контакт для кнопки включения заднего хода
digitalWrite(RearGearButtonPin, HIGH); //внутренняя подтяжка входа +++++ 

pinMode(LCDGear1_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 1 на ЖКИ
pinMode(LCDGear2_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 2 на ЖКИ
pinMode(LCDGear3_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 3 на ЖКИ
pinMode(LCDGear4_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи 4 на ЖКИ
pinMode(LCDGearD_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи D на ЖКИ
pinMode(LCDGearN_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи N на ЖКИ
pinMode(LCDGearR_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи R на ЖКИ
pinMode(LCDGearP_Indicate_Pin, OUTPUT);// Контакт для индикации Передачи P на ЖКИ
pinMode(Motor1_Rotate_Side_Pin, OUTPUT);// Контакт для Реле1 первого привода
pinMode(Motor1_Online_Direct_Pin, OUTPUT);// Контакт для Реле2 первого привода
pinMode(Motor1_Frequency_Pin, OUTPUT);// Контакт для Реле3 первого привода
pinMode(Motor1B2Pin, OUTPUT);// Контакт для Реле4 первого привода
pinMode(Motor2A1Pin, OUTPUT);// Контакт для Реле5 второго привода
pinMode(Motor2B1Pin, OUTPUT);// Контакт для Реле6 второго привода
pinMode(Motor2A2Pin, OUTPUT);// Контакт для Реле7 второго привода
pinMode(Motor2B2Pin, OUTPUT);// Контакт для Реле8 второго привода  

// параметры моторов, скорости вращения об/мин
Motor1.setSpeed(100);  
Motor2.setSpeed(300);  

//гасим ЖКИ 
/*

digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);

*/
//


if (DEBUG)
  {
Serial.begin(115200); 
  }
}


void Indicate_Recommended_Gear(float Speed_kmh)
{
  
if (Speed_kmh<=0) {RecommendGear='N';} // реле N
if ((Speed_kmh>0) && (Speed_kmh<=7)) {RecommendGear='1';} // реле   1 
if ((Speed_kmh>10) && (Speed_kmh<=22)) {RecommendGear='2';} // реле   2
if ((Speed_kmh>25) && (Speed_kmh<=40)) {RecommendGear='3';} // реле   3
if ((Speed_kmh>43) && (Speed_kmh<=85)) {RecommendGear='4';} // реле   4
if (Speed_kmh>90) {RecommendGear='D';} // реле   5


if (LastGear!=RecommendGear)
{
if (LastGear=='1'){digitalWrite(LCDGear1_Indicate_Pin, HIGH);}
if (LastGear=='2'){digitalWrite(LCDGear2_Indicate_Pin, HIGH);}
if (LastGear=='3'){digitalWrite(LCDGear3_Indicate_Pin, HIGH);}
if (LastGear=='4'){digitalWrite(LCDGear4_Indicate_Pin, HIGH);}
if (LastGear=='D'){digitalWrite(LCDGearD_Indicate_Pin, HIGH);}
if (LastGear=='N'){digitalWrite(LCDGearN_Indicate_Pin, HIGH);}
if (LastGear=='R'){digitalWrite(LCDGearR_Indicate_Pin, HIGH);}
if (LastGear=='P'){digitalWrite(LCDGearP_Indicate_Pin, HIGH);}

if (RecommendGear=='1'){digitalWrite(LCDGear1_Indicate_Pin, LOW);}
if (RecommendGear=='2'){digitalWrite(LCDGear2_Indicate_Pin, LOW);}
if (RecommendGear=='3'){digitalWrite(LCDGear3_Indicate_Pin, LOW);}
if (RecommendGear=='4'){digitalWrite(LCDGear4_Indicate_Pin, LOW);}
if (RecommendGear=='D'){digitalWrite(LCDGearD_Indicate_Pin, LOW);}
if (RecommendGear=='N'){digitalWrite(LCDGearN_Indicate_Pin, LOW);}
if (RecommendGear=='R'){digitalWrite(LCDGearR_Indicate_Pin, LOW);}
if (RecommendGear=='P'){digitalWrite(LCDGearP_Indicate_Pin, LOW);}

LastGear=RecommendGear;
}  


}

// главный цикл


void Gear_motor_step(int steps)
{ 
 
if (steps>0) {digitalWrite(Motor1_Rotate_Side_Pin, HIGH);} // задаем сторону вращения
if (steps<0) {digitalWrite(Motor1_Rotate_Side_Pin, LOW);} // задаем сторону вращения
digitalWrite(Motor1_Online_Direct_Pin, HIGH); // прямое управление контроллером шагового двигателя с ардуино
int TimeBTWNImpulse=3000; //время между импульсами (шагами) - скорость вращения

int ttime=millis(); 

int stepped=1; 
int stepcount=abs(steps);
while (stepped<=stepcount)
  {
if (stepped>50) {TimeBTWNImpulse=2000;} //ускорение 1ая ступень
if (stepped>100) {TimeBTWNImpulse=1500;} //ускорение 2ая ступень
if (stepped>150) {TimeBTWNImpulse=1000;} //ускорение 3ья ступень
digitalWrite(Motor1_Frequency_Pin, HIGH); //импульс
 delayMicroseconds(TimeBTWNImpulse);
 digitalWrite(Motor1_Frequency_Pin, LOW);
// Serial.println(gear_motor_step_number);


 stepped++;
  }
  
    digitalWrite(Motor1_Frequency_Pin, LOW);

Serial.println( millis()-ttime);  
       	  }


void loop()
{
digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);

digitalWrite(LCDGear1_Indicate_Pin, HIGH);
delay(2000);
digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, HIGH);
delay(2000);
digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, HIGH);
delay(2000);
digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, HIGH);
delay(2000);
digitalWrite(LCDGearD_Indicate_Pin, HIGH);
delay(2000);
digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, HIGH);
delay(2000);
digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, HIGH);
delay(2000);
digitalWrite(LCDGear1_Indicate_Pin, LOW);
digitalWrite(LCDGear2_Indicate_Pin, LOW);
digitalWrite(LCDGear3_Indicate_Pin, LOW);
digitalWrite(LCDGear4_Indicate_Pin, LOW);
digitalWrite(LCDGearD_Indicate_Pin, LOW);
digitalWrite(LCDGearN_Indicate_Pin, LOW);
digitalWrite(LCDGearR_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, LOW);
digitalWrite(LCDGearP_Indicate_Pin, HIGH);  
delay(2000);
  
  
//Serial.println(digitalRead(Motor2HallSensor4Pin));  
//delay(100);
//!!!!!!!!!!!!!!!

/*!!!!!!!!!!
delay(2000);
//Motor2.step(100, Motor2HallSensor6Pin);
if (digitalRead(Motor2HallSensor5Pin)==1) 
{
Motor2.step(-600, Motor2HallSensor5Pin);
}
delay(2000);
if (digitalRead(Motor2HallSensor4Pin)==1) 
{
Motor2.step(600, Motor2HallSensor4Pin);
}
*/

// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
/* 
delay(2000);
int ttime=millis();
Motor1.step(280, Motor2HallSensor6Pin);
Serial.println( millis()-ttime);   
delay(2000);
Motor1.step(-280, Motor2HallSensor6Pin);
delay(2000);
Motor1.step(-280, Motor2HallSensor6Pin);
delay(2000);
Motor1.step(280, Motor2HallSensor6Pin);

*/  
  
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!  с ускорением 
  Gear_motor_step(220); 
 delay(2000);
Gear_motor_step(220); 
 delay(2000);
Gear_motor_step(-220); 
 delay(2000);
Gear_motor_step(-220); 
 delay(2000);
*/ 
 
 
  /*
int Motor1_Rotate_Side_Pin = 46;// Контакт 46 для первого привода - направление вращения
int Motor1_Online_Direct_Pin = 47;// Контакт 47 для первого привода - прямое управление
int Motor1_Frequency_Pin = 48;// Контакт 48 для первого привода - частота импульсов
  digitalWrite(47, HIGH); // прямое управление
digitalWrite(Motor1_Rotate_Side_Pin, HIGH); //вращ лев прав

digitalWrite(48, HIGH); //импульс
delay(3); 
digitalWrite(48, LOW);
delay(3); 
*/


/*
digitalWrite(47, HIGH);
digitalWrite(Motor1_Rotate_Side_Pin, HIGH);
delay(1000);  
digitalWrite(47, HIGH);
digitalWrite(Motor1_Rotate_Side_Pin, LOW);
delay(1000); 
*/
//digitalWrite(LCDGear2_Indicate_Pin, LOW);
 //delay(1000);  
if (DEBUG)
    {
  
// Serial.println(digitalRead(Motor2HallSensor5Pin));  
//Serial.println(digitalRead(3));
//  delay(100);      
    } 



//!!!!!!!!!!!!!!!
/*
delay(2000);
Motor2.step(100, Motor2HallSensor6Pin);
if (digitalRead(Motor2HallSensor5Pin)==1) 
{
Motor2.step(220, Motor2HallSensor5Pin);
}
delay(2000);
if (digitalRead(Motor2HallSensor4Pin)==1) 
{
Motor2.step(-300, Motor2HallSensor4Pin);
}
*/

/*
// !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
delay(2000);
Motor1.step(280, Motor2HallSensor6Pin);
delay(2000);
Motor1.step(-280, Motor2HallSensor6Pin);
delay(2000);
Motor1.step(-280, Motor2HallSensor6Pin);
delay(2000);
Motor1.step(280, Motor2HallSensor6Pin);
*/
/*
  //!!!!!!!!!!!!
Motor2.step(220);
delay(1000);
Motor2.step(-220);
delay(1000);
Motor2.step(-220);
delay(1000);
Motor2.step(220);
delay(1000);
*/
/* //!!!!!!!!!!!!!
Motor1.step(27);
delay(1000);
Motor1.step(-27);
delay(1000);
Motor1.step(-27);
delay(1000);
Motor1.step(27);
delay(1000);
*/
//if (WheelButonPush_IsPushed()) {Serial.println(ButtonName);} // проверка нажата ли рулевая кнопка

//RelayOn=HIGH;
//digitalWrite(RelayPin, RelayOn); // реле включить 
  /*
if (digitalRead(SpeedSensorPin)==HIGH && digitalRead(HoldGearButtonPin)==HIGH) // датчик холла сработал и кнопка не нажата
{
RelayOn=LOW;
digitalWrite(RelayPin, RelayOn); // реле выключить 
} 

if (digitalRead(HoldGearButtonPin)==LOW) //кнопка нажата
{
}
*/

//Indicate_Recommended_Gear(Speed);
//delay(100); 
}




// обработчик событий тахометра
void  TahometrImpulse_on() //сидит на прерывании 0, срабатывает при возникновении событий на 2 цифровом входе
{ 
//TimeImpulse1=
Tahometr_impulse_count++; //увеличить счетчик импульсов
//Speed=0;
if (Tahometr_impulse_count >=2) //2имп=1 оборот коленвала
  {
Taho_ImpulseTime = micros()-Taho_time;  //время прихода между импульсами
Taho_time = micros(); //обнулить
Taho=((Tahometr_impulse_count*60*1000000)/(2*Taho_ImpulseTime));   // перевод в об/мин, формула универсальна для Тигго, 1 об на 2 ммпульса,1000000 - перевод мкс в сек., 60 - перевод сек в мин.
if (DEBUG)
    {
//Serial.println(Taho_ImpulseTime);
Serial.println(Taho); 
    }
Tahometr_impulse_count = 0;
  }  
} 

// обработчик событий датчика скорости
void  SpeedImpulse_on() //сидит на прерывании 1, срабатывает при возникновении событий на 3 цифровом входе
{ 
//TimeImpulse1=
Speed_impulse_count++; //увеличить счетчик импульсов
//Speed=0;
if (Speed_impulse_count >=2) //2имп=0,8м    5имп=2м
  {
Speed_ImpulseTime = micros()-Speed_time;  //время прихода между импульсами
Speed_time = micros(); //обнулить
Speed=((Speed_impulse_count*2*3.6*1000000)/(5*Speed_ImpulseTime));   // перевод в км/ч, формула универсальна для Тигго, 2=2м за 5 ммпульсов, 3.6 - перевод м/с в км/ч, 1000000 - перевод мкс в сек., 5 - 5 импульсов
if (DEBUG)
    {
//Serial.println(Speed_ImpulseTime);
//Serial.println(Speed); 
    }
Speed_impulse_count = 0;
  }  
} 


// Функция проверки нажатия рулевой кнопки
// Возвращает false если кнопка не была нажата 
// и true если нажата
// ButtonName принимает значения в зависимости от нажатой кнопки +, -, >, R=>>|, L=|<<, S=SRC, X=None
boolean WheelButonPush_IsPushed()    
{    
bool result; 
result=false;
unsigned long buttonVal;
buttonVal=0; 
ButtonName='X';
 res_d = analogRead(WheelButtonsPin);  
  if( res_d < LIMIT) res_d = LIMIT; 
  delay(10);   
  res_dt1 = analogRead(WheelButtonsPin);   
        old_time = millis();    
        math_time = 0;     
        while(math_time < 200)    
          {    
             real_time = millis();                 
             math_time = real_time - old_time;   
            res_dt1 = analogRead(WheelButtonsPin);  
            if(res_dt1 < res_d-LIMIT || res_dt1 > res_d+LIMIT)break; 
          }    
       
    if( math_time > 70)  
      {   
  buttonVal=res_d;
  ButtonName='X';
   //   Serial.println (res_d);
              
        if ((buttonVal>25) && (buttonVal<45))
       {
ButtonName='-'; //35-36
result=true;
        }
    
        if ((buttonVal>60) && (buttonVal<85))
       {
ButtonName='+'; //72-73
result=true;
        }

        if ((buttonVal>110) && (buttonVal<135))
       {
ButtonName='S'; //122
result=true;
        }

        if ((buttonVal>175) && (buttonVal<200))
       {
ButtonName='R'; //187
result=true;
        }

        if ((buttonVal>275) && (buttonVal<295))
       {
ButtonName='L'; //285
result=true;
        }

        if ((buttonVal>415) && (buttonVal<440))
       {
ButtonName='>'; //429
result=true;
        }
        
        if ((buttonVal>645) && (buttonVal<670))
       {
ButtonName='X'; //658-659
result=false;
        }          

 buttonVal=0;    
    }  
       return result;
}  


 int sensorValue = 0;  // variable to store the value coming from the sensor
 int countvalues = 5;      // how many values must be averaged
 int ZeroLevel = 520;    // Zero level
 float kVolt = 0.0506;      // conversion factor

 
int Current(int sensorPin) {
  int TMPsensorValue = 0;
  int count = 0;
 
  for (count =0; count < countvalues; count++) {
    // read the value from the sensor:
    TMPsensorValue = analogRead(sensorPin);
    delay(30);
    // make average value
    sensorValue = (sensorValue+TMPsensorValue)/2;
    }
  return sensorValue;
  }

void Timer2_Timer() //обработка событий в таймере
{
  

 
  

//CurrentSensor1Value = analogRead(CurrentSensor1Pin);       // read analog input pin CurrentSensor1Pin

//int CurrentSensor1Value = Current(CurrentSensor1Pin);
//  Serial.println(kVolt * (CurrentSensor1Value - ZeroLevel));
/*  
if (DEBUG)
    {
    //  Serial.println(CurrentSensor1Value);  // prints the value read
 Serial.println((CurrentSensor1Value-512)*1000/20);  // prints the value read
  delay(100);                        // wait 100ms for next reading
    }
*/   
 
  
} 

 

leshak
Offline
Зарегистрирован: 29.09.2011

Ну так и есть. volatile забыли.

Глобальные переменные которые может менять функция обработчик прерывания - должны объявлятся с ним (может и без него будет работать, но сугубо от по фазе луны. если повезет). Почитайте доку http://arduino.ru/Reference/AttachInterrupt, обратите внимание на раздел ""Замечание по использованию". Там и про Serial есть, и про volatile.

Если LCDGear1_Indicate_PIN_XXX объявить как массив, то весь код можно привести в гораздо более читаемый вид. Не нужны "километровые портянки". Нужно же быть ленивым, когда нужно

Примерно так:

byte Gear_LCD_Pins[]={38,39,40,41,42,43,44,45};
#define D_idx 5 // индекс пина для индикации Передачи D на ЖКИ в массиве Gear_LCD_Pins, то есть 42-той пин, нумерация - с единицы (что-бы не заводить дефайны для 1-4-то передачи
#define N_idx 6
#define R_idx 7
#define P_idx 8 //индекс пина для индикации Передачи P на ЖКИ, то есть 45-тый пин


void setup(){
  for(byte i=0;i<P_idx;i++)pinMode(Gear_LCD_Pins[i],OUTPUT); // одним махом выставили режим сразу для всех Gear_LCD_Pins
 
  
  // Включили первую
  lcdGearOn(1);
  delay(2000);

  lcdGearOn(3); // третью
  delay(2000);

  lcdGearOn(N_idx); // нейтралку
  delay(2000);  
  
  lcdGearOn(P_idx); // парковку
  delay(2000);  
  
  // а теперь пробежались вообще по всем. От первой до парковки
  for(byte i=1;i<=P_idx;i++){
    lcdGearOn(i);
    delay(2000);
  }
lcdGearOff();// выключили
  
}

void loop(){
}

// выключает индикацию всех передчь
void lcdGearOff(){
   for(byte i=0;i<P_idx;i++)digitalWrite(Gear_LCD_Pins[i],LOW);
}

// включает индикацю передчи, idx - индекс передачи в массиве Gear_LCD_Pins, нумерация - с единицы
void lcdGearOn(byte idx){
   lcdGearOff();// на всяк случай вначале все выключим
   digitalWrite(Gear_LCD_Pins[idx-1],HIGH);// включили нунжный пин
}

 

 

 

 

kadushkin
Offline
Зарегистрирован: 18.12.2011

Спасибо, учту все эти замечания и потом выложу на суд.

P.S. Был в командировке