Помогите новичку написать программу для управления светодиодами

sheb
Offline
Зарегистрирован: 16.12.2012

Здравствуйте, у меня задача:

есть два входных сигнала - контакты от фотореле (вход 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;
   }
   
   
   
   
}
sheb
Offline
Зарегистрирован: 16.12.2012
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;
   }
   
   
   
   
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

Примерно так:

#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);
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

   

sheb
Offline
Зарегистрирован: 16.12.2012

Спасибо, Максим за оперативный ответ, пойду проверять как работает!

sheb
Offline
Зарегистрирован: 16.12.2012

К сожалению, система не заработала... светодиодные лампочки горят и не реагируют на управление.....

maksim
Offline
Зарегистрирован: 12.02.2012

На какое управление? Опишите что, куда и как подключаете и какие уровни на входах.

sheb
Offline
Зарегистрирован: 16.12.2012

sheb
Offline
Зарегистрирован: 16.12.2012

Извиняюсь за мелкие буквы, вот покрупнее:

 

 

Диапазон Длительность Фотореле ИК-Датчик Светодиод
0...1 х 0 х 0
1…2 5 сек вкл х 0…30%
2…3 х вкл выкл 30%
3…4 0,5 сек вкл вкл 30…100%
4…5 3 мин. х х 100%
5…6 0,5 сек х х 100…30%
6…7 х вкл выкл 30%
7…8 5 сек выкл х 0

 

maksim
Offline
Зарегистрирован: 12.02.2012

Я писал код по аналогии с вашим и по вашему описанию, так вот у вас у датчика движения активный уровень (есть движение) - высокий, а у освещения (стало темно) - низкий. Если все так, то все замечательно работает. А как вы определили что светодиоды просто горят? они плавно разгораются и очень плавно тухнут, для того чтобы менять скорость разгорания/затухания нужно менять значения 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);
  }
}

 

maksim
Offline
Зарегистрирован: 12.02.2012

sheb пишет:

Извиняюсь за мелкие буквы, вот покрупнее:

Диапазон Длительность Фотореле ИК-Датчик Светодиод
0...1 х 0 х 0
1…2 5 сек вкл х 0…30%
2…3 х вкл выкл 30%
3…4 0,5 сек вкл вкл 30…100%
4…5 3 мин. х х 100%
5…6 0,5 сек х х 100…30%
6…7 х вкл выкл 30%
7…8 5 сек выкл х 0

Все красиво, можете приступать к изучению и напмсанию программы.

sheb
Offline
Зарегистрирован: 16.12.2012

Спасибо, за комментарии, утром попробую ещё повключать, наверное, где-то ошибся...

RSHopeyourdeath
Offline
Зарегистрирован: 28.04.2016

Здравствия Вам гуру ардуино! Помогите новичку воплотить идею пока не перегорел.

Суть: Необходима регулировка искусственного освещения в зависимости от уровня освещенности при наличии естественного. я себе представил это так.

Критерий -> измерение освещенности ->  команда на транзистор через ШИМ -> задержка -> измерение освещенности если удовлетворяет критерий -> измерение освещенности

Критерий -> измерение освещенности ->  команда на транзистор через ШИМ -> задержка -> измерение освещенности не удовлетворяет критерий -> измерение освещенности -> команда на транзистор через ШИМ следующая уставка