Третий вопрос на форуме и наверное самый обширный. У меня есть код под arduino uno. В нём использую: Arduino Uno Relay Shield (4 канала по 5 А) MP3-плеер Troyka Shield Четырёхразрядный индикатор (Troyka-модуль) Датчик Холла (Troyka-модуль) Резисторы на 10 кOm В общем, как понимаете товарищи, плата моя по пинам занята вся О самом это проекте расскажу позже, с более полным описанием. Есть у меня мечта написать пару-тройку полезных (очень надеюсь, что они будут полезны всему сообществу) статей. Но сейчас о другом. Наваял значит Валера код этот, собрав воедино все свои познания и советы мудрецов и даже всё начало работать.. но начал тестировать на стабильность.. И тут выявилась проблема. Не всегда стабильно работает последний этап. Как ни пробовал - не получается. И вот вновь взываю к мудрому сообществу за мудростью. Научите, как привести в порядок код и укажите что не так сделал я. Вот сам код: Код (C++): #include <QuadDisplay.h> // подключаем библиотеку дисплея #define PIN 16 // аналоговый пин А2 для дисплея #include <CapSense.h> // подключаем библиотеку тач сенсора #include <SoftwareSerial.h> #include <DFPlayer.h> // подключаем библиотеки необходимые для мп3 плеера #define INTERVAL_PLAY 10000 // интервал вывода информации в Serial #define INTERVAL_SERIAL 1000 // погрешность на случайные наводки датчика int vodorod = 0; int kislorod = 0; int knopka = 0; int kolibrovka = 0; int avtopilot = 0; int artefakt = 0; int dver = 0; int stik = 0; unsigned long time; SoftwareSerial mySerial(2, 3); // инициализируем новый последовательный порт (RX 2, TX 3) CapSense cs_8_9 = CapSense(8,9); // клавиша 1 между 4-м и 2-м пином CapSense cs_8_10 = CapSense(8,10); // клавиша 1 между 4-м и 3-м пином CapSense cs_11_12 = CapSense(11,12); // клавиша 1 между 5-м и 6-м пином void setup () { Serial.begin (9600); mySerial.begin(9600); // для нормальной работы DFPlayer mp3_set_serial(mySerial); // выбор Serial для упрапвления DFPlayer mp3_set_volume(30); // установка громкости и к ней задержка cs_8_9.set_CS_AutocaL_Millis(0xFFFFFFFF); // выключает автокалибровку на 1-й клавише. pinMode(4,OUTPUT); // назначаем 4 пин на выход digitalWrite(4, LOW); // состояние на 4 пине выключено pinMode(5,OUTPUT); // назначаем 5 пин на выход digitalWrite(5, LOW); // состояние на 5 пине выключено pinMode(6,OUTPUT); // назначаем 6 пин на выход digitalWrite(6, LOW); // состояние на 6 пине выключено pinMode(7,OUTPUT); // назначаем 7 пин на выход digitalWrite(7, HIGH); // состояние на 7 пине включено displayInt(PIN, 30); delay(1000); displayInt(PIN, 29); delay(1000); displayInt(PIN, 28); delay(1000); displayInt(PIN, 27); delay(1000); displayInt(PIN, 26); delay(1000); displayInt(PIN, 25); delay(1000); displayInt(PIN, 24); delay(1000); displayInt(PIN, 23); delay(1000); displayInt(PIN, 22); delay(1000); displayInt(PIN, 21); delay(1000); displayInt(PIN, 20); delay(1000); displayInt(PIN, 19); delay(1000); displayInt(PIN, 18); delay(1000); displayInt(PIN, 17); delay(1000); displayInt(PIN, 16); delay(1000); displayInt(PIN, 15); delay(1000); displayInt(PIN, 14); delay(1000); displayInt(PIN, 13); delay(1000); displayInt(PIN, 12); delay(1000); displayInt(PIN, 11); delay(1000); displayInt(PIN, 10); delay(1000); displayInt(PIN, 9); delay(1000); displayInt(PIN, 8); delay(1000); displayInt(PIN, 7); delay(1000); displayInt(PIN, 6); delay(1000); displayInt(PIN, 5); delay(1000); displayInt(PIN, 4); delay(1000); displayInt(PIN, 3); delay(1000); displayInt(PIN, 2); delay(1000); displayInt(PIN, 1); delay(1000); // делаем обратный отсчет displayClear(PIN); delay(1000); mp3_play (1); // запуск первого трека delay(70000); } // void loop () { int kn = digitalRead(5); // считываем int art = digitalRead(4); int dv = digitalRead(6); int sensorValue = analogRead(A0); float voltage = sensorValue; int sensorValue_1 = analogRead(A1); float voltage_1 = sensorValue_1; // подключаем датчики int sensorValue_2 = analogRead(A5); float voltage_2 = sensorValue_2; // подключаем датчики 2 int sensorValue_3 = analogRead(A3); float magnit_1 = sensorValue_3; int sensorValue_4 = analogRead(A4); float magnit_2 = sensorValue_4; // подключаем датчики холла long start = millis(); long valore = cs_8_9.capSense(30); long valore1 = cs_8_10.capSense(30); long valore2 = cs_11_12.capSense(30); // присваиваем имена к сенсорным кнопкам Serial.println(millis() - start); delay (20); Serial.print(vodorod); // информация по счётчику подключения водорода (измеряется в циклах ардуины) Serial.print("\t"); // делаем отступ Serial.print(kislorod); // информация по счётчику подключения (измеряется в циклах ардуины) Serial.print("\t"); // делаем отступ Serial.print(knopka); // информация по счётчику длительности нажатия кнопки (измеряется в циклах ардуины) Serial.print("\t"); // делаем отступ Serial.print(valore); // выводим данные с сенсора 1 Serial.print("\t"); // делаем отступ Serial.print(valore1); // выводим данные с сенсора 2 Serial.print("\t"); // делаем отступ Serial.print(valore2); // выводим данные с сенсора 3 Serial.print("\t"); // делаем отступ Serial.print(magnit_1); // выводим данные с датчика Холла 1 Serial.print("\t"); // делаем отступ Serial.print(magnit_2); // выводим данные с датчика Холла 2 Serial.print("\t"); // выводим данные с датчиков холла на пинах А3 и А4 Serial.print(voltage); // сенсор подключения 1 Serial.print("\t"); // делаем отступ Serial.print(voltage_1); // сенсор подключения 2 Serial.print("\t"); // делаем отступ Serial.print(voltage_2); // сенсор нажатия кнопки Serial.print("\t "); Serial.print("Time: "); time = millis(); // вот отсюда начинается логистика // тут идут счетчики выполненных нажатий или действий if (voltage > 90) // если подключили 1 { delay(10); vodorod = (vodorod + 1); } if ( voltage_1 > 90) // если подключили 2 { delay(10); kislorod = (kislorod + 1); } if ((vodorod > 3) && (vodorod <= 50) && (kislorod <= 50) && (kislorod > 3)) { delay(10); kolibrovka = (kolibrovka + 1); } if ((vodorod > 1) && (kislorod > 1) && (voltage_2 > 90)) { delay(10); knopka = ( knopka + 1); } if ((knopka >= 1) && (kolibrovka > 1) && ( valore1 > 10000)) { artefakt = (artefakt + 1); } if ((magnit_1 > 600) && (magnit_2 > 600)) { avtopilot = (avtopilot + 1); } if((valore > 1000) && (valore2 > 10000) && (valore1 > 10000)&& ( avtopilot > 1)) { dver = (dver + 1); } if (vodorod == 0) { mp3_play (2); delay(15000); } if (kislorod == 0) { mp3_play (2); delay(15000); } if (kislorod == 1) { mp3_play (3); delay (4000); } if (vodorod == 1) { mp3_play (4); delay (4000); } if (kolibrovka == 1) { mp3_play (5); delay (9000); } if ((knopka == 1) && (kn == 0)) { digitalWrite(5, HIGH); mp3_play (6); delay (5000); } if ((artefakt == 1) && (art == 0)) { digitalWrite(4, HIGH); mp3_play (7); delay (5000); } if ((avtopilot == 1) && (stik == 0)) { displayInt(PIN, 10); delay(500); displayInt(PIN, 20); delay(500); displayInt(PIN, 30); delay(500); displayInt(PIN, 40); delay(500); displayInt(PIN, 50); delay(500); displayInt(PIN, 50); delay(500); displayInt(PIN, 60); delay(500); displayInt(PIN, 70); delay(500); displayInt(PIN, 8); delay(500); displayInt(PIN, 90); delay(500); displayDigits(PIN, QD_O, QD_n, QD_NONE, QD_NONE); // on delay(6000); displayClear(PIN); mp3_play (8); delay (20000); mp3_play (9); delay (10000); stik = ( stik + 1); } if (dver == 1) { digitalWrite(6, HIGH); mp3_play (0010); delay (6000); if (dv == 1) { digitalWrite(6, LOW); delay(3600000); } } }
Код (C++): delay(1000); displayInt(PIN, 29); delay(1000); displayInt(PIN, 28); delay(1000); displayInt(PIN, 27); delay(1000); displayInt(PIN, 26); delay(1000); displayInt(PIN, 25); delay(1000); displayInt(PIN, 24); delay(1000); displayInt(PIN, 23); delay(1000); displayInt(PIN, 22); и так далее уже говорит о том, что в коде реально полное собрание всех советов мудрецов. Даже вникать глубже лениво.
Взято из примера. Если "ленива", зачем вообще отвечать? Постебаться? Если бы я был гик и хвалился таким кодом- да..а так, вы просто хвалитесь очевидным. Я знаю, что нуб. Но я учусь и пытаюсь, не сдаюсь. И ещё раз.. публикуя тут посты ждёшь совета, а не чьего-то ленивого сарказма.
он клонит к тому, что написать Код (C++): for(byte i = 30; i > 0; i--) { displayInt(PIN, i); delay(1000); } будет быстрее, чем то, что написано у тебя
почему кнопки подключены как-то странно? Две к одному пину, а третья отдельно. Код (C++): CapSense cs_8_9 = CapSense(8,9); CapSense cs_8_10 = CapSense(8,10); CapSense cs_11_12 = CapSense(11,12); это второй трек, а не десятый: Код (C++): mp3_play (0010); после инициализации плеера надо небольшую паузу, недавно писали об этом: Код (C++): mp3_set_serial(mySerial); delay(100); тут чего-то не хватает (иначе зачем использовать float?): Код (C++): int sensorValue_1 = analogRead(A1); float voltage_1 = sensorValue_1;
про трек понял - он его в двоичном коде воспринимает. спасибо! Я заметил такую странную особенность. Если подключать не более двух сенсорных кнопок на 1 пин, то работает стабильно. Если больше двух, начинает вести себя менее стабильно. Тестировал на вот такой штуке и про цикл с обратным отсчетом. Я его использую в setup. И используя ваш код, обратный отсчет не запускается
i >0 мне вот это не нравится: Код (C++): int kn = digitalRead(5); // считываем int art = digitalRead(4); int dv = digitalRead(6); Считываем состояние кнопок в начале, а используем эти значения хрен знает где в конце. По коду за этот период может пройти десяток секунд. P.S. и для digitalRead оптимальнее использовать boolean, а не int.
i - что делает в данном случае? Если русским языком функцию описать? Спасибо вам большое за совет и время потраченное на меня! Ваши советы очень важны! И что бы 1 не оставалось на дисплее после обратно отсчета я добавил Код (C++): for(byte i = 30; i > 0; i--) // цикл тестируем { displayInt(PIN, i); delay(1000); displayClear(PIN); }
i - это переменная, значение которой при каждом проходе цикла становится на единичку меньше. Когда условие i>0 перестает выполняться, цикл прерывается.