Плавное включени/выклчение подсветки

Тема в разделе "Arduino & Shields", создана пользователем Energy_, 21 ноя 2015.

  1. Energy_

    Energy_ Нуб

    Всем привет,
    можно сказать только начал программировать на ардуине, никакого опыта ранее не было, немного побаловался со светодиодами, вентиляторами и всякими датчиками, теперь хочу реализовать более конкретный проект.
    Суть: хочу по ультразвуковому датчику плавно включать подсветку, затем по истечению времени плавно ее выключать, все скетчи подсветки лестниц, которые были обнаружены в интернете, как то резко все включают, да и хотелось все таки поэкспериментировать и самому попрактиковаться, поэтому код писал с нуля.
    Пока ультразвуковым датчиком не обладаю, для экспериментов использую кнопку, чувствую что код кривой, но самое интересное что все вроде как работает, хотя и не легко мне дался.
    Прошу помощи оптимизации кода, замечания, ошибки и тд. строго не судите, и прошу поподробнее выдавайте ценные указания, не забывайте, что я в этом деле новичок )))

    Код (C++):
    int POT_PIN = A0;                              // пин потенциометра                      
    int downSensor = 12;                           // датчик-кнопка

    int brightness[6];                             // переменные яркости для каждого LED пина
    int LED[6] = {2,3,4,5,6,7};                    // LED пины

    int reg_speed = 3;                             // скорость увеличение яркости светодиодов
    int fade_speed = 1;                          

    void setup(){
        pinMode(downSensor, INPUT);
        for (int i = 1; i <= 6; i++) {
        pinMode(LED[i], OUTPUT);
        Serial.begin(9600);
        }
    }

     
    void ledFadeIn(int n) {                         // создаем функцию увеличения яркости светодиода
      int x = analogRead(POT_PIN);
      int y = map (x, 0, 1000, 255, 0);
      y = constrain (y, 0, 255);                    // текущее значение потенциометра
      brightness[n] = y;
          for (brightness[n]; brightness[n] <= 255; brightness[n]=brightness[n]+reg_speed) { // яркость увеличивается до максимума
              analogWrite(LED[n], brightness[n]);
              delay(fade_speed);
              Serial.println(brightness[n]);
          }
    }        


    void ledFadeOut(int n) {                        // создаем функцию уменьшения яркости светодиода
      int x = analogRead(POT_PIN);
      int y = map (x, 0, 1000, 255, 0);
      y = constrain (y, 0, 255);                    // текущее значение потенциометра
          for (brightness[n]=255; brightness[n] >= y; brightness[n]=brightness[n]-reg_speed) { // яркость уменьшается до значения потенциометра
              if (brightness[n] < reg_speed) {                                                 // в случае если значение потенциометра = 0 цикл не останавливался на 0, а продолжал вычитать из 65535
                  analogWrite(LED[n], y);
              } else {
                  analogWrite(LED[n], brightness[n]);
                  delay(fade_speed);
                  Serial.println(brightness[n]);
                }
              }
    }


    void loop() {

    int x = analogRead(POT_PIN);
    int y = map (x, 0, 1000, 255, 0);
    y = constrain (y, 0, 255);                             // текущее значение потенциометра

        for (int i = 0; i <= 5; i++) {
           analogWrite(LED[i], y);                         // включаем светодиоды по значению потенциометра
           Serial.println(y);
        }

        if (digitalRead(downSensor) == HIGH) {             // если срабатывает датчик
            for (int i = 1; i <= 4; i++) {
                brightness[i] = y;
            }
            for (int i = 0; i <=5; i++) {
        ledFadeIn(i);                                      // зажигаем светодиды
            }      
            delay(1000);
          for (int i = 0; i <=5; i++) {
        ledFadeOut(i);                                      // гасим светодиды
            }
         }
    }
     
     
  2. Tomasina

    Tomasina Сушитель лампочек Модератор

    на UNO плавное включение (ШИМ) поддерживают только пины 3, 5, 6, 9, 10, и 11.
    Ну и немного оптимизации:
    Код (C++):
    #define POT_PIN A0;                 // пин потенциометра  
    #define SENSOR_PIN 12;                           // датчик-кнопка
    int brightness[6];                                         // переменные яркости для каждого LED пина
    byte LED[6] = {3,5,6,9,10,11};                    // LED пины
    byte reg_speed = 3;                                   // скорость увеличение яркости светодиодов
    byte fade_speed = 1;  
     
  3. shpock

    shpock Гик

    Serial.begin(9600) шесть раз обьявляется.
     
  4. Tomasina

    Tomasina Сушитель лампочек Модератор

    ага, фигурные скобочки там избыточны.
     
  5. Energy_

    Energy_ Нуб

    Забыл написать что работаю на Меге.
    А почему LED пины и регуляторы скорости должны быть byte?
     
  6. Tomasina

    Tomasina Сушитель лампочек Модератор

    а зачем для пинов занимать в памяти диапазон 0...65535, если пинов максимум 54?
    А у byte диапазон 0...255.
    Блум протупил этот момент в своих уроках, теперь все по его примерам так и лепят... :cool:
     
  7. shpock

    shpock Гик

    они не избыточны, Serial.begin(9600) нужно из цыкла вывести, например после фигурных скобочек поставить.
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    в такой конструкции
    Код (C++):
    for (int i = 1; i <= 6; i++)
    {
        pinMode(LED[i], OUTPUT);
    }
    фигурные скобочки лишние, достаточно писать
    Код (C++):
    for (int i = 1; i <= 6; i++) pinMode(LED[i], OUTPUT);
    Хотя если их автоматом расставлять везде, это иногда убережет от непонятного поведения программы.
    А иногда приводит к ситуациям, как выше. ;)
     
    shpock нравится это.
  9. Energy_

    Energy_ Нуб

    Ага, логику понял, спасибо

    Serial.begin(9600) в цикле, это я понял, сам тупанул

    подскажите как реализовать такой же алгоритм работы, но не используя delay( ) при задержке между включением и выключением подсветки? Как я понял из всяких обучалок, delay() довольно вредная функция.
    В дальнейшем планируется прикрутить еще некоторые датчики, возможно мне конечно не надо будет постоянно считывать с них данные, но просто для понимания
     
  10. shpock

    shpock Гик

    ну например вот так, вызывая нужные процедуры и функции по истичении некоторого времени...

    Код (C++):
    long timeToUpdate=0;

    void setup() {
      // put your setup code here, to run once:
    Serial.begin(115200);
    }

    void loop() {
      // put your main code here, to run repeatedly:
    if (millis() >= timeToUpdate)
       {
        Serial.println("Делаем чего то на ");
        Serial.print(millis());
        Serial.println(" милисекунде.");
        timeToUpdate += 6000;
       }
    }