Да не секретная :)) Просто как показывает опыт, похейтят и дальше пойдут. А помочь никто не поможет)
/===========ИНИЦИАЛИЗИРУЕМ БИБЛИОТЕКИ=========================================================================
#include <Adafruit_NeoPixel.h>
#include <Adafruit_ADXL345_U.h>
//===========НАЗНАЧАЕМ ПИН ВЫХОДА НА ЛЕНТУ=====================================================================
const int PinLS = 12;
//===========НАЗНАЧАЕМ ПИНЫ ВХОДОВ=============================================================================
const int buttonPinD = 2;
const int buttonPinR = 4;
const int buttonPinL = 3;
const int buttonPinS = 5;
int buttonStateS = HIGH;
int buttonStateD = HIGH;
int buttonStateL = HIGH;
int buttonStateR = HIGH;
//===========ЗАДАЕМ ТАЙМИНГИ (НАСТРАИВАЮТСЯ ПО МЕСТУ МЕТОДОМ ПОДБОРА)==========================================
int pause_pov1 = 17;
int pause_pov2 = 175;
int ix;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(44, PinLS, NEO_GRB + NEO_KHZ800);
Adafruit_ADXL345_Unified accel = Adafruit_ADXL345_Unified(12345);
void setup() {
//===========ИНИЦИАЛИЗИРУЕМ ВХОДЫ, ПОДТЯГИВАЕМ К ПЛЮСУ=========================================================
pinMode(buttonPinS, INPUT_PULLUP);
pinMode(buttonPinD, INPUT_PULLUP);
pinMode(buttonPinL, INPUT_PULLUP);
pinMode(buttonPinR, INPUT_PULLUP);
strip.begin();
//===========ГАСИМ ЛЕНТУ=======================================================================================
for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
strip.show();
accel.begin();
//===========ОГРАНИЧИВАЕМ ДИАПАЗОН ИЗМЕРЕНИЙ 4G================================================================
accel.setRange(ADXL345_RANGE_4_G);
accel.setDataRate(ADXL345_DATARATE_100_HZ);
}
void loop() {
buttonStateS = digitalRead(buttonPinS);
buttonStateL = digitalRead(buttonPinL);
buttonStateR = digitalRead(buttonPinR);
buttonStateD = digitalRead(buttonPinD);
//===========ЭКСТРЕННОЕ ТОРМОЖЕНИЕ=============================================================================
sensors_event_t event;
accel.getEvent(&event);
ix = event.acceleration.x;
if (buttonStateS == LOW && ix < 6){ //значение от 1 до 9 (чем выше цифра тем чувствительней датчик)
for (int is=0; is<15; is++ ) {
for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(240,0,0));
strip.show();
delay(10 + is*10);
for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
strip.show();
delay(10 + is*3);
}}
//===========ОБЫЧНОЕ ТОРМОЖЕНИЕ================================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == HIGH){
for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
strip.show();
}
//===========ТОРМОЗ+ЗАДНИЙ ХОД=================================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){
delay(50);
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
strip.show();
while(buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){
buttonStateS = digitalRead(buttonPinS);
buttonStateL = digitalRead(buttonPinL);
buttonStateR = digitalRead(buttonPinR);
buttonStateD = digitalRead(buttonPinD);
delay(50);}
}
//===========ТОРМОЗ+АВАРИЙКА+ЗАДНИЙ ХОД========================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == LOW && buttonStateD == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<10; il++ ) {
strip.setPixelColor(9-il, strip.Color(250,80,0));
strip.setPixelColor(il+34, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(0,0,0));
strip.setPixelColor(il+34, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ТОРМОЗ+ПРАВЫЙ+ЗАДНИЙ ХОД==========================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == LOW && buttonStateD == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int il=0; il<10; il++ ) {
strip.setPixelColor(9-il, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ТОРМОЗ+ЛЕВЫЙ+ЗАДНИЙ ХОД===========================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == HIGH && buttonStateD == LOW){
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<10; il++ ) {
strip.setPixelColor(il+34, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(il+34, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ЗАДНИЙ ХОД========================================================================================
else if (buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
strip.show();
while(buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == HIGH && buttonStateD == LOW){
buttonStateS = digitalRead(buttonPinS);
buttonStateL = digitalRead(buttonPinL);
buttonStateR = digitalRead(buttonPinR);
buttonStateD = digitalRead(buttonPinD);
delay(50);}
}
//===========ТОРМОЗ+ЛЕВЫЙ======================================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == HIGH){
for (int i=0; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<11; il++ ) {
strip.setPixelColor(il+34, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(il+34, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ТОРМОЗ+ПРАВЫЙ=====================================================================================
else if (buttonStateS == LOW && buttonStateL == HIGH && buttonStateR == LOW){
for (int i=11; i<44; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ПРАВЫЙ============================================================================================
else if (buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == LOW && buttonStateD == HIGH){
for (int i=11; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ЛЕВЫЙ=============================================================================================
else if (buttonStateS == HIGH && buttonStateL == LOW && buttonStateR == HIGH && buttonStateD == HIGH){
for (int i=0; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<11; il++ ) {
strip.setPixelColor(il+34, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(il+34, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ЛЕВЫЙ+ЗАДНИЙ ХОД==================================================================================
else if (buttonStateS == HIGH && buttonStateL == HIGH && buttonStateR == LOW && buttonStateD == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int i=34; i<44; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<10; il++ ) {
strip.setPixelColor(9-il, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ПРАВЫЙ+ЗАДНИЙ ХОД=================================================================================
else if (buttonStateS == HIGH && buttonStateL == LOW && buttonStateR == HIGH && buttonStateD == LOW){
for (int i=0; i<10; i++ ) strip.setPixelColor(i, strip.Color(250,250,250));
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<10; il++ ) {
strip.setPixelColor(il+34, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(il+34, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========АВАРИЙКА==========================================================================================
else if (buttonStateS == HIGH && buttonStateL == LOW && buttonStateR == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
for (int il=0; il<10; il++ ) {
strip.setPixelColor(9-il, strip.Color(250,80,0));
strip.setPixelColor(il+34, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(0,0,0));
strip.setPixelColor(il+34, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========АВАРИЙКА+ТОРМОЗ================+==================================================================
else if (buttonStateS == LOW && buttonStateL == LOW && buttonStateR == LOW){
for (int i=10; i<34; i++ ) strip.setPixelColor(i, strip.Color(200,0,0));
for (int il=0; il<10; il++ ) {
strip.setPixelColor(9-il, strip.Color(250,80,0));
strip.setPixelColor(il+34, strip.Color(250,80,0));
strip.show();
delay(pause_pov1);
}
for (int il=0; il<11; il++ ) {
strip.setPixelColor(9-il, strip.Color(0,0,0));
strip.setPixelColor(il+34, strip.Color(0,0,0));
strip.show();
delay(pause_pov1);
}
delay(pause_pov2);
}
//===========ГАСИМ ЛЕНТУ=======================================================================================
else
{
for (int i=0; i<44; i++ ) strip.setPixelColor(i, strip.Color(0,0,0));
strip.show();
delay(10);
}
}
В общем проблема такая. При работе аварийки, поворотники очень часто "перемаргиваются" (т.е. вместо нормально бегущих огней в разные стороны, начинаются симофоры то влево то вправо ) Это объясняется тем, что сигналы к штатным лампам (с которых берется сигнал на ардуино) во время работы аварийки приходят несинхронно. Следственно скетч выполняет команду от того поворотника, с которого сигнал приходит первым. Не могу понять как в опрос поворотников запилить задержку таким образом, чтобы скетч какое-то время ждал сигнал от "неуспевшего дать импульс" поворотника и выполнял программу аварийки.