Ненужное моргание светодиода!

Тема в разделе "Arduino & Shields", создана пользователем Oksy, 22 дек 2020.

  1. Oksy

    Oksy Нерд

    Добрый вечер!!! Помогите найти ошибку!!! При 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;
      }
      }
     
     
    Последнее редактирование: 23 дек 2020
  2. b707

    b707 Гуру

    не знаю, что у вас "должно быть" или "не должно"...
    Вот этот вот кусок - это как раз мигание диодом с периодом 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;
      }
     
    Andrey12 и vvr нравится это.
  3. Oksy

    Oksy Нерд

    этим куском кода я организовал задержку выключения по таймеру, задержка работает, но при удержании PIN_BUTTON1 = HIGH, как я понял, происходит сброс таймера, как мне избавиться от этого???
     
  4. b707

    b707 Гуру

    Oksy. у вас в коде два почти одинаковых куска, для analogoutput1 и analogoutput2
    Один из вариантов у вас глючит, а другой нет, как я понимаю ?
    Сравните, как они написаны, в чем разница. и сделайте выводы
     
    Последнее редактирование: 23 дек 2020
    Andrey12 нравится это.
  5. Oksy

    Oksy Нерд

    Мне может видео вам скинуть работы???? Покажи мне скопированную часть кода!!!! Читайте внимательно код
     
  6. b707

    b707 Гуру

    сообщение выше я уже исправил. читай.
    И поспокойнее. Это ж у тебя проблемы. а не у меня. А то уйду и будешь разбираться сам :)

    Две части кода у тебя ПОЧТИ СКОПИРОВАНЫ. Но все-таки не совсем. Вот в этой разнице и ответ. почему одно работает, а другое нет
     
    Andrey12 нравится это.
  7. Oksy

    Oksy Нерд

    Извините!!! Обе части работают, два таймера работают, первая часть таймер начинает отсчет при удержании PIN_BUTTON1 = HIGH, вторая часть идея была такова что при PIN_BUTTON1 = HIGH digitalWrite(analogOutPin1, HIGH);, как только PIN_BUTTON1 = LOW, начинает отсчет таймер myTimer1 и по окончании отсчета digitalWrite(analogOutPin1, LOW) так называемая задержка на отключения, это все работает но происходит обнуление таймера в ненужный момент, а от этого я не могу избавиться.
     
  8. b707

    b707 Гуру

    смотри внимательнее, вот у тебя написаны практически идентичные условия для analogOutPin1 и analogOutPin1
    Но все-таки не совсем одинаковые.- флаги f_button и f_button1 ты обнуляешь в разный момент.
    Вот в этом и суть.

    Уж прям совсем как маленькому подсказал - теперь сам :)
     
    Andrey12 нравится это.
  9. Airbus

    Airbus Радиохулиган Модератор

    Фил а разве условие «И» не так пишут if((buttonState == HIGH) && (f_button1 ==0))?
     
  10. b707

    b707 Гуру

    так.
    Смотрю в код ТС - вроде везде так и написано... Чего-то не вижу?
     
  11. Airbus

    Airbus Радиохулиган Модератор

    У него так if(buttonState == HIGH && f_button1 ==0) Без внутренних. Развеж так можно?
     
  12. b707

    b707 Гуру

    вообще ты прав, лучше скобок не жалеть.
    Но в данном случае это не ошибка, потому что приоритет операции "==" выше, чем "&&"
     
    Andrey12 нравится это.
  13. parovoZZ

    parovoZZ Гуру

    @Oksy
    берёшь лист бумаги и рисуешь алгоритм. Т.к. любая программа работает по алгоритму, то без его чёткого представления невозможно правильно написать программу.
    fkrjhbnv.png

    С алгоритмом перед глазами гораздо проще планировать программу.
     
    Рокки1945 нравится это.
  14. Oksy

    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);
        }
      }
     
  15. b707

    b707 Гуру

    неправильно, теперь ваша "задержка на включение" будет срабатывать только при первом нажатии кнопки, а если кнопку отпустить и нажать снова - больше работать не будет.
    Блин, ну у вас же в первом коде есть правильный вариант...
     
  16. Oksy

    Oksy Нерд

    я просто начинающий, мне ближе железо(((
     
  17. Oksy

    Oksy Нерд

    додумался только до этого
    Код (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;
     
    b707 нравится это.
  18. b707

    b707 Гуру

    если оно делает то, что надо - так даже лучше, чем вариант в начальном коде
     
  19. Oksy

    Oksy Нерд

    Собрал все на макетке проверяю.