Нужно поправить скетч контроллера пневмоподвески автомобиля!
- Войдите на сайт для отправки комментариев
Всем привет! Я новичок в этом деле, но недавно начал собирать пневмоподвеску на свой автомобиль и тут наткнулся на контроллер пневмоподвески на ардуино http://arduinoprom.ru/shemotehnika/327-kontroller-upravlenija-pnevmopodveskoj.html , но дело в том что скетч писал незнающий человек в пневмоподвески, суть в том что надо изменить, если это возможно существующий скетч ( , а изменить надо то, чтобы при движении сигнал не шёл на клапана с датчиков высоты кузова,проще говоря после выбора позиции высоты автомобиля возьмём например комфорт, машина выставила по датчикам высоты автоматически высоту и всё через 10 секунд уже например не меняла положения по высоте , а просто выводила дальше показания с датчиков высоты!
Сам скетч
#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)); }Мне кажется это скорее вы не понимаете в пневмоподвеске, а не автор кода.
Весь смысл пневмоподвески в том, чтобы отслеживать в движении сигналы с датчиков высоты и при крене оперативно подкачивать нужную сторону. А если зафиксировать подвеску в одном положении - то тут и ардуина с программой не нужна, можно обойтись набором тумблеров.
Что касается правки этого скетча - он написан в ФЛПрог (то естьусловно говоря - роботом)и я сильно сомневаюсь, что какой-нить живой программист захочет копаться, в этом... язык не поворачивается сказать коде
поддерживаю.
вряд ли кто то эту простыню возьмётся править.
новый под ваши хотелки написать - пожалуйста.
А какой смысл "прикручивать" дурдуину к пневмоподвеске? Какую она функцию будет выполнять???
Это я понимаю) тогда ещё нужны датчики давления на каждую стойку по мимо датчиков высоты и тогда да, и чтобы на каждой кочке или ямке клапона не срабатывали, мозги видили например при наезде на кочку или барьдюр,что ненадо поднимать эту стойку, так как там возросло давление, ну это и школьнику понятно
В моем случае надо просто дисплей и 3 или больше присетов запомненых, нажал машина автоматом выставилась и все и поехал на этой высоте
А так думал о сенсорном дисплее и нарисовать и запрограмировать вот такой пульт https://m.youtube.com/watch?v=0zktO8XVN48
Но как понял это очень сложно и проще купить этот пульт за 14 р
Вот для этого хотел на ардуино
Если рассуждать с точки зрения дурдуины - нет, это не сложно, теоретически. На практике вы столкнётесь с проблемами схемотехники, т.к. никто жеж не поставит в автомобиль "клубок" микросхем с проводами, верно? Нужно всё это переносить на ПП и делать корпус и тд. А это не совсем дешевое удовольствие.
Теперь по теме: если бы мне вот прям вот так вот "захотелось" вкрячить на какой-нибудь ваз-таз-газ пневму - купил бы на разборке готовый блок ЭБУ и всё остальное за ~~5т.р. и не "парился" бы совсем.
это будут просто регуоируемые аммортизаторы. И имейте в виду, что в первую очередь будет меняться жесткость, а высота - уже как следствие. То есть при самой высокой посадке машина будет жесткой, как табуретка, а при низкой - мягкой как диван.
У меня был подобный проект, могу вам сделать такое. Только писать с нуля, а не переписывать ваш код. Если интересно - пишите ded@cur-ex.ru
Есть готовое без визуализации, могу прикрутить некшн. brokly(at)mail.ru .
Купить готовое за 14 (если в комплекте монитор и все прибабахи) однозначно дешевле.
Регулировка амортизаторов эту другое совсем, она регулируется крутилкой на штоке самого амортизатора
Лет пять назад баловался вот таким пультом для пневмоподвески
https://www.drive2.ru/b/1098582/?from=blog
Дык тогда-уш и амортизаторы электронные поставь, шоп уж тачко так тачко. Прикинь, поцыкам на районе засветишь пресеты и по пневме и по подвеске в целом. И ещё сделай, шоп с тилифона можно регулировать, виджет паставь, шоп там деффка нагибалась с линейкой (как на сход-развальном стенде) у машины. И на D2 выставь, и ссылко сюда дай... мол местные ардуинщеги заваяли сей дивайс наколенке а в bmw и vag лохи работают!
лучше всего купить ситроен С5, все остальные подвески детский лепет
лучше всего купить ситроен С5, все остальные подвески детский лепет
Саапщение номер СЕМЪ пачитай!!!
Какрас там про С5х2 пневму.
лучше всего купить ситроен С5, все остальные подвески детский лепет
Саапщение номер СЕМЪ пачитай!!!
Какрас там про С5х2 пневму.
во первых на С5 не пневма
во вторых я писал про подвеску а не про блок управления
во первых на С5 не пневма
чо-ш там тагда, гидра??? (где ручник, кнопочки нахрена? простатак?)
во первых на С5 не пневма
чо-ш там тагда, гидра??? (где ручник, кнопочки нахрена? простатак?)
да там гидравлика, кнопочки высоту регулировать и жесткость - спорт\комфорт, и автоматом это регулируется в зависимости от качества дороги и скорости.