Если темновато и кто-то подошел, плавно включить свет

reanews
Offline
Зарегистрирован: 15.02.2016
Идея не нова, но именно в такомм исполнении не нашел, пришлось сочинять самому, и чето зашел втупик и около года туплю на месте с переменным успехом. 
Дано: 
1. Arduino UNO или NANO Китайская - 1шт или другая, куда скетч влезет.
2. GY-30 Датчик освещенности - 1шт (А4 и А5 // выходы SDA и SCL (Add - в земле)) 
3. HC-SR04 Датчик измерения расстояния - 1шт (8,9// выходы для Trig и Echo)
4. Светодиодик, работающий, 1шт (как то жив на 5 вольтах)
 
Логика (хотелось бы): Если светло, более 500lx думает датчик GY-30, то просто ждем. Если темно в помещении, наже 500lx думает датчик GY-30, то пусть HC-SR04 измеряет расстояние до объекта и если до объекта менее 90 см, то надо потихоньку-потихоньку включить светодиодик. А когда становится больше то так же плавно выключить. 
Если резко стало светло более 500lx думает датчик GY-30, вырубить светодиод и не измерять расстояние пока опять не потемнеет.
 
Помогите разобраться и написать код. Вот что я осилил, но все идет не так как то. 
 
#include <Wire.h>
#include <BH1750FVI.h> 
#include <Ultrasonic.h>
BH1750FVI myBH1750;
Ultrasonic ultrasonic(8,9); // выходы для Trig и Echo

#define LED_PIN 3
void setup()
{
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  }
void loop()
  
  {
    delay(1000);
  if (myBH1750.readLightLevel() >500 )
  {
    Serial.print(ultrasonic.distanceRead(CM)); // выводим расстояние в сантиметрах
    Serial.println("cm"); // выводим надпись "cm"
      
    if (ultrasonic.distanceRead(CM) <30)     
      {
    
                   Serial.print("Ярко: ");
                   Serial.print(myBH1750.readLightLevel());
                   Serial.println();
                  for(int i=255;i>=0;i--)
               {
                   
                   analogWrite(LED_PIN, i);
                   analogWrite(LED_PIN, LOW);
                   //delay(5); // ставим задержку для эффекта
               }
  
    }
    else {
                   Serial.print("Тускло: ");
                   Serial.print(myBH1750.readLightLevel());
                   Serial.println();
                    for(int i=0;i<=255;i++)
            { 
                   
                   analogWrite(LED_PIN, i);
                   analogWrite(LED_PIN, HIGH);

            }

    }
      }
    
}

 

 

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

Попробуйте объяснить (себе - мне не надо) что у Вас делают строки 32 и 45.

Потом, просто выбросьте их.

А задержки верните на место.

reanews
Offline
Зарегистрирован: 15.02.2016

Спасибо, но всеравно не работает. Светодиод загорается или сразу или чуть с задержко, но резко в обоих случаях. А в консоле вот тоже не правильно: 

177cm
Тускло: 741.67
166cm
Тускло: 742.50
6cm
Ярко: 580.00
.....и т.д.

А когда накрываю лайтсенсор, то не идет вывод в консоль. открываю, вывод вроде возобновляется, но светодиод горит...

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

reanews пишет:

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

Блин, Вы сегодня все как сговорились.

Давайте код в том виде в ккаком он сейчас. Откуда я знаю, что и как Вы меняли?

reanews
Offline
Зарегистрирован: 15.02.2016

вот еще добавить хотел. поменял знаки больше меньше в параметрах яркости 500lx и расстояня. Стало срабатывать вроде, но если темно, то просто мигает плавно загораясь и плавно затухая, А если светло, то в консоль вообще ничего не выводит. 

reanews
Offline
Зарегистрирован: 15.02.2016
#include <Wire.h>
#include <BH1750FVI.h> 
#include <Ultrasonic.h>
BH1750FVI myBH1750;
Ultrasonic ultrasonic(8,9); // выходы для Trig и Echo

#define LED_PIN 3
void setup()
{
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  }
void loop()
  
  {
    delay(1000);
  if (myBH1750.readLightLevel() <500 )
  {
    Serial.print(ultrasonic.distanceRead(CM)); // выводим расстояние в сантиметрах
    Serial.println("cm"); // выводим надпись "cm"
      
    if (ultrasonic.distanceRead(CM) <30)     
      {
    
                   Serial.print("Ярко: ");
                   Serial.print(myBH1750.readLightLevel());
                   Serial.println();
                  for(int i=255;i>=0;i--)
               {
                   
                   analogWrite(LED_PIN, i);
                   delay(5); // ставим задержку для эффекта
               }
  
    }
    else {
                   Serial.print("Тускло: ");
                   Serial.print(myBH1750.readLightLevel());
                   Serial.println();
                    for(int i=0;i<=255;i++)
            { 
                   
                   analogWrite(LED_PIN, i);
            }

    }
      }
    
}

 

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

reanews пишет:

А если светло, то в консоль вообще ничего не выводит. 

И не должно. В какой строке программы Вы что-то выводите. если светло? Ни в какой! И с чего будет что-то выводиться.

reanews пишет:

вот еще добавить хотел. поменял знаки больше меньше в параметрах яркости 500lx и расстояня. Стало срабатывать вроде, но если темно, то просто мигает плавно загораясь и плавно затухая,

Так и должно быть. Почти так. На самом деле, оно должно плавно гаснуть, потом резко загораться и снова плавно гуснуть и так постоянно. Что у Вас написано в строках 22-35? Там написано: если расстояние меньше 30, то прогнать яркость от 255 до 0. Так оно и делает.

А чего после строки 43 задержку не поставили?

 

reanews
Offline
Зарегистрирован: 15.02.2016
#include <Wire.h>
#include <BH1750FVI.h> 
#include <Ultrasonic.h>
BH1750FVI myBH1750;
Ultrasonic ultrasonic(8,9); // выходы для Trig и Echo

#define LED_PIN 3
void setup()
{
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
  }
void loop()
  
  {
    delay(1000);
  if (myBH1750.readLightLevel() <500 )
  {
    Serial.print(ultrasonic.distanceRead(CM)); // выводим расстояние в сантиметрах
    Serial.println("cm"); // выводим надпись "cm"
      
    if (ultrasonic.distanceRead(CM) <30)     
      {
    
                   Serial.print("Ярко: ");
                   Serial.print(myBH1750.readLightLevel());
                   Serial.println();
                  for(int i=255;i>=0;i--)
               {
                   
                   analogWrite(LED_PIN, i);
                   delay(5); // ставим задержку для эффекта
               }
  
    }
    else {
                   Serial.print("Тускло: ");
                   Serial.print(myBH1750.readLightLevel());
                   Serial.println();
                    for(int i=0;i<=255;i++)
            { 
                   
                   analogWrite(LED_PIN, i);
                   delay(5);
            }

    }
      }

Вот поставил. Теперь пишет "Ярко: 75" а это не должно быть ярко и загорается не плавно, а резко. Зато затухает плавно. Но работает как маяк. 

А когда более 500lx то и в консоль не пишет и светодиод не зажигает. 

А у меня задача другая была. Хотелось бы, что б светило постоянно когда меньше 500 lx и расстояние менее 30 см .

В противном случае просто в консоль писало, что оно там видит, освещенность и расстояние. Либо ничего. (но тут трудно судить пока, не висит ли онео случайно.)

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

reanews пишет:

Теперь пишет "Ярко: 75" а это не должно быть ярко

Кому не должно? Смотрим Вашу программу. СТроки 25-26. Вы печатаете слово "Ярко", а затем читаете "myBH1750.readLightLevel()" и печатаете что получилось. Вы нигде и никак не проверяете что там прочиталось - 75 или 175, просто читаете и печатаете.

reanews пишет:

и загорается не плавно, а резко. Зато затухает плавно. Но работает как маяк.

Ну, правильно, так и должно быть. Что у Вас написано в строках 28-33? Вы начинаете цикл с максимальной яркости - 255. Как написано так и работает.

reanews пишет:

работает как маяк.

Ну, правильно, так и должно быть

reanews пишет:

Вот поставил. Теперь пишет "Ярко: 75" а это не должно быть ярко и загорается не плавно, а резко. Зато затухает плавно. Но работает как маяк.

Ну, правильно, так и должно быть. Вы прогоняете цикл от 255 до 0, потом, при следующем проходе loop снова от 255 до 0 и так постоянно, я Вам об этом ещё в прошлом посте писал.

reanews пишет:

А когда более 500lx то и в консоль не пишет и светодиод не зажигает. 

Опять же я Вам в прошлом посте писал - Вы ничего не выводите, так с чего бы чему-то выводиться? У Вас проверка в строке 17. Если < 500, то выполнять строки 18-47. А иначе - НИЧЕГО. Т.е. вообще ничего. Вот ничего и не делается.

reanews пишет:

Хотелось бы, что б светило постоянно когда меньше 500 lx и расстояние менее 30 см . В противном случае просто в консоль писало, что оно там видит, освещенность и расстояние. 

Ну," хотелось бы", так так и пишите. Вы же не это написали. Как написали, так оно и работает.

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

reanews пишет:
около года туплю

Фигасе упорство ))

vosara
vosara аватар
Offline
Зарегистрирован: 08.02.2014

Может так

#include <Wire.h>
#include <BH1750FVI.h> 
#include <Ultrasonic.h>
BH1750FVI myBH1750;
Ultrasonic ultrasonic(8,9); // выходы для Trig и Echo
bool f_vk;
uint32_t time = millis();
byte led = 0;

#define LED_PIN 3
void setup()
{
  Serial.begin(9600);
  pinMode(LED_PIN, OUTPUT);
}
void loop(){
  //delay(1000); 
  if(millis()-time >= 1000){
    time = millis();
    Serial.print("Освещенность: ");
    Serial.print(myBH1750.readLightLevel());
    Serial.println();
    Serial.print("Дистанция: ");
    Serial.print(ultrasonic.distanceRead(CM));
    Serial.println();
  }
  //Проверяем освещенность-если темно и флаг в нолю
  if (myBH1750.readLightLevel() < 500 && !f_vk ){

    //Проверяем растояние - если меньше -ЗАЖИГАЕМ и ставим флаг в 1; что мы зажгли
    if (ultrasonic.distanceRead(CM) <30){
      f_vk=1;
      for(;led < 255;led++){
        analogWrite(LED_PIN, led);
        delay(5); // ставим задержку для эффекта
      }
    }
  }

  //Проверяем растояние - если больше и флаг что мы зажгли то тушим и флаг в ноль
  if (ultrasonic.distanceRead(CM) > 30 && f_vk){
    f_vk=0;
    for(;led > 0;led--){ 
      analogWrite(LED_PIN, led);
      delay(5);
    }
  }
}

 

reanews
Offline
Зарегистрирован: 15.02.2016

Спасибо огромное, vosara!

По логике работает отлично. И сразу светодиод выключен (как положено) и загорается сторого когда надо. Это Отлично. Только тепрь если он по логике правильно включился, то при увеличении дистанции свыше положенного, остается светиться на минимальном уровне и уже не гаснет совсем и если освещенность более 500 тоже не гаснет.

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

reanews пишет:

Только тепрь если он по логике правильно включился, то при увеличении дистанции свыше положенного, остается светиться на минимальном уровне и уже не гаснет совсем и если освещенность более 500 тоже не гаснет.

А что самому доделать свосем никак.

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

reanews,

Ваша задача проста как валенок (даже код от vosara излишне переусложнён, я уж не гороюу про Ваш). Делает она просто, в несколько строк, на одном дыхании, просто один в оди перекладываю Вашу хотелку.

Показать как?

reanews
Offline
Зарегистрирован: 15.02.2016

Ну чего ругаешься то.?! Я и так башку сломал. 

Добавил в код уважаемого vosara   после 45й строки  

analogWrite(LED_PIN, LOW);

и поставил задержку 10 .



и теперь гаснет. Отлично, по моему мнению получилось. Спасибо vosara ! 

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

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

reanews пишет:

Ну чего ругаешься то.?!

Я ругаюсь? Я ещё и не начинал! Вы не видели, как я ругаюсь :)

reanews пишет:

А если можно лучше, конечно покажи.

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

Я покажу Вам как нададо рассуждать, чтобы Вы впредь не мучились, а делали простые вещи просто, а не писали

reanews пишет:

Я и так башку сломал. 

Не надо! Башка ещё пригодится шапку примеривать.

reanews пишет:

Только не нервничай так.

Я спокоен как удав, не сомневайтесь.

Сейчас напишу как бы Вам нужно было подходить к задаче. Возвращайтесь через полчасика, почитаете и удивитесь как всё просто и очевидно.

И, да, давайте общаться "на Вы", как нормальные, воспитанные люди.

 

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

Итак, чего надо-то?

Надо, чтобы при выполнении двух условий: «темно» и «кто-то рядом» плавно включался свет, а если эти условия (хотя бы одно из них) не выполняются – свет плавно гас. Правильно?

Уточним задачу. Если условия выполнились и свет начал плавно зажигаться, а в процессе зажигания (когда он ещё не успел зажечься на полную) условия перестали выполняться, он должен прекратить «зажигание» и немедленно начать плавно гаснуть. И наоборот, если в процессе угасания условия начали выполняться, он должен немедленно прекратить гаснуть, а начать разгораться. Этого нет ни в Вашем коде, ни в коде от vosara, но это разумно, согласитесь.

Ну, тогда так и пишем (просто дословно по формулировке задачи):

void loop(void) {
   if (temno() && kto_to_ryadom()) vklycharm_esli_ets_kuda();
   else gasim_esli_est_kuda();
   delay(5);
}

Обратите внимание на приписку «esli_ets_kuda» - она означает, что функция делает свет ярче (тусклее) если он ещё не на максимальной (минимальной) яркости. А если уже на максимальной (минимальной), то ничего не делает.

Собственно функция loop() готова. Больше ничего не нужно. Она полностью реализует Вашу хотелку, включая и моё дополнительное уточнение. Осталось написать функции temno(), kto_to_ryadom(), vklycharm_esli_ets_kuda() и gasim_esli_est_kuda()

До сих пор Вам всё понятно? Вам нужно просто было дословно написать хотелку, ничего не выдумывая.

Пишем недостающие функции. Первые две тривиальны:

bool temno(void) { return myBH1750.readLightLevel() < 500; }

bool kto_to_ryadom(void) { return ultrasonic.distanceRead(CM) < 30; }

Что касается остальных двух функций, то чтобы сделать «немножко светлее» или «немножко темнее», нужно помнить «а как оно сейчас». Потому заводим переменную «состояние фонаря». Сами функции тоже тривиальны:

static byte lightState = 0; // текущее состояние фонаря

void vklycharm_esli_ets_kuda(void) {
    if (lightState != 255) analogWrite(LED_PIN, ++lightState);
}

void gasim_esli_est_kuda(void) {
    if (lightState != 0) analogWrite(LED_PIN, --lightState);
}

Ну, вот собственно и всё! Осталась начальная инициализация, которая у Вас вроде и так сделана. Давайте соберём всё в кучу:

#include <Wire.h>
#include <BH1750FVI.h> 
#include <Ultrasonic.h>

#define LED_PIN 3

BH1750FVI myBH1750;
Ultrasonic ultrasonic(8,9); // выходы для Trig и Echo

void setup(void) {
  pinMode(LED_PIN, OUTPUT);
}

static byte lightState = 0;  // текущее состояние фонаря

void vklycharm_esli_ets_kuda(void) {
    if (lightState != 255) analogWrite(LED_PIN, ++lightState);
}

void gasim_esli_est_kuda (void) {
    if (lightState != 0) analogWrite(LED_PIN, --lightState);
}

bool temno(void) { return myBH1750.readLightLevel() < 500; }

bool kto_to_ryadom(void) { return ultrasonic.distanceRead(CM) < 30; }

void loop(void) {
   if (temno() && kto_to_ryadom()) vklycharm_esli_ets_kuda();
   else gasim_esli_est_kuda();
   delay(5);
}

Вот и всё. Это вся Ваша программа с учётом моего замечания о том, что если условие поменялось, то нужно сразу менять режим, а не ждать пока предыдущее действие закончится.

Согласитесь, что я просто выписал Вашу хотелку, ничего не придумывая. Если бы Вы не полезли всё усложнять, то и Вы бы это легко и непринуждённо написали. Попробуйте впредь так и поступать.

Да, у меня нет под рукой датчиков, так что я ничего не проверял. Идейно там всё верно и работать должно. Если где-то что-то по мелочи ляпнуто, скажите как себя ведёт – поправим. А лучше – поправьте сами. Вы же всё понимаете, что написано, так ведь?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Действительно "простенько и со вкусом".

Я бы ещё попробовал убрать задержку в loop. Процедура ultrasonic.distanceRead достаточно медленная и задержка там сама по себе образуется. Как бы не слишком большая даже.

reanews
Offline
Зарегистрирован: 15.02.2016

Огромное спасибо ЕвгенийП! Все круто работает! Я в восторге и от результата и от объяснения! Прямо именно так как хотелось! И правки очень к месту! 

Вот сейчас сосредоточусь и попробую добавить сюда подстроечные резисторы RKT-065-201-R 200  для ручного изменения расстояния срабатывания на 11 ногу и второй уровня освещенности срабатывания, что бы в темноте срабатывало и не тухло от своего же света на 5ю ногу. (только что решил доделать.) Ведь по сути это просто ночник, что бы ночью или ранним зимним утром шею не свернуть и свет резкий по глазам не бил. 

arduinec
Offline
Зарегистрирован: 01.09.2015

reanews пишет:

и не тухло от своего же света

При этом простой алгоритм ЕвгенийП перестаёт работать.

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

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

arduinec
Offline
Зарегистрирован: 01.09.2015

Датчик света практически нужен только для определения "день-ночь". Днём ничего включать не надо, а ночью включать всегда при срабатывании датчика расстояния.

reanews
Offline
Зарегистрирован: 15.02.2016

Ну я немного поясню изначальную задумку. Этот светильник не только для темного туалета или ванной, но и для коридора например. Т.е. туда например выходят какие то двери или другое тусклое освещение и когда ну просто пройти там или разуться/обуться яркого света не надо то и не надо. Если яркий надо то щелкну выключателем. Именно по этому я замериваю освещенность. Так бы просто фоторезистора хватило с градацией один-ноль.

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

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

reanews
Offline
Зарегистрирован: 15.02.2016

Ну нет.во всех этих датчиках движения используется простая задержка. А если чуть застрял т потухло, а так обязательно случиться. То все, разучивай танец или морскую азбуку.именно так не хотел. Хотел, чтоб меня чувствовали )))) (полутейка)

reanews
Offline
Зарегистрирован: 15.02.2016

Ну нет.во всех этих датчиках движения используется простая задержка. А если чуть застрял т потухло, а так обязательно случиться. То все, разучивай танец или морскую азбуку.именно так не хотел. Хотел, чтоб меня чувствовали )))) (пошутейка)

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

Только у обычного датчика движения область видимости 90-180 градусов, а у вашего датчика HC-SR04 узкое поле зрения, чуть от луча отклонился на сантиметр хоть, и он уже ничего не видит. Ну или больше лучшей делать как на картинке ))

Ну и если велосипед поставить неподвижный рядом, он его будет вечно подсвечивать? Датчик движения неподвижные объекты игнорирует сам. Улучшение не очень очевидно.

reanews
Offline
Зарегистрирован: 15.02.2016

Про внелик само собой понятно, что надо ставить мимо велика. другой недостаток у ультразвука в почти рандомном поглащении/рассеивании "луча" . Порой при направлении на ворсистую поверхность или со сложным контуром или просто пористую, прибор "ошибается". 

Вот вопрос встает об адекватной замене, на лазер например или инфракрасный... 

Бывают такие приемнико/передатчики ?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

reanews пишет:

 Порой при направлении на ворсистую поверхность или со сложным контуром или просто пористую, прибор "ошибается". 

Да, у мена кота "не видит".

reanews
Offline
Зарегистрирован: 15.02.2016

Ну кота ладно, коту и нюха и кошачего зрения для ориентирования достаточно, а вот меня в свитере не видет, это плохо. пишет, что я то на 3км ушел то меньше..., а он сам так не умееет далеко смотреть. Просто проскакивает Огромное число периодически и все тут. 

У лазера обзор - линия. Вот нашел инфракрасный датчик припятствия, но у него дальность зависит от цвета и дальность почти вплотную. Ну неужели, нет ничегонадежного с углом обзора хотя бы градусов 50?

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

reanews пишет:

Бывают такие приемнико/передатчики ?

Вам нужен датчик объема (почти датчик света только в другом диапазоне), на Алиэкспрессе стоит примерно 1$, работает на частоте 5 ГГц. Даже за тонкой стенкой работает и сквозь корпус, дырку ковырять не нужно ))

https://ru.aliexpress.com/item/5-8GHZ-Smart-Sensoring-Switch-Microwave-Radar-Module-6-9M-Home-Control/32645549496.html?spm=a2g0s.8937460.0.0.CvscLJ

 

https://ru.aliexpress.com/item/RCWL-0516-microwave-radar-sensor-module-Human-body-induction-switch-module-Intelligent-sensor/32708877914.html?spm=a2g0s.8937460.0.0.RNYQfo

И там еще есть подобные.

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

sim31 пишет:
датчик объема, на Алиэкспрессе стоит примерно 1$, работает на частоте 5 ГГц. Даже за тонкой стенкой работает и сквозь корпус, дырку ковырять не нужно ))

А на открытом пространстве работает? В том смысле, что может определить есть ли моя тушка на разумном расстоянии от него или нет, если установлен на улице?

reanews
Offline
Зарегистрирован: 15.02.2016

Класс! когда задавал этот вопрос, думал что мне и так все ответы известны. Но нет. Это Что-то очень новенькое! 

А какие он показания дает? А каком объеме? Угол большей? Вообще чуть понятнее описания на сайте можно? Заранее спасибо!

sim31
sim31 аватар
Offline
Зарегистрирован: 26.07.2017

Такие датчики стоят в раздвижных дверях магазинов, в том числе и на улицу смотрят. Работают хорошо, ловят доплеровское смещение отраженного сигнала. За такую цену да, это что-то новое ))

andycat
andycat аватар
Онлайн
Зарегистрирован: 07.09.2017

у меня RCWL стоит над дверью на улице при входе в дом - слишком чуствительный :( - листва, животные, ветки деревьев - реагирует на все что шевелиться, когда проект делал - тестировал в офисе/комнате - для этого отличное решение.

благо я его параллельно с PIR датчиком опрашиваю

АлексейЭтоЯ
Offline
Зарегистрирован: 31.10.2017

Что то Я совсем с этими войдами запутался, поправьте

#define LEDPIN 13
#define PIRPIN 4

void setup(void) {
  pinMode(LEDPIN, OUTPUT);
  digitalWrite(LEDPIN ,LOW);
  pinMode(PIRPIN, INPUT);
}

static byte lightState = 0;  // текущее состояние фонаря

void on(void) {
    if (lightState != 255) analogWrite(LEDPIN, ++lightState);
}
void off(void) {
    if (lightState != 0) analogWrite(LEDPIN, --lightState);
}
bool starting(void) { digitalRead(PIRPIN) == HIGH;}

void loop(void) {
   if (starting()); 
   else off(); 
   delay(5);
}

 

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

АлексейЭтоЯ

21 строку посмотрите и спросите себя, что там произойдёт, если ф-я starting вернёт истину?

АлексейЭтоЯ
Offline
Зарегистрирован: 31.10.2017

OlegK пишет:

АлексейЭтоЯ

21 строку посмотрите и спросите себя, что там произойдёт, если ф-я starting вернёт истину?

Так тоже не работает 

void loop(void) {
   if (starting()) on();
   else off(); 
   delay(5);
}

 

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

АлексейЭтоЯ пишет:

Что то Я совсем с этими войдами запутался, поправьте

А ботинки почистить не надо?

OlegK
OlegK аватар
Offline
Зарегистрирован: 26.11.2014

Как возвращает значение эта функция? Может стОит теорию почитать?
bool starting(void) { digitalRead(PIRPIN) == HIGH;}

АлексейЭтоЯ
Offline
Зарегистрирован: 31.10.2017

Для Варота

Если,  за  поправленные скобки, тебе памятник  нужно поставить,  или  100$ дать, не много хочешь, работать не пробовал, или тяжелее клавиатуры ничего не держал, так ты любишь общаться, или  Я тебе не так понял?? Или это  шутишь вы так??

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

АлексейЭтоЯ пишет:

Если,  за  поправленные скобки, тебе памятник  нужно поставить,  или  100$ дать, не много хочешь,

Нах мне твои доллары не сдались.

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

К тебе две претензии: по форме, и по сути.

1. по форме: перечитай свой пост. Ты ввалился в тему и заявил: "что-то я запутался, поправьте".  Ты, бля, сержант-дембель, а тут духи собрались, деду что-то подправлять? Тебя мама не учила говорить "пожалуйста" и здороваться?  Вот я и спросил тебя, начёт «ботинки почистить» - "Вы, барин токма скажите и мы мигом почистим, не извольте сумлеваться". Когда остынешь от обидок, согласишься, что я прав.

2. по сути: опять же перечитай свой пост. Что значит, ты запутался? Ты хоть бы написал,  что ты хотел сделать! Хрен же тебя знает, что ты там делал, что такое получилось. Олег вон потёр хрустальный шар, чего-то там догадался, но если выяснится, что неправильно догадался - получит вагон зря потерянного времени. И такое тут каждый день. А всё только потому, что тебе даже хотелку свою лень описать – поправьте и всё тут! Сами разберётесь что там и как!

Вот как-то так. Думай впредь, как задавать вопросы, чтобы получить ответы, а не посылания.

toc
Offline
Зарегистрирован: 09.02.2013

Ребята, давайте жить дружно. http://www.consultant.ru/cons/cgi/online.cgi?req=home#doc/LAW/221804/100...
статья 5.61

toxikaciya
Offline
Зарегистрирован: 11.04.2016

Немного доработал алгоритм Евгения, теперь все должно работать нормально и при освещении датчика светодиодом.

Первый вариант (из недостатков - постоянное отключение светодиода при наличии стороннего света, при его резком появлении):

#include <Wire.h>
#include <BH1750FVI.h>
#include <Ultrasonic.h>

#define LED_PIN 3

BH1750FVI myBH1750;
Ultrasonic ultrasonic(8, 9); // выходы для Trig и Echo

void setup(void)
{
  pinMode(LED_PIN, OUTPUT);
}

static byte lightState = 0;  // текущее состояние фонаря

void vklycharm_esli_ets_kuda(void)
{
  if (lightState != 255) analogWrite(LED_PIN, ++lightState);
}

void gasim_esli_est_kuda (void)
{
  if (lightState != 0) analogWrite(LED_PIN, --lightState);
}

bool temno(void)
{
  return myBH1750.readLightLevel() < 500;
}

bool kto_to_ryadom(void) {
  return ultrasonic.distanceRead(CM) < 30;
}

void loop(void)
{
  while (temno())
  {
    while (kto_to_ryadom())
      vklycharm_esli_ets_kuda();
    while (!kto_to_ryadom() && !temno())
      gasim_esli_est_kuda();
  }
  delay(5);
}

Второй вариант (недостаток - постоянное отключение света при его отсутствии):

#include <Wire.h>
#include <BH1750FVI.h>
#include <Ultrasonic.h>

#define LED_PIN 3

BH1750FVI myBH1750;
Ultrasonic ultrasonic(8, 9); // выходы для Trig и Echo

void setup(void)
{
  pinMode(LED_PIN, OUTPUT);
}

static byte lightState = 0;  // текущее состояние фонаря

void vklycharm_esli_ets_kuda(void)
{
  if (lightState != 255) analogWrite(LED_PIN, ++lightState);
}

void gasim_esli_est_kuda (void)
{
  if (lightState != 0) analogWrite(LED_PIN, --lightState);
}

bool temno(void)
{
  return myBH1750.readLightLevel() < 500;
}

bool kto_to_ryadom(void) {
  return ultrasonic.distanceRead(CM) < 30;
}

void loop(void)
{
  while (temno())
    while (kto_to_ryadom())
      vklycharm_esli_ets_kuda();
  while (!kto_to_ryadom() && !temno())
    gasim_esli_est_kuda();
  delay(5);
}