Перейти к содержанию

pingyini

Members
  • Постов

    3
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные pingyini

  1. В 11.02.2019 в 10:04, Гость Guest987 сказал:

    У вас логика хромает. Блоки (2) и (3) программы будут срабатывать всегда, когда кнопка не нажата, а в них флаг становится то тру, то фэлс. Повезёт нажать кнопку, когда тру - сработает блок (1).

    Увидел, пофиксил, спасибо. Получилось как то так

    [code]
      if (digitalRead(buttonStart) && ((millis() - pressTime) <= maxOnTime)) {  // (1) если кнопка старт нажата И нажата менее 7 секунд выполняем:
        analogWrite(pwmPin, power); //запуск ШИМ
        Serial.println("PWM_ON");
        digitalWrite(GREEN_LED, HIGH);
        digitalWrite(RED_LED, LOW);
      } else { // (2) иначе
        analogWrite(pwmPin, 0);
        digitalWrite(GREEN_LED, LOW);
        Serial.println("PWM_OFF");
        
      }
    
      if (!digitalRead(buttonStart)) { //(3) если кнопка не нажата
        analogWrite(pwmPin, 0); //остановка ШИМ
        Serial.println("PWM_OFF");
        digitalWrite(RED_LED, HIGH);
        pressTime = millis(); //перезапись millis(); и только тогда сможем войти в (1)
        delay(10);
      }
    
    [/code]

     

  2. На Драйв2 есть статья по этому поводу Измерение частоты с помощью Arduino (спидометр и тахометр). Остается лишь в зависимости от значения функции скорости сместить стрелку на N шагов двигателя. Ну и пересчитать и/или добавить коэффициенты. 
    И вообще прерывания на ардуино дело неблагодарное. Во-первых для внешних прерываний всего 2 канала для 328й Меги, так еще и по восходящему фронту могут не отработать плюс к тому есть баги по прерыванию с INT 0 ( 2 пин) .

  3. Всем доброго времени суток. Решил я сделать "умную" электронную сигарету на arduino. Концепция заключается в кнопочном управлении мощностью посредством ШИМ, наличии экрана, и некоторыми защитами в виде ограничения максимального времени нажатия и уход камня в сон (режим пониженного энергопотребления) после N секунд простоя.

    Вводные: по нажатию кнопки запускается ШИМ и управляет полевиком, но в целях защиты я хочу ограничить время выполнения кода до 7 секунд(что бы при случайном зажатии кнопки в кармане не получить травматическую ампутацию конечностей)


    Проблема пришла откуда не ждали - обработка нажатой основной кнопки срабатывает как попало. Нажимая кнопку обработчик может сработать сразу и отработает как по маслу, а может и через 5 нажатий не сработать вовсе.  Проверял в живую на Arduino UNO, Pro Mini (328е Меги) и в Proteus'е. Симптомы одни и те же.  Проблема очевидно в коде но я в упор не вижу в чем может быть загвоздка. Уровень у меня "штота умею" поэтому не судите строго. 

     

    #define pwmPin 5
    #define buttonStart 3
    #define maxOnTime 7000 //максимальное время выполнения условия нажатой кнопки
    #define RED_LED 7
    #define GREEN_LED 8
    
    int power = 150;
    //boolean StartState;
    boolean StartStateFlag; //Флаг кнопки Старт
    unsigned long pressTime;
    
    
    void setup() {
      pinMode(pwmPin, OUTPUT);
      pinMode(buttonStart, INPUT);
      pinMode(RED_LED, OUTPUT);
      pinMode(GREEN_LED, OUTPUT);
      Serial.begin(9600); //чисто для отладки
    }
    
    void loop() {
      if (digitalRead(buttonStart) && StartStateFlag && ((millis() - pressTime) <= maxOnTime)) {  // (1) если кнопка старт нажата И была отпущена И нажата менее 7 секунд выполняем:
        analogWrite(pwmPin, power); //запуск ШИМ
        Serial.println("PWM_ON");
        digitalWrite(GREEN_LED, HIGH);
        digitalWrite(RED_LED, LOW);
      } else { // (2) иначе
        StartStateFlag = false; // кнопка небыла отпущена
        analogWrite(pwmPin, 0);
        digitalWrite(GREEN_LED, LOW);
        Serial.println("PWM_OFF");
        pressTime = millis();
      }
    
      if (!digitalRead(buttonStart)) { //(3) если кнопка не нажата
        analogWrite(pwmPin, 0); //остановка ШИМ
        Serial.println("PWM_OFF");
        digitalWrite(RED_LED, HIGH);
        StartStateFlag = true; //была отпущена и можно входить в условие с нажатой кнопкой (1)
      }
    }

    И файлы: сам скетч, .elf и .hex для шПротеуса и проект Протеус.
    P. S. ШИМ в Протеусе не работает в принципе, в железе все ОК 

    BUTTON_TEST.ino

    BUTTON_TEST.ino.eightanaloginputs.hex

    BUTTON_TEST.ino.elf

    BUTTON_TEST.ino.with_bootloader.eightanaloginputs.hex

    ButtonTest.pdsprj

×
×
  • Создать...