вопрос про эксперимент 3 ( с извращением)

Тема в разделе "Arduino & Shields", создана пользователем vlad1394, 14 фев 2015.

  1. vlad1394

    vlad1394 Нуб

    выполнил 3эксперимент, почитал про ответ на вопрос, сделал задание но.
    захотел сделать так 1й диод моргает 2й управляемый резистором.
    код прописал. не пойму что не так. Моргать моргает а вот на резистор реагирует криво ( в одном положении выкл в другом вкл - плавной рез не выходит)
    в чем причина?


    // 1н моргает пин 9 2й регулируется потенциометром пин 5
    #define LED_PIN9 9
    #define POT_PIN A0
    #define LED_PIN5 5
    void setup()
    {
    pinMode(LED_PIN9, OUTPUT);
    pinMode(LED_PIN5, OUTPUT);
    pinMode(POT_PIN, INPUT);
    }
    void loop()
    {
    int rotation, brightness;
    rotation = analogRead(POT_PIN);
    brightness = rotation/4;
    analogWrite(LED_PIN5, brightness);

    digitalWrite(9, HIGH);
    delay(100);
    digitalWrite(9, LOW);
    delay(900);

    }
     
  2. Unixon

    Unixon Оракул Модератор

    Перепишите без delay() и все будет плавно.
     
  3. CryNET

    CryNET Гик

    Либо delay(30);, думаю не заметите дрожания.
    и последний delay(900); можно убрать)

    UPD2: Получается, что вы хотите 2 процесса одновременно делать, ардуино так не может.
     
  4. X-Dron

    X-Dron Гик

    может, но нужно использовать другие методы.
     
    CryNET нравится это.
  5. vlad1394

    vlad1394 Нуб

    да именно 2 действия одновременно.

    X-dron какие?
     
  6. X-Dron

    X-Dron Гик

    У меня своя библиотека написана. Мигающую лампочку вывожу так.
    Код (Text):
        #include <Meander.h>
        #define LED_PIN 7        //PIN светодиода
        #define Period 1000      //Период меандра
        #define Duration 500    //Импульс меандра
     
        Meander P_1s;
       
        void setup() {
          //Режимы выходов
          pinMode(LED_PIN, OUTPUT);
        }
     
        void loop() {
          P_1s.MeanderV(Period, Duration);
          digitalWrite(LED_PIN, P_1s.Q0()); //Выводим меандр на лампочку.
        }
     
  7. geher

    geher Гуру

    Всего-то написать собственную многозадачность, которая будет переключать контекст между функциями процессов по вызову специальной функции (корпоративная) или по таймеру (уже привычная нам).

    А если серьезно, то надо просто разбить действия, которые надо производить параллельно, на небольшие атомарные элементы и выполнять их по очереди.

    В общем случае примерно так:
    Код (Text):

    # define maxprocessA 4
    # define maxprocessB 1

    void processA(){
      static unsigned int iA=0;
      switch(iA % (maxprocessA+1)) {
      case 0: Serial.print("0");break;
      case 1: Serial.print("1");break;
      case 2: Serial.print("2");break;
      case 3: Serial.print("3");break;
      case 4: Serial.print("4");break;
      }
      iA++;
      if (iA>=(maxprocessA+1)) iA=0;
    }
    void processB(){
      static unsigned int iB=0;
      switch(iB % (maxprocessB+1)) {
      case 0: Serial.print("A");break;
      case 1: Serial.print("B");break;
      }
      iB++;
      if (iB>=(maxprocessB+1)) iB=0;
    }

    void setup(){
      Serial.begin (9600);
    }

    void loop(){
      processA();
      processB();
    }
     
     
    Последнее редактирование: 14 фев 2015
  8. Sanchogus

    Sanchogus Нерд

    Собрал, оно реагирует правильно и можно менять потенциометром яркость диода с одним НО: Считывание потенциометра раз в один цикл (порядка одной секунды в вашем случае).

    Можно, например, привязаться к таймеру для обхода этой ситуации.
     
    CryNET нравится это.
  9. Sanchogus

    Sanchogus Нерд

    Вот топорный вариант накидал
    Код (Text):
    // 1н моргает пин 9 2й регулируется потенциометром пин 5
    #define LED_PIN9 9
    #define POT_PIN A0
    #define LED_PIN5 5
    void setup()
    {
    pinMode(LED_PIN9, OUTPUT);
    pinMode(LED_PIN5, OUTPUT);
    pinMode(POT_PIN, INPUT);
    }
    void loop()
    {
    int rotation, brightness,doptime;
    rotation = analogRead(POT_PIN);
    brightness = rotation/4;
    analogWrite(LED_PIN5, brightness);


    doptime = millis() % 1000;
    //когда остаток от деления значения в таймере на 1000 будет меньше 100
    //один из диодов вкл, иначе будет выключен - тем самым
    //мы ушли от использования delay
    //что позволяет постоянно проверять А0 и выставлять яркость диода


    if (doptime < 100)
    {digitalWrite(LED_PIN9, HIGH);
    }
    else
    {
      digitalWrite(LED_PIN9, LOW);
    }


    }
     
    altex и X-Dron нравится это.
  10. geher

    geher Гуру

    В данном простом случае
    Код (Text):

    #define LED_PIN9 9
    #define POT_PIN A0
    #define LED_PIN5 5
    void setup()
    {
      pinMode(LED_PIN9, OUTPUT);
      pinMode(LED_PIN5, OUTPUT);
      pinMode(POT_PIN, INPUT);
    }

    void processLed9()
    {
      static int state=0
      static unsigned long int time=0;
      switch(state){
        case 0:
          digitalWrite(LED_PIN9, HIGH);
          if (time-millis()>=100) {
            state=1;
            time=millis();
          }
          break;
        case 1:
          digitalWrite(LED_PIN9, LOW);
          if (time-millis()>=900) {
            state=0;
            time=millis();
          }
          break;
      }
    }

    void processLed5()
    {
      int rotation, brightness;
      rotation = analogRead(POT_PIN);
      brightness = rotation/4;
      analogWrite(LED_PIN5, brightness);
    }

    void loop()
    {
      void processLed5()
      void processLed9()
    }
     
    Последнее редактирование: 14 фев 2015
    CryNET нравится это.
  11. X-Dron

    X-Dron Гик

    Код (Text):
    doptime = millis() % 1000;

    if (doptime < 100)
    {digitalWrite(LED_PIN9, HIGH);
    }
    else
    {
      digitalWrite(LED_PIN9, LOW);
    }
    Гениально простое решение получения настраиваемого меандра. Требует на порядок меньше ресурсов чем у меня. :)
    Пошел переписывать библиотеку. :)
     
    Sanchogus и CryNET нравится это.
  12. Sanchogus

    Sanchogus Нерд

    В принципе, ща прикинул, там и новая переменная не нужна. :)
    Сразу в if впихнуть условие ((millis() % 1000) < 100).
     
  13. vlad1394

    vlad1394 Нуб

    Спасибо буду пробовать