как обеспечить плавное вкл/вык светодиода Код (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); }
delay(61200000); - задержка на 17 часов? Вы чего добиться пытаетесь? У Вас один проход loop() будет выполняться 18 + 17 + 18 + 8 = 61 час!
Ну да, человек хотел сделать задержку от 14:00 до 08:00 (ну или наоборот). Никита Ардуин не содержит встроенных часов реального времени, таким образом как минимум вам нужен внешний модуль часов реального времени что бы знать текущие время. Что то типа этого А вообще посмотрите для начала уроки Джереми Блюма, она там кстати как раз будет плавно как зажигать так и гасить диод в одном из первых уроков.
как то так, но плавность хода пока делать не буду Код (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); }
Если использовать этот модуль и библиотеку, то код может выглядеть примерно так. Код (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; } }
Модуль часов реального времени нужен. Ардуино во время работы может перезагрузиться (отключат электричество дома, кот поиграет с кнопкой "ресет" и т.д.) и все начнется заново. Используя часы реального времени, вы всегда будете застрахованы от подобной ситуации.
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); }
если я вас правильно понял то у меня получается так, но пока без зажигания Код (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) { } }
Чтобы каждый раз не править текущее время в коде, используйте подход, описанный в статье на вики. Тогда в момент компиляции в код автоматически будет подставляться системное время компьютера, на котором производится компиляция. В остальном похоже на правду, осталось собрать схему и проверить
как то так Код (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)//время выключения { } }
И при каждом включении питания такая дата установится В Вики есть пример работы с часами, там хорошо описано, как этого избежать. См. заголовок "Проблемы".
если только как то так Код (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)//время выключения { } } }