Нужно поправить скетч контроллера пневмоподвески автомобиля!

Evgen666
Offline
Зарегистрирован: 13.02.2020

Всем привет! Я новичок в этом деле, но недавно начал собирать пневмоподвеску на свой автомобиль и тут наткнулся на контроллер пневмоподвески на ардуино  http://arduinoprom.ru/shemotehnika/327-kontroller-upravlenija-pnevmopodveskoj.html , но дело в том что скетч писал незнающий человек в пневмоподвески, суть в том что надо изменить, если это возможно существующий скетч ( , а изменить надо то, чтобы при движении сигнал не шёл на клапана с датчиков высоты кузова,проще говоря после выбора позиции высоты автомобиля возьмём например комфорт, машина выставила по датчикам высоты автоматически высоту и всё через 10 секунд уже например не меняла положения по высоте , а просто выводила дальше показания с датчиков высоты! 

 

Evgen666
Offline
Зарегистрирован: 13.02.2020

Сам скетч 

#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

LiquidCrystal_I2C _lcd1(0x27, 16, 2);
int _dispTempLength1=0;
boolean _isNeedClearDisp1;

const byte _menuParametrsArray[]  PROGMEM =  {1, 3, 4, 0, 0, 0, 5, 9, 1, 4, 4, 0, 2, 3, 3, 0, 0, 0, 4, 3, 1, 4, 3, 0, 3, 3, 2, 0, 0, 0, 3, 8, 1, 4, 2, 0, 4, 3, 1, 0, 0, 0, 2, 7, 1, 4, 1, 0, 5, 3, 6, 0, 0, 0, 7, 10, 1, 4, 6, 0, 6, 3, 5, 0, 0, 0, 6, 6, 1, 4, 5, 0};
int _menuValueArray_int[6];
const int _menuConstantValuesArray_int[]  PROGMEM =  {1, 50, 60, 80, 95, 0, 30, 40, 75, 10};
 const char _flprogMenuNameString1[] PROGMEM = "Mode4";
 const char _flprogMenuNameString2[] PROGMEM = "Comfort";
 const char _flprogMenuNameString3[] PROGMEM = "Mode 2";
 const char _flprogMenuNameString4[] PROGMEM = "Max";
 const char _flprogMenuNameString5[] PROGMEM = "Parking";
 const char _flprogMenuNameString6[] PROGMEM = "Min";
const char* const _flprogMenuStringsArray[] PROGMEM = { _flprogMenuNameString1,  _flprogMenuNameString2,  _flprogMenuNameString3,  _flprogMenuNameString4,  _flprogMenuNameString5,  _flprogMenuNameString6};
struct _menuItemStricture {
 int startInArrayIndex;
};
struct _menuMainStricture {
 byte startIndex;
 byte stopIndex;
 bool isSwitchMenuAroundRing;
_menuItemStricture  currentItem;
};
_menuItemStricture _MenuItems[6];
_menuMainStricture _MainMenus[1];
bool _gtv7 = 0;
int _gtv8;
int _gtv9;
int _gtv11;
int _gtv12;
int _gtv13;
int _gtv14;
int _gtv15;
int _gtv16;
int _gtv17;
bool _gtv1;
bool _tim3I = 0;
bool _tim3O = 0;
unsigned long _tim3P = 0UL;
bool _trgs7 = 0;
bool _trgrt2 = 0;
bool _trgrt2I = 0;
bool _tim9I = 0;
bool _tim9O = 0;
unsigned long _tim9P = 0UL;
bool _trgs1 = 0;
bool _tim7I = 0;
bool _tim7O = 0;
unsigned long _tim7P = 0UL;
bool _tim1I = 0;
bool _tim1O = 0;
unsigned long _tim1P = 0UL;
bool _trgs6 = 0;
bool _bounseInputD11S = 0;
bool _bounseInputD11O = 0;
unsigned long _bounseInputD11P = 0UL;
int _disp3oldLength = 0;
bool _trgs5 = 0;
bool _tim4I = 0;
bool _tim4O = 0;
unsigned long _tim4P = 0UL;
bool _tim2I = 0;
bool _tim2O = 0;
unsigned long _tim2P = 0UL;
bool _trgrt3 = 0;
bool _trgrt3I = 0;
bool _trgrt1 = 0;
bool _trgrt1I = 0;
int _disp6oldLength = 0;
int _disp5oldLength = 0;
bool _MenuBlock_161074605_AMO_197608140 = 0;
bool _MenuBlock_161074605_AMO_118725622 = 0;
bool _MenuBlock_161074605_AMO_121738856 = 0;
bool _MenuBlock_161074605_AMO_42458003 = 0;
bool _MenuBlock_161074605_AMO_517854450 = 0;
bool _MenuBlock_161074605_AMO_283439636 = 0;
String _MenuBlock_161074605_MNO;
String _MenuBlock_161074605_VNO;
bool _MenuBlock_161074605_OEIS = 0;
bool _MenuBlock_161074605_OMUIS = 0;
bool _MenuBlock_161074605_OMDIS = 0;
bool _MenuBlock_161074605_OVUIS = 0;
bool _MenuBlock_161074605_OVDIS = 0;
int _disp2oldLength = 0;
bool _gen1I = 0;
bool _gen1O = 0;
unsigned long _gen1P = 0UL;
bool _trgs4 = 0;
int _disp1oldLength = 0;
bool _tim8I = 0;
bool _tim8O = 0;
unsigned long _tim8P = 0UL;
bool _bounseInputD12S = 0;
bool _bounseInputD12O = 0;
unsigned long _bounseInputD12P = 0UL;
bool _tim6I = 0;
bool _tim6O = 0;
unsigned long _tim6P = 0UL;
int _inputNumber1_Out = 0;
bool _trgs3 = 0;
bool _trgs8 = 0;
int _disp4oldLength = 0;
bool _tim5I = 0;
bool _tim5O = 0;
unsigned long _tim5P = 0UL;
int _mux1;
bool _bounseInputD2S = 0;
bool _bounseInputD2O = 0;
unsigned long _bounseInputD2P = 0UL;
bool _trgs2 = 0;

void setup()
{
pinMode(2, INPUT_PULLUP); 
pinMode(11, INPUT_PULLUP); 
pinMode(12, INPUT_PULLUP); 
pinMode(3, OUTPUT); 
digitalWrite(3, 0); 
pinMode(4, OUTPUT); 
digitalWrite(4, 0); 
pinMode(5, OUTPUT); 
digitalWrite(5, 0); 
pinMode(6, OUTPUT); 
digitalWrite(6, 0); 
pinMode(7, OUTPUT); 
digitalWrite(7, 0); 
pinMode(8, OUTPUT); 
digitalWrite(8, 0); 
pinMode(9, OUTPUT); 
digitalWrite(9, 0); 
pinMode(10, OUTPUT); 
digitalWrite(10, 0); 


Wire.begin();
delay(10);
if(((readByteFromEEPROM(0, 0, 0x0))) != 91) {
(updateByteToEEPROM(0, 0, 0x0, (91)));
(updateIntegerToEEPROM(1, 0, 0x0, (40)));
(updateIntegerToEEPROM(3, 0, 0x0, (50)));
(updateIntegerToEEPROM(5, 0, 0x0, (70)));
(updateIntegerToEEPROM(7, 0, 0x0, (85)));
(updateIntegerToEEPROM(9, 0, 0x0, (20)));
}
_lcd1.init();
_lcd1.backlight();
_bounseInputD12O =  digitalRead(12);
_bounseInputD11O =  digitalRead(11);
_bounseInputD2O =  digitalRead(2);
 _MenuItems[0].startInArrayIndex = 0;
 _MenuItems[1].startInArrayIndex = 12;
 _MenuItems[2].startInArrayIndex = 24;
 _MenuItems[3].startInArrayIndex = 36;
 _MenuItems[4].startInArrayIndex = 48;
 _MenuItems[5].startInArrayIndex = 60;
_MainMenus[0].startIndex = 1;
_MainMenus[0].isSwitchMenuAroundRing = 1;
_MainMenus[0].stopIndex = 6;
_MainMenus[0].currentItem = _MenuItems[0];
_menuValueArray_int[0] = (readIntegerFromEEPROM(1, 0, 0x0));
_menuValueArray_int[1] = (readIntegerFromEEPROM(3, 0, 0x0));
_menuValueArray_int[2] = (readIntegerFromEEPROM(5, 0, 0x0));
_menuValueArray_int[3] = (readIntegerFromEEPROM(7, 0, 0x0));
_menuValueArray_int[5] = (readIntegerFromEEPROM(9, 0, 0x0));

}
void loop()
{

bool _tempVariable_bool;
byte _tempVariable_byte;
if (_isNeedClearDisp1) {_lcd1.clear(); _isNeedClearDisp1= 0;}

bool  _bounceInputTmpD11 =  (digitalRead (11));

if (_bounseInputD11S) 
    {
     if (millis() >= (_bounseInputD11P + 40)) 
         {_bounseInputD11O= _bounceInputTmpD11; _bounseInputD11S=0;}
     }
else
    {
     if (_bounceInputTmpD11 != _bounseInputD11O )
         {_bounseInputD11S=1; _bounseInputD11P = millis();} 
      } 
bool  _bounceInputTmpD2 =  (digitalRead (2));

if (_bounseInputD2S) 
    {
     if (millis() >= (_bounseInputD2P + 40)) 
         {_bounseInputD2O= _bounceInputTmpD2; _bounseInputD2S=0;}
     }
else
    {
     if (_bounceInputTmpD2 != _bounseInputD2O )
         {_bounseInputD2S=1; _bounseInputD2P = millis();} 
      } 
bool  _bounceInputTmpD12 =  (digitalRead (12));

if (_bounseInputD12S) 
    {
     if (millis() >= (_bounseInputD12P + 40)) 
         {_bounseInputD12O= _bounceInputTmpD12; _bounseInputD12S=0;}
     }
else
    {
     if (_bounceInputTmpD12 != _bounseInputD12O )
         {_bounseInputD12S=1; _bounseInputD12P = millis();} 
      } 




//Плата:1
//Наименование:Страница / полусекундный генератор
if (!(0)) { if (! _gen1I) { _gen1I = 1; _gen1O = 1; _gen1P = millis(); } } else { _gen1I = 0 ; _gen1O= 0;}
 if (_gen1I) {  if ( _isTimer ( _gen1P , 250 )) { _gen1P = millis(); _gen1O = ! _gen1O;}}
if (_gen1O) { if (_trgrt2I) { _trgrt2 = 0;} else {_trgrt2 = 1; _trgrt2I = 1;} } else {_trgrt2 = 0; _trgrt2I = 0;}; 
 _gtv7 = _trgrt2;

//Плата:2
//Наименование:Управления 
if (!(0)) {
_dispTempLength1 = (((String(_gtv9, DEC)))).length();
if (_disp2oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp2oldLength = _dispTempLength1;
_lcd1.setCursor(0, 1);
_lcd1.print(((String(_gtv9, DEC))));
} else {
if (_disp2oldLength > 0) {_isNeedClearDisp1 = 1; _disp2oldLength = 0;} 
}
if (!(_bounseInputD2O)) { if (_trgrt3I) { _trgrt3 = 0;} else {_trgrt3 = 1; _trgrt3I = 1;} } else {_trgrt3 = 0; _trgrt3I = 0;}; 
 if(_trgrt3) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 2000)) _tim1O = 0;}}}
_gtv1 = _tim1O;
if (!(0)) { if (_trgrt1I) { _trgrt1 = 0;} else {_trgrt1 = 1; _trgrt1I = 1;} } else {_trgrt1 = 0; _trgrt1I = 0;}; 
  if (!(0)) {
_tempVariable_bool  =  1;
 if ( ! _MenuBlock_161074605_OEIS ) {_MenuBlock_161074605_OEIS = 1;
} 
_tempVariable_byte = pgm_read_byte(&_menuParametrsArray[((_MainMenus[0].currentItem ).startInArrayIndex)+10]);
_MenuBlock_161074605_MNO = _readStringFromProgmem ((char*)pgm_read_word(&(_flprogMenuStringsArray[_tempVariable_byte - 1])));
_MenuBlock_161074605_VNO = _menuOutputValueString (0);
_MenuBlock_161074605_AMO_197608140 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 1; 
_MenuBlock_161074605_AMO_118725622 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 2; 
_MenuBlock_161074605_AMO_121738856 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 3; 
_MenuBlock_161074605_AMO_42458003 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 4; 
_MenuBlock_161074605_AMO_517854450 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 5; 
_MenuBlock_161074605_AMO_283439636 = pgm_read_byte(&_menuParametrsArray[(_MainMenus[0].currentItem ).startInArrayIndex]) == 6; 
} else {
_tempVariable_bool  =  0;
if (_MenuBlock_161074605_OEIS){
_MenuBlock_161074605_OEIS = 0;
_menuUpdateToEEpromItems();
}
_MenuBlock_161074605_AMO_197608140 = 0;
_MenuBlock_161074605_AMO_118725622 = 0;
_MenuBlock_161074605_AMO_121738856 = 0;
_MenuBlock_161074605_AMO_42458003 = 0;
_MenuBlock_161074605_AMO_517854450 = 0;
_MenuBlock_161074605_AMO_283439636 = 0;
_MenuBlock_161074605_MNO = "";
_MenuBlock_161074605_VNO = "";
}
if(0) { if ( ! _MenuBlock_161074605_OMUIS) {_MenuBlock_161074605_OMUIS = 1;if (_tempVariable_bool){  _menuUpEvents(0);
_menuUpdateToEEpromItems();
}}} else {_MenuBlock_161074605_OMUIS = 0;}
if(!(_bounseInputD2O)) { if ( ! _MenuBlock_161074605_OMDIS) {_MenuBlock_161074605_OMDIS = 1;if (_tempVariable_bool){   _menuDownEvents(0);
_menuUpdateToEEpromItems();
}}} else {_MenuBlock_161074605_OMDIS = 0;}
if(!(_bounseInputD11O)) { if ( ! _MenuBlock_161074605_OVUIS) {_MenuBlock_161074605_OVUIS = 1; if (_tempVariable_bool){  _valueUpEvents(0); } }} else {_MenuBlock_161074605_OVUIS = 0; }
if(!(_bounseInputD12O)) { if ( ! _MenuBlock_161074605_OVDIS) {_MenuBlock_161074605_OVDIS = 1; if (_tempVariable_bool){  _valueDownEvents(0); }} } else {_MenuBlock_161074605_OVDIS = 0; }
if(_trgrt1){if (_tempVariable_bool){ (_MainMenus[0]).currentItem = _MenuItems[2];
_menuUpdateToEEpromItems();
 }}
_inputNumber1_Out = 0;
if (_MenuBlock_161074605_AMO_197608140) {_inputNumber1_Out = 1;}
if (_MenuBlock_161074605_AMO_118725622) {_inputNumber1_Out = 2;}
if (_MenuBlock_161074605_AMO_121738856) {_inputNumber1_Out = 3;}
if (_MenuBlock_161074605_AMO_42458003) {_inputNumber1_Out = 4;}
if (_MenuBlock_161074605_AMO_517854450) {_inputNumber1_Out = 5;}
if (_MenuBlock_161074605_AMO_283439636) {_inputNumber1_Out = 6;}
if((_inputNumber1_Out) == 0) {_mux1 = 0;}
if((_inputNumber1_Out) == 1) {_mux1 = (_menuValueArray_int[3]);}
if((_inputNumber1_Out) == 2) {_mux1 = (_menuValueArray_int[2]);}
if((_inputNumber1_Out) == 3) {_mux1 = (_menuValueArray_int[1]);}
if((_inputNumber1_Out) == 4) {_mux1 = (_menuValueArray_int[0]);}
if((_inputNumber1_Out) == 5) {_mux1 = (_menuValueArray_int[5]);}
if((_inputNumber1_Out) == 6) {_mux1 = 2;}
_gtv8 = _mux1;
if (!(0)) {
_dispTempLength1 = ((_MenuBlock_161074605_MNO)).length();
if (_disp1oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp1oldLength = _dispTempLength1;
_lcd1.setCursor(0, 0);
_lcd1.print((_MenuBlock_161074605_MNO));
} else {
if (_disp1oldLength > 0) {_isNeedClearDisp1 = 1; _disp1oldLength = 0;} 
}
if (!(0)) {
_dispTempLength1 = (((String(_gtv11, DEC)))).length();
if (_disp4oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp4oldLength = _dispTempLength1;
_lcd1.setCursor(4, 1);
_lcd1.print(((String(_gtv11, DEC))));
} else {
if (_disp4oldLength > 0) {_isNeedClearDisp1 = 1; _disp4oldLength = 0;} 
}
if (!(0)) {
_dispTempLength1 = (((String(_gtv12, DEC)))).length();
if (_disp5oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp5oldLength = _dispTempLength1;
_lcd1.setCursor(8, 1);
_lcd1.print(((String(_gtv12, DEC))));
} else {
if (_disp5oldLength > 0) {_isNeedClearDisp1 = 1; _disp5oldLength = 0;} 
}
if (!(0)) {
_dispTempLength1 = (((String(_gtv13, DEC)))).length();
if (_disp3oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp3oldLength = _dispTempLength1;
_lcd1.setCursor(12, 1);
_lcd1.print(((String(_gtv13, DEC))));
} else {
if (_disp3oldLength > 0) {_isNeedClearDisp1 = 1; _disp3oldLength = 0;} 
}
if (!(0)) {
_dispTempLength1 = (((((String(_gtv8, DEC))) + (String(" %"))))).length();
if (_disp6oldLength > _dispTempLength1) {_isNeedClearDisp1 = 1;} 
_disp6oldLength = _dispTempLength1;
_lcd1.setCursor(9, 0);
_lcd1.print(((((String(_gtv8, DEC))) + (String(" %")))));
} else {
if (_disp6oldLength > 0) {_isNeedClearDisp1 = 1; _disp6oldLength = 0;} 
}

//Плата:3
//Наименование:Управление клапанами передний правый
if (_gtv7) {
_gtv17 =  (analogRead (1));
}
_gtv9 = (map((_gtv17), (0), (1023), (0), (100)));
if(((map((_gtv17), (0), (1023), (0), (100)))) < ((_gtv8)-(5))) _trgs1 = 1;
if(((map((_gtv17), (0), (1023), (0), (100)))) >= (_gtv8)) _trgs1 = 0;
if (( (!((_gtv9) >= (95))) && (_trgs1) ))
{ if (_tim3I) { if (_isTimer(_tim3P, 2000)) {_tim3O = 1;}} else {_tim3I =1; _tim3P = millis();}} else {_tim3O = 0; _tim3I = 0;}
digitalWrite(4, ( (_tim3O) && (!(_gtv1)) ));
if((((map((_gtv17), (0), (1023), (0), (100))))-(2)) > (_gtv8)) _trgs2 = 1;
if(((map((_gtv17), (0), (1023), (0), (100)))) < (_gtv8)) _trgs2 = 0;
if (_trgs2)
{ if (_tim2I) { if (_isTimer(_tim2P, 2000)) {_tim2O = 1;}} else {_tim2I =1; _tim2P = millis();}} else {_tim2O = 0; _tim2I = 0;}
digitalWrite(3, ( (_tim2O) && (!(_gtv1)) ));

//Плата:4
//Наименование:Управление клапанами передний левый
if (_gtv7) {
_gtv16 =  (analogRead (2));
}
_gtv11 = (map((_gtv16), (0), (1023), (0), (100)));
if(((map((_gtv16), (0), (1023), (0), (100)))) < ((_gtv8)-(5))) _trgs3 = 1;
if(((map((_gtv16), (0), (1023), (0), (100)))) >= (_gtv8)) _trgs3 = 0;
if (( (!((_gtv11) >= (95))) && (_trgs3) ))
{ if (_tim5I) { if (_isTimer(_tim5P, 2000)) {_tim5O = 1;}} else {_tim5I =1; _tim5P = millis();}} else {_tim5O = 0; _tim5I = 0;}
digitalWrite(5, ( (_tim5O) && (!(_gtv1)) ));
if((((map((_gtv16), (0), (1023), (0), (100))))-(2)) > (_gtv8)) _trgs4 = 1;
if(((map((_gtv16), (0), (1023), (0), (100)))) < (_gtv8)) _trgs4 = 0;
if (_trgs4)
{ if (_tim4I) { if (_isTimer(_tim4P, 2000)) {_tim4O = 1;}} else {_tim4I =1; _tim4P = millis();}} else {_tim4O = 0; _tim4I = 0;}
digitalWrite(6, ( (_tim4O) && (!(_gtv1)) ));

//Плата:5
//Наименование:Управление клапанами задний правый
_gtv12 = (map((_gtv14), (0), (1023), (0), (100)));
if(((map((_gtv14), (0), (1023), (0), (100)))) < ((_gtv8)-(5))) _trgs5 = 1;
if(((map((_gtv14), (0), (1023), (0), (100)))) >= (_gtv8)) _trgs5 = 0;
if (( (!((_gtv12) >= (95))) && (_trgs5) ))
{ if (_tim7I) { if (_isTimer(_tim7P, 2000)) {_tim7O = 1;}} else {_tim7I =1; _tim7P = millis();}} else {_tim7O = 0; _tim7I = 0;}
digitalWrite(8, ( (_tim7O) && (!(_gtv1)) ));
if((((map((_gtv14), (0), (1023), (0), (100))))-(2)) > (_gtv8)) _trgs6 = 1;
if(((map((_gtv14), (0), (1023), (0), (100)))) < (_gtv8)) _trgs6 = 0;
if (_trgs6)
{ if (_tim6I) { if (_isTimer(_tim6P, 2000)) {_tim6O = 1;}} else {_tim6I =1; _tim6P = millis();}} else {_tim6O = 0; _tim6I = 0;}
digitalWrite(7, ( (_tim6O) && (!(_gtv1)) ));
if (_gtv7) {
_gtv14 =  (analogRead (3));
}

//Плата:6
//Наименование:Управление клапанами задний леаый
_gtv13 = (map((_gtv15), (0), (1023), (0), (100)));
if(((map((_gtv15), (0), (1023), (0), (100)))) < ((_gtv8)-(5))) _trgs7 = 1;
if(((map((_gtv15), (0), (1023), (0), (100)))) >= (_gtv8)) _trgs7 = 0;
if (( (!((_gtv13) >= (95))) && (_trgs7) ))
{ if (_tim9I) { if (_isTimer(_tim9P, 2000)) {_tim9O = 1;}} else {_tim9I =1; _tim9P = millis();}} else {_tim9O = 0; _tim9I = 0;}
digitalWrite(9, ( (_tim9O) && (!(_gtv1)) ));
if((((map((_gtv15), (0), (1023), (0), (100))))-(2)) > (_gtv8)) _trgs8 = 1;
if(((map((_gtv15), (0), (1023), (0), (100)))) < (_gtv8)) _trgs8 = 0;
if (_trgs8)
{ if (_tim8I) { if (_isTimer(_tim8P, 2000)) {_tim8O = 1;}} else {_tim8I =1; _tim8P = millis();}} else {_tim8O = 0; _tim8I = 0;}
digitalWrite(10, ( (_tim8O) && (!(_gtv1)) ));
if (_gtv7) {
_gtv15 =  (analogRead (0));
}






}

bool _isTimer(unsigned long startTime, unsigned long period )
  {
  unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));}
  }
String _readStringFromProgmem (char *string)
{
String result = String("");
while (pgm_read_byte(string)!='\0')
{
result=result+ char(pgm_read_byte(string));
string++;
}
return result;
}
 void _menuUpEvents (byte menuIndex)
{
byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
byte parIndex = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+5]);
byte parentStartIndex;
byte parentStopIndex;
if (parIndex == 0) {parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex;}
else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex - 1]).startInArrayIndex)+3]);
 parentStopIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex-1]).startInArrayIndex)+4]); }
if (tempIndex == parentStartIndex) {if((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {(_MainMenus[menuIndex]).currentItem = _MenuItems[parentStopIndex -1]; return;} else{return;}}
(_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex - 2];
return;
}
 void _menuDownEvents (byte menuIndex)
{
byte tempIndex = pgm_read_byte(&_menuParametrsArray[((_MainMenus[menuIndex]).currentItem).startInArrayIndex]);
byte parIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+5]);
byte parentStartIndex;
byte parentStopIndex;
if (parIndex == 0) {parentStartIndex = (_MainMenus[menuIndex]).startIndex; parentStopIndex = (_MainMenus[menuIndex]).stopIndex;}
else { parentStartIndex = pgm_read_byte(&_menuParametrsArray[( (_MenuItems[parIndex-1]).startInArrayIndex)+3]);
 parentStopIndex = pgm_read_byte(&_menuParametrsArray[((_MenuItems[parIndex-1]).startInArrayIndex)+4]); }
if (tempIndex == parentStopIndex) {if((_MainMenus[menuIndex]).isSwitchMenuAroundRing) {(_MainMenus[menuIndex]).currentItem = _MenuItems[parentStartIndex -1]; return;} else{return;}}
(_MainMenus[menuIndex]).currentItem = _MenuItems[tempIndex];
return;
}
 void _valueUpEvents (byte menuIndex)
{
byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+6]);
byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+8]);
if (itemType == 3) {if (! indexMax == 0) { if ( ! (int(pgm_read_word(&_menuConstantValuesArray_int[indexMax -1])) > int(_menuValueArray_int[valIndex -1]))) {return;} }
_menuValueArray_int[valIndex -1] = _menuValueArray_int[valIndex -1] + (pgm_read_word(&_menuConstantValuesArray_int[indexStep -1])); }
}
 void _valueDownEvents (byte menuIndex)
{

byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
byte itemType = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+7]);
byte indexStep = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+8]);
if (itemType == 3) { if (! indexMin == 0) { if ( ! ((int(pgm_read_word(&_menuConstantValuesArray_int[indexMin - 1]))) < int(_menuValueArray_int[valIndex - 1]))) {return;}} 
_menuValueArray_int[valIndex - 1] = _menuValueArray_int[valIndex - 1] - (pgm_read_word(&_menuConstantValuesArray_int[indexStep - 1])); }
}
 String _menuOutputValueString (byte menuIndex)
{
byte itemType = pgm_read_byte(&_menuParametrsArray[ (((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+1]);
byte valIndex = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+2]);
byte indexMin = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+7]);
byte indexMax = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+6]);
if( valIndex == 0){ return "";}
byte convFormat = pgm_read_byte(&_menuParametrsArray[(((_MainMenus[menuIndex]).currentItem).startInArrayIndex)+9]);
if(itemType == 3) { return _convertNamber(itemType, convFormat, valIndex, indexMax, indexMin);}
return "";
}
 void _menuUpdateToEEpromItems()
{
(updateIntegerToEEPROM(1, 0, 0x0, ((_menuValueArray_int[0]))));
(updateIntegerToEEPROM(3, 0, 0x0, ((_menuValueArray_int[1]))));
(updateIntegerToEEPROM(5, 0, 0x0, ((_menuValueArray_int[2]))));
(updateIntegerToEEPROM(7, 0, 0x0, ((_menuValueArray_int[3]))));
(updateIntegerToEEPROM(9, 0, 0x0, ((_menuValueArray_int[5]))));
}
String _convertNamber(byte itemType, byte convFormat, byte valIndex, byte indexMax, byte indexMin)
{
if (itemType== 3) {
if (convFormat == 4) { return String((_menuValueArray_int[valIndex - 1 ]),DEC);}
if (convFormat == 5) { return String((_menuValueArray_int[valIndex - 1]),HEX);}
if (convFormat == 6) { return String((_menuValueArray_int[valIndex -1]),BIN);}
}
}
 byte readByteFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
return EEPROM.read(addres);
}
void updateByteToEEPROM(int addres, byte bitAddres, byte chipAddres, byte value)
{
return EEPROM.update(addres, value);
}
 int readIntegerFromEEPROM(int addres, byte bitAddres, byte chipAddres)
{
byte hight = readByteFromEEPROM( addres,  bitAddres,  chipAddres);
byte low = readByteFromEEPROM( (addres+1),  bitAddres,  chipAddres);
return  word(hight, low);
}
 void updateIntegerToEEPROM(int addres, byte bitAddres, byte chipAddres, int value)
{
updateByteToEEPROM( addres,  bitAddres,  chipAddres, highByte(value));
updateByteToEEPROM( (addres+1),  bitAddres,  chipAddres, lowByte(value));
}

 

 

b707
Offline
Зарегистрирован: 26.05.2017

Мне кажется это скорее вы не понимаете в пневмоподвеске, а не автор кода.

Весь смысл пневмоподвески в том, чтобы отслеживать в движении сигналы с датчиков высоты и при крене оперативно подкачивать нужную сторону. А если зафиксировать подвеску в одном положении - то тут и ардуина с программой не нужна, можно обойтись набором тумблеров.

Что касается правки этого скетча - он написан в ФЛПрог (то естьусловно говоря -  роботом)и я сильно сомневаюсь, что какой-нить живой программист захочет копаться, в этом... язык не поворачивается сказать коде

vvadim
Offline
Зарегистрирован: 23.05.2012

поддерживаю.

вряд ли кто то эту простыню возьмётся править.

новый под ваши хотелки написать - пожалуйста.

-NMi-
Offline
Зарегистрирован: 20.08.2018

А какой смысл "прикручивать" дурдуину к пневмоподвеске? Какую она функцию будет выполнять???

Evgen666
Offline
Зарегистрирован: 13.02.2020

Это я понимаю) тогда ещё нужны датчики давления на каждую стойку по мимо датчиков высоты и тогда да, и чтобы на каждой кочке или ямке клапона не срабатывали, мозги видили например при наезде на кочку или барьдюр,что ненадо поднимать эту стойку, так как там возросло давление, ну это и школьнику понятно
В моем случае надо просто дисплей и 3 или больше присетов запомненых, нажал машина автоматом выставилась и все и поехал на этой высоте
А так думал о сенсорном дисплее и нарисовать и запрограмировать вот такой пульт https://m.youtube.com/watch?v=0zktO8XVN48

Но как понял это очень сложно и проще купить этот пульт за 14 р

Evgen666
Offline
Зарегистрирован: 13.02.2020

Вот для этого хотел на ардуино

-NMi-
Offline
Зарегистрирован: 20.08.2018

Evgen666 пишет:
Но как понял это очень сложно и проще купить этот пульт за 14 р

Если рассуждать с точки зрения дурдуины - нет, это не сложно, теоретически. На практике вы столкнётесь с проблемами схемотехники, т.к. никто жеж не поставит в автомобиль "клубок" микросхем с проводами, верно? Нужно всё это переносить на ПП и делать корпус и тд. А это не совсем дешевое удовольствие.

Теперь по теме: если бы мне вот прям вот так вот "захотелось" вкрячить на какой-нибудь ваз-таз-газ пневму - купил бы на разборке готовый блок ЭБУ и всё остальное за ~~5т.р. и не "парился" бы совсем.

b707
Offline
Зарегистрирован: 26.05.2017

Evgen666 пишет:
В моем случае надо просто дисплей и 3 или больше присетов запомненых, нажал машина автоматом выставилась и все и поехал на этой высоте

это будут просто регуоируемые аммортизаторы. И имейте в виду, что в первую очередь будет меняться жесткость, а высота - уже как следствие.  То есть при самой высокой посадке машина будет жесткой, как табуретка, а при низкой - мягкой как диван.

У меня был подобный проект, могу вам сделать такое. Только писать с нуля, а не переписывать ваш код. Если интересно - пишите ded@cur-ex.ru

brokly
brokly аватар
Offline
Зарегистрирован: 08.02.2014

Есть готовое без визуализации, могу прикрутить некшн. brokly(at)mail.ru . 

Купить готовое за 14 (если в комплекте монитор и все прибабахи) однозначно дешевле.

Evgen666
Offline
Зарегистрирован: 13.02.2020

Регулировка амортизаторов эту другое совсем, она регулируется крутилкой на штоке самого амортизатора

renoshnik
Offline
Зарегистрирован: 11.04.2013

Evgen666 пишет:
Это я понимаю) тогда ещё нужны датчики давления на каждую стойку по мимо датчиков высоты и тогда да, и чтобы на каждой кочке или ямке клапона не срабатывали, мозги видили например при наезде на кочку или барьдюр,что ненадо поднимать эту стойку, так как там возросло давление, ну это и школьнику понятно В моем случае надо просто дисплей и 3 или больше присетов запомненых, нажал машина автоматом выставилась и все и поехал на этой высоте А так думал о сенсорном дисплее и нарисовать и запрограмировать вот такой пульт https://m.youtube.com/watch?v=0zktO8XVN48 Но как понял это очень сложно и проще купить этот пульт за 14 р

Лет пять назад баловался вот таким пультом для пневмоподвески

https://www.drive2.ru/b/1098582/?from=blog

 

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Evgen666 пишет:
Регулировка амортизаторов эту другое совсем, она регулируется крутилкой на штоке самого амортизатора

Дык тогда-уш и амортизаторы электронные поставь, шоп уж тачко так тачко. Прикинь, поцыкам на районе засветишь пресеты и по пневме и по подвеске в целом. И ещё сделай, шоп с тилифона можно регулировать, виджет паставь, шоп там деффка нагибалась с линейкой (как на сход-развальном стенде) у машины. И на D2 выставь, и ссылко сюда дай... мол местные ардуинщеги заваяли сей дивайс наколенке а в bmw и vag лохи работают!

Nik_an
Nik_an аватар
Offline
Зарегистрирован: 20.11.2019

Evgen666 пишет:
Это я понимаю) тогда ещё нужны датчики давления на каждую стойку по мимо датчиков высоты и тогда да, и чтобы на каждой кочке или ямке клапона не срабатывали, мозги видили например при наезде на кочку или барьдюр,что ненадо поднимать эту стойку, так как там возросло давление, ну это и школьнику понятно В моем случае надо просто дисплей и 3 или больше присетов запомненых, нажал машина автоматом выставилась и все и поехал на этой высоте А так думал о сенсорном дисплее и нарисовать и запрограмировать вот такой пульт https://m.youtube.com/watch?v=0zktO8XVN48 Но как понял это очень сложно и проще купить этот пульт за 14 р

лучше всего купить ситроен С5, все остальные подвески детский лепет

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

Nik_an пишет:

лучше всего купить ситроен С5, все остальные подвески детский лепет

Саапщение номер СЕМЪ пачитай!!!

Какрас там про С5х2 пневму.

 

Nik_an
Nik_an аватар
Offline
Зарегистрирован: 20.11.2019

-NMi- пишет:

Nik_an пишет:

лучше всего купить ситроен С5, все остальные подвески детский лепет

Саапщение номер СЕМЪ пачитай!!!

Какрас там про С5х2 пневму.

 

во первых на С5 не пневма

во вторых я писал про подвеску а не про блок управления

-NMi-
Offline
Зарегистрирован: 20.08.2018

Nik_an пишет:

во первых на С5 не пневма

чо-ш там тагда, гидра???  (где ручник, кнопочки нахрена? простатак?)

Nik_an
Nik_an аватар
Offline
Зарегистрирован: 20.11.2019

-NMi- пишет:

Nik_an пишет:

во первых на С5 не пневма

чо-ш там тагда, гидра???  (где ручник, кнопочки нахрена? простатак?)

да там гидравлика, кнопочки высоту регулировать и жесткость - спорт\комфорт, и автоматом это регулируется в зависимости от качества дороги и скорости.