const int r1 = 4;
const int g1 = 3;
const int b1 = 2;
const int r2 = 7;
const int g2 = 6; // ввожу переменные для удобного вызова пинов в функциях
const int b2 = 5;
const int r3 = 10;
const int g3 = 9;
const int b3 = 8;
const int r4 = 13;
const int g4 = 12;
const int b4 = 11;
int Kostyl = 0;
int changingDiode = 0; // переключение изменяемого светодиода
unsigned long BeginActive = 0; // время, когда кнопки были нажаты и диоды зажглись
unsigned long activeDelay = 5000; // промежуток времени, после которого они должны потухнуть
unsigned long systemTimer; // переменная, благодаря которой идет системный таймер
// и можно вести отсчет включения, выключения и смены цвета у светодиодов
const int sb = A2; // пин для кнопки переключения изменяемого диода
const int cb = A3; // пин для кнопки переключения цвета
const int highLimit = 1023; // максимальное принимаемое значение от кнопки, при котором считывается клик
const int lowLimit = 900; // второе значение для перепроверки нажатия кнопки и избежания ложных срабатываниий (дребезга)
int status = 0; // статус активности или неактивности светодиодов, в основном нужен для отображения в консоли
//номер светодиода//
double diodeConteiners[4][4]{
{0,0,0,0}, //состояние светодиода и таймер//
{0,0,0,0}, // первый элемент строки - цвет (0 выключен, 1 красный, 2 зеленый, 3 синий, нужно также добавить 4 желтый (еще не реализовано))
{0,0,0,0}, // второй элемент строки - состояние цветодиода (0 выключен, 1 включен, 2 мигающий(изменение цвета))
{0,0,0,0} // третий элемент строки - время начала отсчета
}; // четвертый это по идее время конца отсчета, но не факт, что пригодится
// здесь идет речь именно о времени начала отсчета, которые отвечает за цвет, а не зажигает светодиоды
void setup() {
Serial.begin(9600); // отображение информации в консоли
pinMode(sb, INPUT);
pinMode(cb, INPUT);
pinMode(r1, OUTPUT);
pinMode(g1, OUTPUT);
pinMode(b1, OUTPUT);
pinMode(r2, OUTPUT);
pinMode(b2, OUTPUT);
pinMode(g2, OUTPUT);
pinMode(r3, OUTPUT);
pinMode(b3, OUTPUT);
pinMode(g3, OUTPUT);
pinMode(r4, OUTPUT);
pinMode(b4, OUTPUT);
pinMode(g4, OUTPUT);
// put your setup code here, to run once:
}
void changeColor() {
if (analogRead(cb) == highLimit) { // Если кнопка cb нажата
delay(1); // Устраняем дребезг
if (analogRead(cb) > lowLimit) { // Дополнительная проверка
diodeConteiners[changingDiode][0]++; // Увеличиваем значение цвета
BeginActive+=1500;
delay(100);
if (diodeConteiners[changingDiode][0] > 4) { // Если больше 4, сбрасываем на 0
diodeConteiners[changingDiode][0] = 0;
}
Serial.print("Color changed for diode ");
Serial.print(changingDiode);
Serial.print(" to ");
Serial.println(diodeConteiners[changingDiode][0]);
}
}
}
void switchDiode() {
if (analogRead(sb) == highLimit) { // Если кнопка sb нажата
delay(1); // Устраняем дребезг
if (analogRead(sb) > lowLimit) { // Дополнительная проверка
changingDiode++; // Переходим к следующему светодиоду
BeginActive+=1500;
delay(100);
if (changingDiode > 3) { // Если достигнут последний, возвращаемся к первому
changingDiode = 0;
}
Serial.print("Switched to diode ");
Serial.println(changingDiode);
}
}
}
void kostyl1(){
if(Kostyl % 6 == 0 && changingDiode == 0){
digitalWrite(r1, LOW);
digitalWrite(g1, LOW);
digitalWrite(b1, LOW);
Serial.println("blink success");
}
if(Kostyl % 6 == 0 && changingDiode == 1){
digitalWrite(r2, LOW);
digitalWrite(g2, LOW);
digitalWrite(b2, LOW);
Serial.println("blink success");
}
if(Kostyl % 6 == 0 && changingDiode == 2){
digitalWrite(r3, LOW);
digitalWrite(g3, LOW);
digitalWrite(b3, LOW);
Serial.println("blink success");
}
if(Kostyl % 6 == 0 && changingDiode == 3){
digitalWrite(r4, LOW);
digitalWrite(g4, LOW);
digitalWrite(b4, LOW);
Serial.println("blink success");
}
}
// функция для активации светодиодов в соответствии в данными (цвет) из массива diodeConteiners[diodeNumber][1]
void diodeActivator(int diodeNumber) {
//if (diodeConteiners[diodeNumber][0] == 0) {
//return; // если задано значение 0, то есть светодиод должен быть выключен, ничего не делает и прерывает выполнение функции
//}
//else
if (diodeNumber == 0 && diodeConteiners[diodeNumber][1] == 1){ // десяток или больше вариаций номера светодиода и нужного цвета,
digitalWrite(r1, LOW);
digitalWrite(g1, LOW);
digitalWrite(b1, LOW);
if (diodeConteiners[diodeNumber][0] == 0){
digitalWrite(r1, LOW);
digitalWrite(g1, LOW);
digitalWrite(b1, LOW);
}
if (diodeConteiners[diodeNumber][0] == 1) {
digitalWrite(g1, HIGH); // при выполнении условий дает напряжение на нужный пин и вписывает состояние
kostyl1();
diodeConteiners[diodeNumber][1] = 1; // активен в массив
}
if (diodeConteiners[diodeNumber][0] == 2) {
digitalWrite(b1, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 3) {
digitalWrite(r1, HIGH);
digitalWrite(g1, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 4) {
digitalWrite(r1, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
}
else if (diodeNumber == 1 && diodeConteiners[diodeNumber][1] == 1){
digitalWrite(r2, LOW);
digitalWrite(g2, LOW);
digitalWrite(b2, LOW);
if (diodeConteiners[diodeNumber][0] == 1) {
digitalWrite(g2, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 2) {
digitalWrite(b2, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 3) {
digitalWrite(r2, HIGH);
digitalWrite(g2, HIGH);
kostyl1();
}
if (diodeConteiners[diodeNumber][0] == 4){
digitalWrite(r2, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 0){
digitalWrite(r2, LOW);
digitalWrite(g2, LOW);
digitalWrite(b2, LOW);
}
}
else if (diodeNumber == 2 && diodeConteiners[diodeNumber][1] == 1){
digitalWrite(r3, LOW);
digitalWrite(g3, LOW);
digitalWrite(b3, LOW);
if (diodeConteiners[diodeNumber][0] == 1) {
digitalWrite(g3, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 2){
digitalWrite(b3, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 3){
digitalWrite(g3, HIGH);
digitalWrite(r3, HIGH);
kostyl1();
}
diodeConteiners[diodeNumber][1] = 1;
if (diodeConteiners[diodeNumber][0] == 4){
digitalWrite(r3, HIGH);
kostyl1();
}
if (diodeConteiners[diodeNumber][0] == 0){
digitalWrite(r3, LOW);
digitalWrite(g3, LOW);
digitalWrite(b3, LOW);
}
}
else if (diodeNumber == 3 && diodeConteiners[diodeNumber][1] == 1){
digitalWrite(r4, LOW);
digitalWrite(g4, LOW);
digitalWrite(b4, LOW);
if (diodeConteiners[diodeNumber][0] == 1){
digitalWrite(g4, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 2){
digitalWrite(b4, HIGH);
kostyl1();
diodeConteiners[diodeNumber][1] = 1;
}
if (diodeConteiners[diodeNumber][0] == 3){
digitalWrite(g4, HIGH);
digitalWrite(r4, HIGH);
kostyl1();
}
if (diodeConteiners[diodeNumber][0] == 4){
digitalWrite(r4, HIGH);
kostyl1();}
if (diodeConteiners[diodeNumber][0] == 0){
digitalWrite(r4, LOW);
digitalWrite(g4, LOW);
digitalWrite(b4, LOW);
}
}
}
void check(){
Serial.println(" systemTimer ");
Serial.println(systemTimer);
Serial.println(" BeginActive ");
Serial.println(BeginActive);
Serial.println(" activeDelay ");
Serial.println(activeDelay);
//Serial.println(millis());
}
void diodeDeactivator(){
if(systemTimer > BeginActive + activeDelay){
digitalWrite(r1, LOW);
digitalWrite(r2, LOW);
digitalWrite(r3, LOW);
digitalWrite(r4, LOW); // если прошло 5 сек с начала отсчета, светодиоды гаснут
digitalWrite(b1, LOW);
digitalWrite(b2, LOW);
digitalWrite(b3, LOW);
digitalWrite(b4, LOW);
digitalWrite(g1, LOW);
digitalWrite(g2, LOW);
digitalWrite(g3, LOW);
digitalWrite(g4, LOW);
diodeConteiners[0][1] = 0; // меняем значение "включен" на "выключен" в массиве
diodeConteiners[1][1] = 0;
diodeConteiners[2][1] = 0;
diodeConteiners[3][1] = 0;
BeginActive = 0;
status = 0; // обнуляем начало отсчета
Serial.println("diodes was off");} // отображение выключенности светодиодов
else { Serial.println("diodes is on");} // отображение включенности светодиодов
}
void firstClick() {
if((analogRead(sb) == highLimit || analogRead(cb) == highLimit) && status == 0){ // если любая кнопка нажата один раз, идет дальше
delay(1); // задержка 1мс для устранения дребезга кнопки
if(analogRead(sb) > lowLimit || analogRead(cb) > lowLimit) // снова сравниваем значение, выдаваемое кнопкой с эталоном
{
Serial.println("first click sucсess"); // видим в консоли успех активации кнопки
for (int i = 0; i < 4; i++) {
diodeConteiners[i][1] = 1;
}
BeginActive = systemTimer; // задаем значение началу отсчета для отслеживания выключения кнопки
status++; // отображение первого клика кнопок
Serial.println(status);
delay(1000);
}
}}
void nullMaker() {
for (int i = 0; i < 4; i++) {
if (diodeConteiners[i][0] == 5) // функция, которая выключает светодиод, когда достигнут лимит цвета
{
diodeConteiners[i][0] = 0;
}
if (diodeConteiners[i][1] == 4)
{
diodeConteiners[i][1] = 0;
}
}
}
void diodeActivatorCycle(){
for (int i = 0; i < 4; i++){ // цикл для проверки цвета и активации нужных светодиодов
diodeActivator(i);
}
}
//основной цикл
void loop() {
delay(50);
check(); //задержка для отсчета системного таймера
// p. s. при уменьшении задержки возрастает чуткость считывания нажатия кнопки
firstClick(); // функция считывания первого клика и подсветки диодов
diodeActivatorCycle();
changeColor(); // Изменение цвета текущего светодиода
switchDiode(); // Переключение между светодиодами // +1 к системному таймеру
//Serial.println(systemTimer);
nullMaker(); // обнуляем цвет светодиода при превышении макс. количества цветов
diodeDeactivator(); // выключаем диоды после 5 сек с момента активации
//if(ebaniKostyl > 1){
//ebaniKostyl = 0;
//}
Kostyl++;
systemTimer = millis();
}