fade

Тема в разделе "Arduino & Shields", создана пользователем Nikita, 20 окт 2013.

  1. Nikita

    Nikita Гик

    как обеспечить плавное вкл/вык светодиода

    Код (Text):
    int led = 9;
    int ledq = 13;

    void setup() {
    pinMode(led, OUTPUT);
      pinMode(ledq, OUTPUT);
     
     
                   
      }


    void loop() {
      for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
        analogWrite(led, fadeValue);      
        delay(255000);                          
      }
    digitalWrite(led, HIGH);
      delay(61200000);
      for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
        analogWrite(led, fadeValue);      
        delay(255000);
        }
      digitalWrite(led, LOW);
      delay(28800000);
     
      digitalWrite(ledq, HIGH);
      delay(500);            
      digitalWrite(ledq, LOW);  
      delay(500);
     
                               
      }
     
  2. Megakoteyka

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

    delay(61200000); - задержка на 17 часов? :eek:
    Вы чего добиться пытаетесь? У Вас один проход loop() будет выполняться 18 + 17 + 18 + 8 = 61 час!
     
  3. Nikita

    Nikita Гик

    Это я как пример а так свет должен плавно вкл на 14 часов и плавно вык на 8 часов.
     
  4. NR55RU

    NR55RU Гик

    Ну да, человек хотел сделать задержку от 14:00 до 08:00 (ну или наоборот). :)

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

    А вообще посмотрите для начала уроки Джереми Блюма, она там кстати как раз будет плавно как зажигать так и гасить диод в одном из первых уроков.
     
  5. Nikita

    Nikita Гик

    как то так, но плавность хода пока делать не буду:)

    Код (Text):
    int led = 9;
    int ledq = 13;

    void setup() {
    pinMode(led, OUTPUT);
      pinMode(ledq, OUTPUT);
     
      // проверка системы
      for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
        analogWrite(led, fadeValue);      
        delay(100);
      }
      for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
        analogWrite(led, fadeValue);        
        delay(100);                          
      }
                 
      }


    void loop() {
      //рассвет
      for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) {
        analogWrite(led, fadeValue);      
        delay(12000);                          
      }
    digitalWrite(led, HIGH); // включаем светодиод на 14часов
      delay(50400000);
    //закат
      for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) {
        analogWrite(led, fadeValue);      
        delay(12000);
        }
      digitalWrite(led, LOW); //выключаем светодиод на 8 часов
      delay(28800000);
     //показываем что светодиод потушен
      digitalWrite(ledq, HIGH);
      delay(500);            
      digitalWrite(ledq, LOW);  
      delay(500);
                               
      }




     
     
     
  6. Nikita

    Nikita Гик

    насчёт ртс я заранее подумал но не понимаю как должна выглядеть программа по этому пока так написал
     
  7. NR55RU

    NR55RU Гик

    Если использовать этот модуль и библиотеку, то код может выглядеть примерно так.
    Код (Text):
    void loop()
    {
        clock.getTime();  
        if(clock.hour == 14 && ledStatus == LED_ON)
        {
            turnOffLed();
            ledStatus = LED_OFF;
        }
        else if(clock.hour == 8 && ledStatus == LED_OFF)
        {
            turnOnLed();
            ledStatus = LED_ON;
        }
    }
     
    Последнее редактирование: 20 окт 2013
  8. Megakoteyka

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

    Модуль часов реального времени нужен. Ардуино во время работы может перезагрузиться (отключат электричество дома, кот поиграет с кнопкой "ресет" и т.д.) и все начнется заново. Используя часы реального времени, вы всегда будете застрахованы от подобной ситуации.
     
  9. Nikita

    Nikita Гик

    практически всё понял, но не знаю как описать 2 функции LED_ON и turnOffLed
     
  10. Nikita

    Nikita Гик

    если я правильно понимаю то Serial.begin(9600) не нужно?
     
  11. Nikita

    Nikita Гик

    LED_ON описывается так: int LED_ON = HIGH; ?
     
  12. NR55RU

    NR55RU Гик

    LED_ON и LED_OFF это не функции а именованные константы. Для лучшего чтения кода.
    Я бы и часы заменил на именованные константы в примере но решил оставить числа чтобы было понятнее для примера.
    Эти константы вы можете сделать какими желаете например
    int LED_ON = 1
    char LED_ON = 'L' // light
    bool LED_ON = true
    Главное что бы тип LED_ON и ledStatus были идентичными.

    Реализация функций turnOnLed() и turnOffLed() это обычный код с помощью которого вы плавно зажигаете или гасите ваш диод.

    Код может выглядить примрено так:
    Код (Text):
    void turnOffLed()
    {
        int i;
        for(i = 205; i > 0; i -= 50)
        {
            analogWrite(ledPin, i);
            delay(500);
        }
        analogWrite(ledPin, 0);
    }
     
  13. Nikita

    Nikita Гик

    если я вас правильно понял то у меня получается так, но пока без зажигания

    Код (Text):
    #include <Wire.h>
    #include "DS1307.h"
    int led = 9;
    int ledStatus = 0;
    int LED_ON = 0;
    int LED_OFF = 1;



    DS1307 clock;//define a object of DS1307 class
    void setup()
    {
            pinMode(led, OUTPUT);
        Serial.begin(9600);
        clock.begin();
        clock.fillByYMD(2013,1,19);//Jan 19,2013
        clock.fillByHMS(15,28,30);//15:28 30"
        clock.fillDayOfWeek(SAT);//Saturday
        clock.setTime();//write time to the RTC chip
    }

    void loop()
    {
        clock.getTime();
        if(clock.hour == 7 && ledStatus == LED_ON)
        {
            ledStatus = LED_OFF;
        }
        else if(clock.hour == 21 && ledStatus == LED_OFF)
        {
    }
       
    }
     
     
  14. Nikita

    Nikita Гик

    правильно?
     
  15. Megakoteyka

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

    Чтобы каждый раз не править текущее время в коде, используйте подход, описанный в статье на вики.
    Тогда в момент компиляции в код автоматически будет подставляться системное время компьютера, на котором производится компиляция.
    В остальном похоже на правду, осталось собрать схему и проверить ;)
     
  16. Nikita

    Nikita Гик

    Спасибо за помощь!:)
     
  17. Nikita

    Nikita Гик

    как то так ;)

    Код (Text):
    #include <Wire.h>
    #include "DS1307.h"
    int led = 9;
    int ledStatus = 0;
    int LED_ON = 0;
    int LED_OFF = 1;



    DS1307 clock;//define a object of DS1307 class
    void setup()
    {
            pinMode(led, OUTPUT);
        Serial.begin(9600);
        clock.begin();
        clock.fillByYMD(2013,1,19);//Jan 19,2013
        clock.fillByHMS(15,28,30);//15:28 30"
        clock.fillDayOfWeek(SAT);//Saturday
        clock.setTime();//write time to the RTC chip
    }

    void turnOffLed()
    {
      // fade in from min to max in increments of 5 points:
      for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
        // sets the value (range from 0 to 255):
        analogWrite(led, fadeValue);      
        // wait for 30 milliseconds to see the dimming effect  
        delay(30);                          
      }

      // fade out from max to min in increments of 5 points:
      for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
        // sets the value (range from 0 to 255):
        analogWrite(led, fadeValue);      
        // wait for 30 milliseconds to see the dimming effect  
        delay(30);                          
      }
    }



    void loop()
    {
        clock.getTime();
        if(clock.hour == 7 && ledStatus == LED_ON)//Время включения
        {
            ledStatus = LED_OFF;//статус светодиодной дорожки
        }
        else if(clock.hour == 21 && ledStatus == LED_OFF)//время выключения
        {
    }
       
    }
     
  18. Megakoteyka

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

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

    Nikita Гик

    с этим у меня проблемы
     
  20. Nikita

    Nikita Гик

    если только как то так

    Код (Text):
    #include <Wire.h>
    #include "DS1307.h"
    #include <EEPROM.h>
    int led = 9;
    int ledStatus = 0;
    int LED_ON = 0;
    int LED_OFF = 1;
    int hour;
    int minute;
    int second;

    //Массив, содержащий время компиляции
    char compileTime[] = __TIME__;
     
    DS1307 clock;//define a object of DS1307 class
    void setup()
    {
    pinMode(led, OUTPUT);
      //Запускаем часы реального времени
      clock.begin();
        //Готовим для записи в RTC часы, минуты, секунды
        clock.fillByHMS(hour, minute, second);
        //Записываем эти данные во внутреннюю память часов.
        //С этого момента они начинают считать нужное для нас время
        clock.setTime();
      }


    void turnOffLed()
    {
      // fade in from min to max in increments of 5 points:
      for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=5) {
        // sets the value (range from 0 to 255):
        analogWrite(led, fadeValue);      
        // wait for 30 milliseconds to see the dimming effect  
        delay(30);                          
      }

      // fade out from max to min in increments of 5 points:
      for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=5) {
        // sets the value (range from 0 to 255):
        analogWrite(led, fadeValue);      
        // wait for 30 milliseconds to see the dimming effect  
        delay(30);                          
      }
    }

    void loop()
    {
      {
        clock.getTime();
        if(clock.hour == 7 && ledStatus == LED_ON)//Время включения
        {
            ledStatus = LED_OFF;//статус светодиодной дорожки
        }
        else if(clock.hour == 21 && ledStatus == LED_OFF)//время выключения
        {
    }
    }
    }