включение света с ПИР, ИК и фоторезистором

dardaval
Offline
Зарегистрирован: 03.04.2016

в общем: скетч должен включать свет: в темноте - от ПИР (при поступлении сигнала с ИК напрежение должно повышаться, при повторном - выключаться + авто выключение при свете), на свету - от ИК(плавно)

вот начальный скетч, но что-то работает не так, как надо. Помогите пожалуйста

 

#define but 8  //Button Pin
#define led 11 //LED Pin
#define foto 3 
#define PIR 7 
#define speedON 40
#define speedOFF 30


int vol=0;
int old_vol=0;
int state=0;
int old_state=0;
int y=0;  //LED Level
int s=8;  //speed of the LED Level change (mS)
int t=0;
void setup()
{
pinMode (but,INPUT);
pinMode (led,OUTPUT);
pinMode (foto,INPUT);
pinMode (PIR,INPUT);
}
void loop()
{
  {
    vol=digitalRead (but);
    if((vol==HIGH)&&(old_vol==0))// расстояние 1006
    {
      state=!state;  //Button's Trigger
      delay(200); //задержка вкл 200 было
    }
    old_vol=vol;
    if((state==0)&&(old_state==0)) //Condition when LED OFF
    {
       analogWrite(led,0);
    }

    if((state==1)&&(old_state==1))  //Condition when LED ON
    {
       analogWrite(led,255);
    }

    if((state==1)&&(old_state==0))  //Condition when LED increase LED Level
    for(y=0;y<255;y++)
    {
      analogWrite (led,y);
      delay(s); //Speed of the increasing LED Level
      old_state=state;
      delay(1);
    }

    if((state==0)&&(old_state==1))  //Condition when LED decrease LED Level
    for(y=255;y>0;y--)
    {
       analogWrite (led,y);
       delay(1.5); //Speed of the decreasing LED Level
       old_state=state;
     }
  }
  t=digitalRead(foto);
  if(t ==  HIGH) 
  {
    {
      if(digitalRead(PIR))
      {
        for(int i = 0; i <= 30; i++)
        {
          analogWrite(led, i);
          delay(speedON);
        }
         {
          if(digitalRead(foto) == LOW)
          {
            digitalWrite(led, LOW);
          }
         }
        while(digitalRead(PIR));
        for(int i = 30; i >= 0; i--)
        {
          analogWrite(led, i);
          delay(speedOFF);
      }
    }
       }
   }
  }

 

dardaval
Offline
Зарегистрирован: 03.04.2016

пожалуйста, если можно, как сжать скетчь (что удалить, переделать)?

 

Logik
Offline
Зарегистрирован: 05.08.2014

Может Вам както с  http://arduino.ru/forum/programmirovanie/kod-mozhno-li-proshche скооперироватся, уж больно все похоже. Зачем сжимать скетч? Куда он не влазит? Если просто от любви к искуству - так это только самому надо делать, а не других просить.

dardaval
Offline
Зарегистрирован: 03.04.2016

спасибо

 

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

dardaval пишет:

пожалуйста, если можно, как сжать скетчь (что удалить, переделать)?

Какова цель, которой нужно достичь? Другими словами, целевой размер скетча каков?

dardaval
Offline
Зарегистрирован: 03.04.2016

да это даже не главное... понять бы что не так со скетчем и написать правильно...

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Понятно, т.е. "ради искусства" :)

Mr.Privet
Mr.Privet аватар
Offline
Зарегистрирован: 17.11.2015

dardaval пишет:

пожалуйста, если можно, как сжать скетчь (что удалить, переделать)?

Итак, если уж нужно искусство, то в первую очередь посмотрите на переменные, у вас они все int, хотя используются в тексте как byte или даже как bool. можно в первую очередь это исправить. затем, переменная s у Вас задается как int но в программе никак не меняется, ее соответственно можно перенести в define. Так как у нас все флаги сталь булевые то можно в условиях не писать state == HIGH или state == 0, а просто state и !state. Потом мы приравиниваем vol = digitalRead(but), и затем сразу ставим условие if(vol)...  можно сразу записать if(digitalRead(but)... ну это то с чего можно начать, а далее искусные эквилибристы подскажут)