Добрый вечер!!! Помогите найти ошибку!!! При PIN_BUTTON1 = HIGH начинает пульсировать напряжения на analogOutPin1 с задержкой outputREZ чего не должно быть, как от этого избавиться??? Код (C++): const int analogInPin1 = A0; const int REZ = A1; const int analogOutPin1 = 13; const int analogOutPin2 = 12; const int analogOutPin3 = 11; const int PIN_BUTTON1 = 2; bool f_button = 0; bool f_button1 = 0; uint32_t myTimer1; uint32_t myTimer; int sensorValue = 0; int sensorREZ = 0; int outputValue = 0; int outputREZ = 0; int buttonState = 0; void setup() { pinMode(12, OUTPUT); pinMode(13, OUTPUT); pinMode(11, OUTPUT); pinMode(2, INPUT); Serial.begin(9600); } void loop() { buttonState = digitalRead(PIN_BUTTON1); sensorValue = analogRead(analogInPin1); outputValue = map(sensorValue, 0, 1023, 100, 3000); sensorREZ = analogRead(REZ); outputREZ = map(sensorREZ, 0, 1023, 1000, 3000); // печатаем результаты в Serial Monitor Serial.print("Oscil.Sen = "); Serial.print(sensorValue); Serial.print("\t Oscil.Time = "); Serial.print(outputValue); Serial.print(" Gaz.Sen = "); Serial.print(sensorREZ); Serial.print("\t Gaz.Time = "); Serial.println(outputREZ); //Serial.print(f_button); //Serial.println(buttonState); if (buttonState == LOW) { digitalWrite(analogOutPin2, LOW); digitalWrite(analogOutPin3, LOW); //digitalWrite(analogOutPin1, LOW); } if (buttonState == HIGH) { //digitalWrite(analogOutPin2, LOW); digitalWrite(analogOutPin3, HIGH); //digitalWrite(analogOutPin1, LOW); } if (buttonState == HIGH && f_button == 0) { //digitalWrite(analogOutPin3, HIGH); // digitalWrite(analogOutPin1, HIGH); f_button = 1; myTimer = millis(); // таймер digitalWrite(analogOutPin2, HIGH); } if (millis() - myTimer >= outputValue && f_button==1) { digitalWrite(analogOutPin2, LOW); } if (f_button == 1 && buttonState == LOW) f_button = 0; if (buttonState == HIGH && f_button1 == 0) { digitalWrite(analogOutPin1, HIGH); f_button1 = 1; myTimer1 = millis(); // таймер //digitalWrite(analogOutPin1, HIGH); } if (millis() - myTimer1 >= outputREZ && f_button1==1) { digitalWrite(analogOutPin1, LOW); f_button1 = 0; } }
не знаю, что у вас "должно быть" или "не должно"... Вот этот вот кусок - это как раз мигание диодом с периодом outputREZ - как написано, так и работает. Код (C++): if (buttonState == HIGH && f_button1 == 0) { digitalWrite(analogOutPin1, HIGH); f_button1 = 1; myTimer1 = millis(); // таймер //digitalWrite(analogOutPin1, HIGH); } if (millis() - myTimer1 >= outputREZ && f_button1==1) { digitalWrite(analogOutPin1, LOW); f_button1 = 0; }
этим куском кода я организовал задержку выключения по таймеру, задержка работает, но при удержании PIN_BUTTON1 = HIGH, как я понял, происходит сброс таймера, как мне избавиться от этого???
Oksy. у вас в коде два почти одинаковых куска, для analogoutput1 и analogoutput2 Один из вариантов у вас глючит, а другой нет, как я понимаю ? Сравните, как они написаны, в чем разница. и сделайте выводы
Мне может видео вам скинуть работы???? Покажи мне скопированную часть кода!!!! Читайте внимательно код
сообщение выше я уже исправил. читай. И поспокойнее. Это ж у тебя проблемы. а не у меня. А то уйду и будешь разбираться сам Две части кода у тебя ПОЧТИ СКОПИРОВАНЫ. Но все-таки не совсем. Вот в этой разнице и ответ. почему одно работает, а другое нет
Извините!!! Обе части работают, два таймера работают, первая часть таймер начинает отсчет при удержании PIN_BUTTON1 = HIGH, вторая часть идея была такова что при PIN_BUTTON1 = HIGH digitalWrite(analogOutPin1, HIGH);, как только PIN_BUTTON1 = LOW, начинает отсчет таймер myTimer1 и по окончании отсчета digitalWrite(analogOutPin1, LOW) так называемая задержка на отключения, это все работает но происходит обнуление таймера в ненужный момент, а от этого я не могу избавиться.
смотри внимательнее, вот у тебя написаны практически идентичные условия для analogOutPin1 и analogOutPin1 Но все-таки не совсем одинаковые.- флаги f_button и f_button1 ты обнуляешь в разный момент. Вот в этом и суть. Уж прям совсем как маленькому подсказал - теперь сам
вообще ты прав, лучше скобок не жалеть. Но в данном случае это не ошибка, потому что приоритет операции "==" выше, чем "&&"
@Oksy берёшь лист бумаги и рисуешь алгоритм. Т.к. любая программа работает по алгоритму, то без его чёткого представления невозможно правильно написать программу. С алгоритмом перед глазами гораздо проще планировать программу.
Разобрался!!! я отталкивался от самого флага f_button1, а надо было от времени где tom хранит кол-во времени с момента buttonState == LOW!!!! Спасибо Код (C++): if (buttonState == HIGH && f_button1 == 0) { f_button1 = 1; digitalWrite(analogOutPin1, HIGH); } if (millis() - tom >= outputREZ && f_button1==1) { tom = millis(); // if (millis() - myTimer1 >= outputREZ && f_button1==1) { digitalWrite(analogOutPin1, LOW); } }
неправильно, теперь ваша "задержка на включение" будет срабатывать только при первом нажатии кнопки, а если кнопку отпустить и нажать снова - больше работать не будет. Блин, ну у вас же в первом коде есть правильный вариант...
додумался только до этого Код (C++): if (buttonState == HIGH && f_button1 == 0) { digitalWrite(analogOutPin1, HIGH); //f_button1 = 1; myTimer1 = millis(); // таймер //digitalWrite(analogOutPin1, HIGH); } if (millis() - myTimer1 >= outputREZ && f_button1==0) { digitalWrite(analogOutPin1, LOW); f_button1 = 0;