Помогите новичку написать программу для управления светодиодами
- Войдите на сайт для отправки комментариев
Вс, 16/12/2012 - 21:22
Здравствуйте, у меня задача:
есть два входных сигнала - контакты от фотореле (вход 4) и ИК-датчика (вход 5), надо на выходе(9) создать управление ШИМ светодиодом, чтобы по включению входа 4 на выходе включился светодиод на 20-30%, а при включении входа 5 - плавно перешёл на 100%, и примерно через 3-5 мин вернулся плавно обратно на 20-30%. При отключении входа 4, на выходе - 0.
(т.е. хочется реализовать эстетичную светодиодную подсветку перед входом в дом в вечернее время)
Уже всю голову сломал, вроде задача простая, а получается какая-то ерунда.
Вот один из вариантов:
const int buttonPin = 4;
const int buttonPin2 = 5;// the number of the pushbutton pin
const int ledPin = 9;
int pwmLevel = 255;// the number of the LED pin
// variables will change:
int lightState = 0;
int movement = 0;
int prevState = LOW; // variable for reading the pushbutton status
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
digitalWrite(buttonPin, HIGH);
pinMode(buttonPin2, INPUT);
digitalWrite(buttonPin2, HIGH);
}
void loop(){
// read the state of the pushbutton value:
lightState = digitalRead(buttonPin);
movement = digitalRead(buttonPin2);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (lightState == LOW && prevState == HIGH && movement == HIGH ) {
for (pwmLevel=255; pwmLevel >= 240; pwmLevel--){
delay(30);
analogWrite(ledPin, pwmLevel);
}
prevState = LOW;
}
if (lightState == LOW && prevState == LOW) {
delay(30);
}
if (lightState == LOW && movement == LOW) {
for (pwmLevel=240; pwmLevel >= 0; pwmLevel--){
delay(30);
analogWrite(ledPin, pwmLevel);
}
delay(10000);
for (pwmLevel=0; pwmLevel <= 240; pwmLevel++){
delay(30);
analogWrite(ledPin, pwmLevel);
}
}
if (lightState == HIGH && prevState == LOW){
for (pwmLevel >= 0; pwmLevel <= 255; pwmLevel ++){
delay(30);
analogWrite(ledPin, pwmLevel);
}
prevState = HIGH;
}
}
const int buttonPin = 4; const int buttonPin2 = 5;// the number of the pushbutton pin const int ledPin = 9; int pwmLevel = 255;// the number of the LED pin // variables will change: int lightState = 0; int movement = 0; int prevState = LOW; // variable for reading the pushbutton status void setup() { // initialize the LED pin as an output: pinMode(ledPin, OUTPUT); // initialize the pushbutton pin as an input: pinMode(buttonPin, INPUT); digitalWrite(buttonPin, HIGH); pinMode(buttonPin2, INPUT); digitalWrite(buttonPin2, HIGH); } void loop(){ // read the state of the pushbutton value: lightState = digitalRead(buttonPin); movement = digitalRead(buttonPin2); // check if the pushbutton is pressed. // if it is, the buttonState is HIGH: if (lightState == LOW && prevState == HIGH && movement == HIGH ) { for (pwmLevel=255; pwmLevel >= 240; pwmLevel--){ delay(30); analogWrite(ledPin, pwmLevel); } prevState = LOW; } if (lightState == LOW && prevState == LOW) { delay(30); } if (lightState == LOW && movement == LOW) { for (pwmLevel=240; pwmLevel >= 0; pwmLevel--){ delay(30); analogWrite(ledPin, pwmLevel); } delay(10000); for (pwmLevel=0; pwmLevel <= 240; pwmLevel++){ delay(30); analogWrite(ledPin, pwmLevel); } } if (lightState == HIGH && prevState == LOW){ for (pwmLevel >= 0; pwmLevel <= 255; pwmLevel ++){ delay(30); analogWrite(ledPin, pwmLevel); } prevState = HIGH; } }Примерно так:
#define lightPin 4 #define movePin 5 #define ledPin 9 #define TIME_ON 100 #define TIME_OFF 1000 bool flag = 0; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(lightPin, HIGH); digitalWrite(movePin, HIGH); } void loop() { if(!digitalRead(lightPin)) { static unsigned long time_fade; if(millis() > time_fade) { static byte pwmLevel; if(!flag) { pwmLevel = 40; flag = 1; } if(digitalRead(movePin)) { pwmLevel++; time_fade = millis() + TIME_ON; } else { pwmLevel--; time_fade = millis() + TIME_OFF; } pwmLevel = constrain(pwmLevel, 40, 200); analogWrite(ledPin, pwmLevel); } } else { flag = 0; analogWrite(ledPin, 0); } }Спасибо, Максим за оперативный ответ, пойду проверять как работает!
К сожалению, система не заработала... светодиодные лампочки горят и не реагируют на управление.....
На какое управление? Опишите что, куда и как подключаете и какие уровни на входах.
Извиняюсь за мелкие буквы, вот покрупнее:
Я писал код по аналогии с вашим и по вашему описанию, так вот у вас у датчика движения активный уровень (есть движение) - высокий, а у освещения (стало темно) - низкий. Если все так, то все замечательно работает. А как вы определили что светодиоды просто горят? они плавно разгораются и очень плавно тухнут, для того чтобы менять скорость разгорания/затухания нужно менять значения TIME_ON и TIME_OFF, еще добавил вам значения минимального и максимального предела яркости MIN_LIGHT и MAX_LIGHT. Ну вот вам побыстрее, странно что вы сами не догадались попробовать изменить TIME_ON и TIME_OFF.
#define lightPin 4 #define movePin 5 #define ledPin 9 #define TIME_ON 1 #define TIME_OFF 10 #define MIN_LIGHT 10 #define MAX_LIGHT 250 bool flag = 0; void setup() { pinMode(ledPin, OUTPUT); digitalWrite(lightPin, HIGH); digitalWrite(movePin, HIGH); } void loop() { if(!digitalRead(lightPin)) { static unsigned long time_fade; if(millis() > time_fade) { static byte pwmLevel; if(!flag) { pwmLevel = MIN_LIGHT; flag = 1; } if(digitalRead(movePin)) { pwmLevel++; time_fade = millis() + TIME_ON; } else { pwmLevel--; time_fade = millis() + TIME_OFF; } pwmLevel = constrain(pwmLevel, MIN_LIGHT, MAX_LIGHT); analogWrite(ledPin, pwmLevel); } } else { flag = 0; analogWrite(ledPin, 0); } }Извиняюсь за мелкие буквы, вот покрупнее:
Все красиво, можете приступать к изучению и напмсанию программы.
Спасибо, за комментарии, утром попробую ещё повключать, наверное, где-то ошибся...
Здравствия Вам гуру ардуино! Помогите новичку воплотить идею пока не перегорел.
Суть: Необходима регулировка искусственного освещения в зависимости от уровня освещенности при наличии естественного. я себе представил это так.
Критерий -> измерение освещенности -> команда на транзистор через ШИМ -> задержка -> измерение освещенности если удовлетворяет критерий -> измерение освещенности
Критерий -> измерение освещенности -> команда на транзистор через ШИМ -> задержка -> измерение освещенности не удовлетворяет критерий -> измерение освещенности -> команда на транзистор через ШИМ следующая уставка