Отслеживание импульсов на пине Ардуино

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Здраствуйте. Есть скетч. Управление светодиодними матрицами на WS2812. В зависимости от прихода сигнала на пини, от задних фонарей автомобиля, загораются разние знаки на матрицах. Все работает. Но не расчитано на входной импульсний сигнал от ламп поворотов. Если давать постояяний смгнал (когда лапми поворотов просто светятся), то все работает. Нужно чтоби пока идут импульси на вход сигнала от ламп поворотов, то побпрограма моргания исполнялась. как-бы сказать.... Ну пока идут импульси с частотой 0.5-1 секунда, то подпрограма выполняется, как только в течении 1 секунди нет изменение на входном пине, от лампи поворотов, то подпрограма моргания прекращала свою работу.

 


 
//#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <iarduino_I2C_connect.h>
#include "Wire.h" 

// Призначення пінів
const uint8_t pin_m_l = A0;       // Ліва матриця
const uint8_t pin_m_r = A1;       // Права матриця 
const uint8_t pin_L = 4;
const uint8_t pin_R = 5;
const uint8_t pin_58 = 6;
const uint8_t pin_54 = 7;
const uint8_t pin_RF = 8;
const uint8_t pin_mfa_1 = 9;
const uint8_t pin_mfa_2 = 10;
const uint8_t pin_mfa_3 = A3;

iarduino_I2C_connect I2C2;      // объявляем переменную для работы c библиотекой iarduino_I2C_connect
byte REG_matrix[4];             // объявляем массив, данные которого будут доступны для чтения/записи по шине I2C

Adafruit_NeoMatrix matrix_l = Adafruit_NeoMatrix(32, 8, pin_m_l, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800) ;
Adafruit_NeoMatrix matrix_r = Adafruit_NeoMatrix(32, 8, pin_m_r, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800) ;

// Змінні для вибору режимів матриць
uint8_t mode_m=0;

// Загальні змінні
int16_t brightness = 50;        // 10
uint8_t mode_connect=0;
uint8_t i=0;
bool bmod_L, bmod_R, bmod_58, bmod_54, bmod_RF, bmod_mfa_1, bmod_mfa_2, bmod_mfa_3; 

int32_t temp_1 = 0 ;            // Тимчасова змінна, для затримки
uint8_t  delay_1 = 500;         // Установка часу затримки, 1000 мс, для millis-1

const uint8_t ON=0;             // 0
const uint8_t OFF=1;            // 1

// Налаштування режиму - L (Лівий поворот)
int32_t previousMillis_l = 0;   // время, когда состояние светодиода обновлялось
int32_t interval_l = 500;       // половина периода мигания (в миллисекундах)
uint8_t m_l_State = LOW;        // Стан лівої матриці: ВКЛ/ВИКЛ

// Налаштування режиму - R (Правий поворот)
int32_t previousMillis_r = 0;   // время, когда состояние светодиода обновлялось
int32_t interval_r = 500;       // половина периода мигания (в миллисекундах)
uint8_t m_r_State = LOW;        // Стан правої матриці: ВКЛ/ВИКЛ

// Налаштування режиму - LR (Аварійка)
int32_t previousMillis_lr = 0;  // время, когда состояние светодиода обновлялось
int32_t interval_lr = 500;      // половина периода мигания (в миллисекундах)
uint8_t m_lr_State = LOW;       // Стан лівої і правої матриці: ВКЛ/ВИКЛ
int16_t brightness_lr = 50;      // 25

// Налаштування режиму - 58 (Габарит)
int16_t brightness_58 = 50;      // 10

// Налаштування режиму - 54
int32_t previousMillis_54 = 0;  // время, когда состояние светодиода обновлялось
int32_t interval_54 = 750;      // половина периода мигания (в миллисекундах)
uint8_t ledState_54 = LOW;      // состояние светодиода: ВКЛ/ВИКЛ
int16_t brightness_54 = 50;     // 50

// Налаштування режиму - rf (Задній Хід)
int16_t brightness_rf = 50;      // 50

// Налаштування режиму - text 
uint8_t speed_text = 30;        // Швидкість біжучої стрічки //30 (більша цифра - повільніше)
int16_t num_text = 3;           // Порядковий номер тексту в базі
int16_t mode_tt= 0;
uint32_t time_text;             // Змінна для зберігання точки відліку
int16_t x_l = matrix_l.width();
int16_t x_r = matrix_r.width();
uint8_t pass_l = 0;
uint8_t pass_r = 6;

static const uint8_t PROGMEM myBitmap[][32] = {
  /*  0 */ 0xff,0xff,0xff,0xff,0x81,0x81,0x81,0x81,0xbd,0xbd,0xbd,0xbd,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0xbd,0xbd,0xbd,0xbd,0x81,0x81,0x81,0x81,0xff,0xff,0xff,0xff,
  /*  1 */ 0xff,0xff,0xff,0xff,0x81,0x81,0x81,0x81,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0xbd,0x81,0x81,0x81,0x81,0xff,0xff,0xff,0xff,
  /*  2 */ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  /*  3 */ 0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,0xcc,
  /*  4 */ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  /*  5 */ 0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,0x00,0x00,0xff,0xff,0xff,0xff,
  /*  6 */ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  /*  7 */ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xc3,0x0c,0x30,0xc3,0xc3,0x0c,0x30,0xc3,0xc3,0x0c,0x30,0xc3,0xc3,0x0c,0x30,0xc3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
  /*  8 */ 0x55,0x55,0x55,0x55,0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,0xAA,0xAA,0xAA,0xAA,0x55,0x55,0x55,0x55,0xAA,0xAA,0xAA,0xAA,
  /*  9 */ 0x99,0x99,0x99,0x99,0x5A,0x5A,0x5A,0x5A,0x3C,0x3C,0x3C,0x3C,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0xE7,0x3C,0x3C,0x3C,0x3C,0x5A,0x5A,0x5A,0x5A,0x99,0x99,0x99,0x99,
  /* 10 */ 0x3C,0x3C,0x3C,0x3C,0x42,0x42,0x42,0x42,0xA5,0xA5,0xA5,0xA5,0x81,0x81,0x81,0x81,0xA5,0xA5,0xA5,0xA5,0x99,0x99,0x99,0x99,0x42,0x42,0x42,0x42,0x3C,0x3C,0x3C,0x3C,
  /* 11 */ 0x3C,0x3C,0x3C,0x3C,0x42,0x42,0x42,0x42,0x99,0x99,0x99,0x99,0xA5,0xA5,0xA5,0xA5,0xA5,0xA5,0xA5,0xA5,0x99,0x99,0x99,0x99,0x42,0x42,0x42,0x42,0x3C,0x3C,0x3C,0x3C, 
           60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,60,
  /* 13 */ 0x3C,0x3C,0x3C,0x3C,0x42,0x42,0x42,0x42,0x99,0x99,0x99,0x99,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0x99,0x99,0x99,0x99,0x42,0x42,0x42,0x42,0x3C,0x3C,0x3C,0x3C, 
};

const char *slogans[]= {
  "<<<<<",  // 0
  ">>>>>",  // 1
  "STOP",   // 2
  "XXXXX",  // 3
  "<< >>",  // 4
  "OOOOO",  // 5
  "!!!!!",  // 6
  "=====",  // 7
  "#####",  // 8
};
  
const uint16_t colors_t[]={
  0xF800,  // 0 - Червоний   red
  0x07E0,  // 1 - Зелений    green
  0xFFE0,  // 2 - Жовтий     YELLOW
  0x001F,  // 3 - Синій      blue
  0xF81F,  // 4 - Пурпурний  magenta (Фіолетовий)
  0x07FF,  // 5 - Голубий    cyan
  0xFFFF   // 6 - Білий      white
    //  #define black 0x0000  
  };

const uint16_t colors[]={
  0xF800,  // 0 - Червоний   red
  0x07E0,  // 1 - Зелений    green
  0xFFE0,  // 2 - Жовтий     YELLOW
  0x001F,  // 3 - Синій      blue
  0xF81F,  // 4 - Пурпурний  magenta (Фіолетовий)
  0x07FF,  // 5 - Голубий    cyan
  0xFFFF   // 6 - Білий      white
    //  #define black 0x0000  
  };

const char *names[]  = {
  "Перепрошую",                       // 0 - 70
  "Вибачте",                          // 1 - 60
  "Дякую.",                           // 2 - 40
  "Привiт з Волинi!",                 // 3 - 100
  "Привiт.",                          // 6 - 40
};

void setup() {
  Wire.begin(0x02);                   // инициируем подключение к шине I2C в качестве ведомого (slave) устройства, с указанием своего адреса на шине.
  I2C2.begin(REG_matrix);             // инициируем возможность чтения/записи данных по шине I2C, из/в указываемый массив
  //Serial.begin(115200);
  matrix_l.begin();
  matrix_r.begin();
  matrix_l.cp437(true);
  matrix_r.cp437(true);
  matrix_l.setTextWrap(false);
  matrix_r.setTextWrap(false);
  matrix_l.fillScreen(0);
  matrix_r.fillScreen(0);
  matrix_l.clear(); // Очищаємо
  matrix_r.clear(); // Очищаємо
  matrix_l.show();                    // Виводимо, тобто гасимо всі, очищені
  matrix_r.show();                    // Виводимо, тобто гасимо всі, очищені
  pinMode(pin_m_l, OUTPUT);
  pinMode(pin_m_r, OUTPUT);
  pinMode(pin_L, INPUT);
  pinMode(pin_R, INPUT);
  pinMode(pin_58, INPUT);
  pinMode(pin_54, INPUT);
  pinMode(pin_RF, INPUT);
  pinMode(pin_mfa_1, INPUT);
  pinMode(pin_mfa_2, INPUT);
  pinMode(pin_mfa_3, INPUT);
  //Serial.println("Ready!");
}

void loop() 
{ 
  //Serial.println("loop");
  bmod_L = digitalRead(pin_L);
  bmod_R = digitalRead(pin_R);
  bmod_58 = digitalRead(pin_58);
  bmod_54 = digitalRead(pin_54);
  bmod_RF = digitalRead(pin_RF);
  bmod_mfa_1 = digitalRead(pin_mfa_1);
  bmod_mfa_2 = digitalRead(pin_mfa_2);
  bmod_mfa_3 = digitalRead(pin_mfa_3);
  //mode_l(); 
  //mode_r();
  //mode_lr();
  //mode_58();
  //mode_54(); 
  //mode_rf();
  //mode_m2();
  //mode_m3();
  //mode_m4();
  //mode_m5();
  //mode_m6();
  //mode_m7();
  //mode_text2(num_text);
  //mode_text3(num_text,mode_tt);
  //mods_54(); // test
  //mods_11(); // test
 
 //-------------------------------------------------------------------------
  mode_connect=REG_matrix[2]; // Статус зєднання з телефоном (1 - Розєднано, 0 - Зєднано)
  //mode_connect=1;    // для тесту
  if (mode_connect==0){
    compare();
  } else {
    mobila();
  }
//------------------- 
} // loop

//---------mobila---------- 
void mobila() {
  mode_m=REG_matrix[0]; // Режим матриці
  if (mode_m >= 0 && mode_m <= 16) {  // Якщо дорівнює або більше 0 і менше або дорівнює 16
    if (mode_m==1) {
      mode_l();
      //Serial.println("Лівий поворот");
    } else if (mode_m==2) {
      mode_r();
      //Serial.println("Правий поворот");
    } else if (mode_m==3) {
      mode_lr();
      //Serial.println("Аварійка");
    } else if (mode_m==4) {
      mode_58();
      //Serial.println("Габарит");
    } else if (mode_m==5) {
      mode_54();
      //Serial.println("Стоп-сигнал");
    } else if (mode_m==6) {
      mode_rf();
      //Serial.println("Задній хід");
    } else if (mode_m==7) {
      mode_m1();
      //REG_matrix[1] = 7; // Індикація режиму матриць
      //Serial.println("Програма М_1");
    } else if (mode_m==8) {
      //mode_m2();
      mode_text2(0); // Перепрошую
      REG_matrix[1] = 8; // Індикація режиму матриць
      //Serial.println("Програма М_2");
    } else if (mode_m==9) {
      //mode_m3();
      mode_text2(2); // Дякую
      REG_matrix[1] = 9; // Індикація режиму матриць
      //Serial.println("Програма М_3");
    } else if (mode_m==10) {
      //mode_m4();
      mode_text2(3); // Привіт з Волині
      REG_matrix[1] = 10; // Індикація режиму матриць
      //Serial.println("Програма М_4");
    } else if (mode_m==11) {
      //mode_m5();
      mode_text2(5); // UARNet - Супер iнтернет!
      REG_matrix[1] = 11; // Індикація режиму матриць
      //Serial.println("Програма М_5");
    } else if (mode_m==12) {
      //mode_m6();
      mode_text2(6); // Привіт.
      REG_matrix[1] = 12; // Індикація режиму матриць
      //Serial.println("Програма М_6");
    } else if (mode_m==13) {
      //mode_m7();
      mods_58 ();
      REG_matrix[1] = 13; // Індикація режиму матриць
      //Serial.println("Програма М_7");
    } else if (mode_m==14) {
      //mode_m8();
      mods_54();
      REG_matrix[1] = 14; // Індикація режиму матриць
      //Serial.println("Програма М_8");
    } else if (mode_m==15) {
      //mode_m9();
      mods_rf;
      REG_matrix[1] = 15; // Індикація режиму матриць
      //Serial.println("Програма М_9");
    } else if (mode_m==16) {
      //mode_m10();
      REG_matrix[1] = 16; // Індикація режиму матриць
      //Serial.println("Програма М_10");
      //} else if (mode_m==0) {
      //mode_0();
      //Serial.println("Програма М_0");
    } else {
      mode_0();
      REG_matrix[1] = 0;  // Режим матриці
      //Serial.println("Помилка");
    }
  }
}
//----------------------------------------------------------------------------
void compare() {
  // && - і, || - або
  if ( (bmod_L==ON && bmod_R==OFF && bmod_58==OFF && bmod_54==OFF && bmod_RF==OFF) || 
       (bmod_L==ON && bmod_R==OFF && bmod_58==ON && bmod_54==OFF && bmod_RF==OFF) ) {
     //Serial.println("_Лівий поворот_");
     //REG_matrix[1] = 1; // Індикація режиму матриць
     mode_l();
  } else if ((bmod_L==OFF && bmod_R==ON && bmod_58==OFF && bmod_54==OFF && bmod_RF==OFF) ||
             (bmod_L==OFF && bmod_R==ON && bmod_58==ON && bmod_54==OFF && bmod_RF==OFF) ) {
    //Serial.println("_Правий поворот_");
    //REG_matrix[1] = 2; // Індикація режиму матриць
    mode_r();
  } else if ( (bmod_L==ON && bmod_R==ON && bmod_58==OFF && bmod_54==OFF && bmod_RF==OFF) ||
              (bmod_L==ON && bmod_R==ON && bmod_58==ON && bmod_54==OFF && bmod_RF==OFF) ) {
    //Serial.println("_Аварійка_");
    //REG_matrix[1] = 3;  // Індикація режиму матриць
    mode_lr();
  } else if (bmod_L==OFF && bmod_R==OFF && bmod_58==ON && bmod_54==OFF && bmod_RF==OFF) {
    //Serial.println("_Габарит_");
    //REG_matrix[1] = 4;  // Індикація режиму матриць
    mode_58();
  } else if (bmod_54==ON) {
    //Serial.println("_Стоп-сигнал_");
    //REG_matrix[1] = 5;  // Індикація режиму матриць
    mode_54();
  } else if ((bmod_RF==ON) || (bmod_RF==ON && bmod_RF==ON)) {
    //Serial.println("_Задній хід_");
    //REG_matrix[1] = 6;  // Індикація режиму матриць
    mode_rf();
  } else if (bmod_mfa_1==ON) {
    //Serial.println("_mfa_1_");
    //REG_matrix[1] = 7;  // Індикація режиму матриць
    //mfa_1();
    mode_text2(0); // Перепрошую
  } else if (bmod_mfa_2==ON) {
    //Serial.println("_mfa_2_");
    //REG_matrix[1] = 8;  // Індикація режиму матриць
    //mfa_2();
    mode_text2(2); // Дякую
  } else if (bmod_mfa_3==ON) {
    //Serial.println("_mfa_3_");
    //REG_matrix[1] = 9;  // Індикація режиму матриць
    //mfa_3();
    mode_text2(5); // UARNet - Супер iнтернет!
  } else  {
    //Serial.println("_Помилка_");
    //REG_matrix[1] = 0;  // Індикація режиму матриць
    mode_0();
  }
 }

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

вот это будет работать, только если включишь кнопку аварийной остановки - нет

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

спасибо. Не все понятно, но попробую разобраться и внеднить в мой скетч. Спасибо

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

vidro_boltiv пишет:

спасибо. Не все понятно, но попробую разобраться и внеднить в мой скетч. Спасибо

логическое исключающее ИЛИ, подавая +5 на 8 или 9 пин  выходной сигнал на пине 13 будет соответствовать входящему

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

ну.. немножко не то ))).  Но всеравно спасибо что откликнулись.

AndreyD
AndreyD аватар
Offline
Зарегистрирован: 07.10.2018

Думаю так, в loop():

1) Записываем текущее значение миллис;

2) Условие. Если есть сигнал, то промежуточному значению присваиваем текущее.

3) Условие. Если разница между текущим значением и промежуточным меньше 1000, исполняем подпрограмму (функцию).

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

спасибо

sadman41
Offline
Зарегистрирован: 19.10.2016

А не проще какой-нить там конденсатор поставить? Пусть пульс превращает в постоянную напругу.

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

взавтра поробую с конденсатором

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

sadman41 пишет:
А не проще какой-нить там конденсатор поставить? Пусть пульс превращает в постоянную напругу.

для постоянной составляющей с тау  в 1 секунду RC будет 15 ком и 10 мкф если мы об одном и том же думаем

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

попробую сегодняю спасибо. Незнаю или отом самом ))))). Нужно постоянное напряжение на пине ардуинки, а не импульси от сигнала поворота, логику знаю как реализовать програмно, с кодом пока лажа.... буду дальше эксперементировать. Нужно отслеживать изменение на пине каждих 0.5 секунди.

 

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

vidro_boltiv пишет:

попробую сегодняю спасибо. Незнаю или отом самом ))))). Нужно постоянное напряжение на пине ардуинки, а не импульси от сигнала поворота, логику знаю как реализовать програмно, с кодом пока лажа.... буду дальше эксперементировать. Нужно отслеживать изменение на пине каждих 0.5 секунди.

а две секунды хватит?
 


//#include <Arduino.h>
#include <Adafruit_GFX.h>
#include <Adafruit_NeoMatrix.h>
#include <iarduino_I2C_connect.h>
#include "Wire.h"

// Призначення пінів
const uint8_t pin_m_l = A0;       // Ліва матриця
const uint8_t pin_m_r = A1;       // Права матриця
const uint8_t pin_L = 4;
const uint8_t pin_R = 5;
const uint8_t pin_58 = 6;
const uint8_t pin_54 = 7;
const uint8_t pin_RF = 8;
const uint8_t pin_mfa_1 = 9;
const uint8_t pin_mfa_2 = 10;
const uint8_t pin_mfa_3 = A3;
volatile uint32_t my_millis;

iarduino_I2C_connect I2C2;      // объявляем переменную для работы c библиотекой iarduino_I2C_connect
byte REG_matrix[4];             // объявляем массив, данные которого будут доступны для чтения/записи по шине I2C

Adafruit_NeoMatrix matrix_l = Adafruit_NeoMatrix(32, 8, pin_m_l, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800) ;
Adafruit_NeoMatrix matrix_r = Adafruit_NeoMatrix(32, 8, pin_m_r, NEO_MATRIX_BOTTOM + NEO_MATRIX_RIGHT + NEO_MATRIX_COLUMNS + NEO_MATRIX_ZIGZAG, NEO_GRB + NEO_KHZ800) ;

// Змінні для вибору режимів матриць
uint8_t mode_m = 0;

// Загальні змінні
int16_t brightness = 50;        // 10
uint8_t mode_connect = 0;
uint8_t i = 0;
bool bmod_L, bmod_R, bmod_58, bmod_54, bmod_RF, bmod_mfa_1, bmod_mfa_2, bmod_mfa_3;

int32_t temp_1 = 0 ;            // Тимчасова змінна, для затримки
uint8_t  delay_1 = 500;         // Установка часу затримки, 1000 мс, для millis-1

const uint8_t ON = 0;           // 0
const uint8_t OFF = 1;          // 1

// Налаштування режиму - L (Лівий поворот)
int32_t previousMillis_l = 0;   // время, когда состояние светодиода обновлялось
int32_t interval_l = 500;       // половина периода мигания (в миллисекундах)
uint8_t m_l_State = LOW;        // Стан лівої матриці: ВКЛ/ВИКЛ

// Налаштування режиму - R (Правий поворот)
int32_t previousMillis_r = 0;   // время, когда состояние светодиода обновлялось
int32_t interval_r = 500;       // половина периода мигания (в миллисекундах)
uint8_t m_r_State = LOW;        // Стан правої матриці: ВКЛ/ВИКЛ

// Налаштування режиму - LR (Аварійка)
int32_t previousMillis_lr = 0;  // время, когда состояние светодиода обновлялось
int32_t interval_lr = 500;      // половина периода мигания (в миллисекундах)
uint8_t m_lr_State = LOW;       // Стан лівої і правої матриці: ВКЛ/ВИКЛ
int16_t brightness_lr = 50;      // 25

// Налаштування режиму - 58 (Габарит)
int16_t brightness_58 = 50;      // 10

// Налаштування режиму - 54
int32_t previousMillis_54 = 0;  // время, когда состояние светодиода обновлялось
int32_t interval_54 = 750;      // половина периода мигания (в миллисекундах)
uint8_t ledState_54 = LOW;      // состояние светодиода: ВКЛ/ВИКЛ
int16_t brightness_54 = 50;     // 50

// Налаштування режиму - rf (Задній Хід)
int16_t brightness_rf = 50;      // 50

// Налаштування режиму - text
uint8_t speed_text = 30;        // Швидкість біжучої стрічки //30 (більша цифра - повільніше)
int16_t num_text = 3;           // Порядковий номер тексту в базі
int16_t mode_tt = 0;
uint32_t time_text;             // Змінна для зберігання точки відліку
int16_t x_l = matrix_l.width();
int16_t x_r = matrix_r.width();
uint8_t pass_l = 0;
uint8_t pass_r = 6;

static const uint8_t PROGMEM myBitmap[][32] = {
  /*  0 */ 0xff, 0xff, 0xff, 0xff, 0x81, 0x81, 0x81, 0x81, 0xbd, 0xbd, 0xbd, 0xbd, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xa5, 0xbd, 0xbd, 0xbd, 0xbd, 0x81, 0x81, 0x81, 0x81, 0xff, 0xff, 0xff, 0xff,
  /*  1 */ 0xff, 0xff, 0xff, 0xff, 0x81, 0x81, 0x81, 0x81, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0xbd, 0x81, 0x81, 0x81, 0x81, 0xff, 0xff, 0xff, 0xff,
  /*  2 */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  /*  3 */ 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc, 0xcc,
  /*  4 */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  /*  5 */ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
  /*  6 */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  /*  7 */ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc3, 0x0c, 0x30, 0xc3, 0xc3, 0x0c, 0x30, 0xc3, 0xc3, 0x0c, 0x30, 0xc3, 0xc3, 0x0c, 0x30, 0xc3, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
  /*  8 */ 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, 0xAA, 0xAA, 0xAA, 0xAA,
  /*  9 */ 0x99, 0x99, 0x99, 0x99, 0x5A, 0x5A, 0x5A, 0x5A, 0x3C, 0x3C, 0x3C, 0x3C, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0xE7, 0x3C, 0x3C, 0x3C, 0x3C, 0x5A, 0x5A, 0x5A, 0x5A, 0x99, 0x99, 0x99, 0x99,
  /* 10 */ 0x3C, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, 0x42, 0xA5, 0xA5, 0xA5, 0xA5, 0x81, 0x81, 0x81, 0x81, 0xA5, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, 0x99, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x3C, 0x3C, 0x3C,
  /* 11 */ 0x3C, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x99, 0x99, 0x99, 0x99, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0xA5, 0x99, 0x99, 0x99, 0x99, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x3C, 0x3C, 0x3C,
  60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
  /* 13 */ 0x3C, 0x3C, 0x3C, 0x3C, 0x42, 0x42, 0x42, 0x42, 0x99, 0x99, 0x99, 0x99, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0xBD, 0x99, 0x99, 0x99, 0x99, 0x42, 0x42, 0x42, 0x42, 0x3C, 0x3C, 0x3C, 0x3C,
};

const char *slogans[] = {
  "<<<<<",  // 0
  ">>>>>",  // 1
  "STOP",   // 2
  "XXXXX",  // 3
  "<< >>",  // 4
  "OOOOO",  // 5
  "!!!!!",  // 6
  "=====",  // 7
  "#####",  // 8
};

const uint16_t colors_t[] = {
  0xF800,  // 0 - Червоний   red
  0x07E0,  // 1 - Зелений    green
  0xFFE0,  // 2 - Жовтий     YELLOW
  0x001F,  // 3 - Синій      blue
  0xF81F,  // 4 - Пурпурний  magenta (Фіолетовий)
  0x07FF,  // 5 - Голубий    cyan
  0xFFFF   // 6 - Білий      white
  //  #define black 0x0000
};

const uint16_t colors[] = {
  0xF800,  // 0 - Червоний   red
  0x07E0,  // 1 - Зелений    green
  0xFFE0,  // 2 - Жовтий     YELLOW
  0x001F,  // 3 - Синій      blue
  0xF81F,  // 4 - Пурпурний  magenta (Фіолетовий)
  0x07FF,  // 5 - Голубий    cyan
  0xFFFF   // 6 - Білий      white
  //  #define black 0x0000
};

const char *names[]  = {
  "Перепрошую",                       // 0 - 70
  "Вибачте",                          // 1 - 60
  "Дякую.",                           // 2 - 40
  "Привiт з Волинi!",                 // 3 - 100
  "Привiт.",                          // 6 - 40
};

void setup() {
  Wire.begin(0x02);                   // инициируем подключение к шине I2C в качестве ведомого (slave) устройства, с указанием своего адреса на шине.
  I2C2.begin(REG_matrix);             // инициируем возможность чтения/записи данных по шине I2C, из/в указываемый массив
  //Serial.begin(115200);
  matrix_l.begin();
  matrix_r.begin();
  matrix_l.cp437(true);
  matrix_r.cp437(true);
  matrix_l.setTextWrap(false);
  matrix_r.setTextWrap(false);
  matrix_l.fillScreen(0);
  matrix_r.fillScreen(0);
  matrix_l.clear(); // Очищаємо
  matrix_r.clear(); // Очищаємо
  matrix_l.show();                    // Виводимо, тобто гасимо всі, очищені
  matrix_r.show();                    // Виводимо, тобто гасимо всі, очищені
  pinMode(pin_m_l, OUTPUT);
  pinMode(pin_m_r, OUTPUT);
  pinMode(pin_L, INPUT);
  pinMode(pin_R, INPUT);
  pinMode(pin_58, INPUT);
  pinMode(pin_54, INPUT);
  pinMode(pin_RF, INPUT);
  pinMode(pin_mfa_1, INPUT);
  pinMode(pin_mfa_2, INPUT);
  pinMode(pin_mfa_3, INPUT);
  //Serial.println("Ready!");
}

void loop()
{
  //Serial.println("loop");
  if (((digitalRead(pin_L) || digitalRead(pin_R)) && millis() - my_millis <= 2000 /* 2 cсекунды */)
{
  my_millis = millis(); // переустанавливаем таймер с каждым миганием поворотника
    bmod_L = digitalRead(pin_L);
    bmod_R = digitalRead(pin_R);
  }
  if ( millis() - my_millis >= 2000)
{
  my_millis = millis(); // переустанавливаем таймер 
  bmod_L = 0;
  bmod_R = 0;
}

bmod_58 = digitalRead(pin_58);
          bmod_54 = digitalRead(pin_54);
          bmod_RF = digitalRead(pin_RF);
          bmod_mfa_1 = digitalRead(pin_mfa_1);
          bmod_mfa_2 = digitalRead(pin_mfa_2);
          bmod_mfa_3 = digitalRead(pin_mfa_3);
          //mode_l();
          //mode_r();
          //mode_lr();
          //mode_58();
          //mode_54();
          //mode_rf();
          //mode_m2();
          //mode_m3();
          //mode_m4();
          //mode_m5();
          //mode_m6();
          //mode_m7();
          //mode_text2(num_text);
          //mode_text3(num_text,mode_tt);
          //mods_54(); // test
          //mods_11(); // test

          //-------------------------------------------------------------------------
          mode_connect = REG_matrix[2]; // Статус зєднання з телефоном (1 - Розєднано, 0 - Зєднано)
          //mode_connect=1;    // для тесту
if (mode_connect == 0) {
  compare();
  } else {
    mobila();
  }
  //-------------------
} // loop

//---------mobila----------
void mobila() {
  mode_m = REG_matrix[0]; // Режим матриці
  if (mode_m >= 0 && mode_m <= 16) {  // Якщо дорівнює або більше 0 і менше або дорівнює 16
    if (mode_m == 1) {
      mode_l();
      //Serial.println("Лівий поворот");
    } else if (mode_m == 2) {
      mode_r();
      //Serial.println("Правий поворот");
    } else if (mode_m == 3) {
      mode_lr();
      //Serial.println("Аварійка");
    } else if (mode_m == 4) {
      mode_58();
      //Serial.println("Габарит");
    } else if (mode_m == 5) {
      mode_54();
      //Serial.println("Стоп-сигнал");
    } else if (mode_m == 6) {
      mode_rf();
      //Serial.println("Задній хід");
    } else if (mode_m == 7) {
      mode_m1();
      //REG_matrix[1] = 7; // Індикація режиму матриць
      //Serial.println("Програма М_1");
    } else if (mode_m == 8) {
      //mode_m2();
      mode_text2(0); // Перепрошую
      REG_matrix[1] = 8; // Індикація режиму матриць
      //Serial.println("Програма М_2");
    } else if (mode_m == 9) {
      //mode_m3();
      mode_text2(2); // Дякую
      REG_matrix[1] = 9; // Індикація режиму матриць
      //Serial.println("Програма М_3");
    } else if (mode_m == 10) {
      //mode_m4();
      mode_text2(3); // Привіт з Волині
      REG_matrix[1] = 10; // Індикація режиму матриць
      //Serial.println("Програма М_4");
    } else if (mode_m == 11) {
      //mode_m5();
      mode_text2(5); // UARNet - Супер iнтернет!
      REG_matrix[1] = 11; // Індикація режиму матриць
      //Serial.println("Програма М_5");
    } else if (mode_m == 12) {
      //mode_m6();
      mode_text2(6); // Привіт.
      REG_matrix[1] = 12; // Індикація режиму матриць
      //Serial.println("Програма М_6");
    } else if (mode_m == 13) {
      //mode_m7();
      mods_58 ();
      REG_matrix[1] = 13; // Індикація режиму матриць
      //Serial.println("Програма М_7");
    } else if (mode_m == 14) {
      //mode_m8();
      mods_54();
      REG_matrix[1] = 14; // Індикація режиму матриць
      //Serial.println("Програма М_8");
    } else if (mode_m == 15) {
      //mode_m9();
      mods_rf;
      REG_matrix[1] = 15; // Індикація режиму матриць
      //Serial.println("Програма М_9");
    } else if (mode_m == 16) {
      //mode_m10();
      REG_matrix[1] = 16; // Індикація режиму матриць
      //Serial.println("Програма М_10");
      //} else if (mode_m==0) {
      //mode_0();
      //Serial.println("Програма М_0");
    } else {
      mode_0();
      REG_matrix[1] = 0;  // Режим матриці
      //Serial.println("Помилка");
    }
  }
}
//----------------------------------------------------------------------------
void compare() {
  // && - і, || - або
  if ( (bmod_L == ON && bmod_R == OFF && bmod_58 == OFF && bmod_54 == OFF && bmod_RF == OFF) ||
       (bmod_L == ON && bmod_R == OFF && bmod_58 == ON && bmod_54 == OFF && bmod_RF == OFF) ) {
    //Serial.println("_Лівий поворот_");
    //REG_matrix[1] = 1; // Індикація режиму матриць
    mode_l();
  } else if ((bmod_L == OFF && bmod_R == ON && bmod_58 == OFF && bmod_54 == OFF && bmod_RF == OFF) ||
             (bmod_L == OFF && bmod_R == ON && bmod_58 == ON && bmod_54 == OFF && bmod_RF == OFF) ) {
    //Serial.println("_Правий поворот_");
    //REG_matrix[1] = 2; // Індикація режиму матриць
    mode_r();
  } else if ( (bmod_L == ON && bmod_R == ON && bmod_58 == OFF && bmod_54 == OFF && bmod_RF == OFF) ||
              (bmod_L == ON && bmod_R == ON && bmod_58 == ON && bmod_54 == OFF && bmod_RF == OFF) ) {
    //Serial.println("_Аварійка_");
    //REG_matrix[1] = 3;  // Індикація режиму матриць
    mode_lr();
  } else if (bmod_L == OFF && bmod_R == OFF && bmod_58 == ON && bmod_54 == OFF && bmod_RF == OFF) {
    //Serial.println("_Габарит_");
    //REG_matrix[1] = 4;  // Індикація режиму матриць
    mode_58();
  } else if (bmod_54 == ON) {
    //Serial.println("_Стоп-сигнал_");
    //REG_matrix[1] = 5;  // Індикація режиму матриць
    mode_54();
  } else if ((bmod_RF == ON) || (bmod_RF == ON && bmod_RF == ON)) {
    //Serial.println("_Задній хід_");
    //REG_matrix[1] = 6;  // Індикація режиму матриць
    mode_rf();
  } else if (bmod_mfa_1 == ON) {
    //Serial.println("_mfa_1_");
    //REG_matrix[1] = 7;  // Індикація режиму матриць
    //mfa_1();
    mode_text2(0); // Перепрошую
  } else if (bmod_mfa_2 == ON) {
    //Serial.println("_mfa_2_");
    //REG_matrix[1] = 8;  // Індикація режиму матриць
    //mfa_2();
    mode_text2(2); // Дякую
  } else if (bmod_mfa_3 == ON) {
    //Serial.println("_mfa_3_");
    //REG_matrix[1] = 9;  // Індикація режиму матриць
    //mfa_3();
    mode_text2(5); // UARNet - Супер iнтернет!
  } else  {
    //Serial.println("_Помилка_");
    //REG_matrix[1] = 0;  // Індикація режиму матриць
    mode_0();
  }
}

 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

хватить, импульсы моргия поворотников обычно 0.5-1 секунда

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Можна сделать в самой подпрограмме моргания. Здесь только основной скетч, еще есть две вкладки с подпрограмамми.

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

ну пробуй

b707
Онлайн
Зарегистрирован: 26.05.2017

vidro_boltiv пишет:

Здесь только основной скетч, еще есть две вкладки с подпрограмамми.

скетч весьма кривой. лучше пытайтесь писать сами. чем этакое в инете подбирать

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

чем кривой?

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Спасибо всем. Вопрос решился установкой конденсаторов. Может в кого есть желание помочь програмно решить и попраить скертч, соответственно НЕ забезплатно. Оплачу в рамках разумнеого. Также спасибо всем кто непроигнорировал и откликнулся.

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Спасибо всем. 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

vidro_boltiv пишет:

...попраить скертч, соответственно НЕ забезплатно. Оплачу в рамках разумнеого. 

Специально для таких предложений существует раздел "Ищу исполнителя".

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

b707
Онлайн
Зарегистрирован: 26.05.2017

andriano пишет:

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

причем настолько, что подобная оговорка в устах заказчика сразу отбивает желание даже спрашивать. сколько это разумное в рублях :)

DetSimen
DetSimen аватар
Онлайн
Зарегистрирован: 25.01.2017

Ну, рублей триста, я думаю, отжалеет. 

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

Рублей триста - то вообще не проблема (даже при оплате наперед). Ну буду писать в разделе - Ищу исполнителя. 

b707
Онлайн
Зарегистрирован: 26.05.2017

vidro_boltiv пишет:

Рублей триста - то вообще не проблема (даже при оплате наперед). Ну буду писать в разделе - Ищу исполнителя. 

про 300р была ирония.

5-10 тысяч это стоит. если хотите нормальный результат

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016
b707
Онлайн
Зарегистрирован: 26.05.2017

ну дерзайте

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

У Вас там темы задублировались, вот правильная сылка - http://arduino.ru/forum/ishchu-ispolnitelya/popravka-sketcha-upravleniya-matritsami-na-ws2812-ot-zadnikh-fonarei-avtom

vidro_boltiv
vidro_boltiv аватар
Offline
Зарегистрирован: 18.10.2016

спасибо