#define LDR_PIN A1 //пин фоторезистора
#define RELAY_PIN A0 //пин реле
#define S_TRIG 3 //триггер звука
#define S_ECHO 4 //ловим эхо
unsigned int distance=0;
unsigned int impulseTime=0;
int RANGE = 150; //предел дистанции обнаружения
int tres = 400; //порог освещенности
unsigned long previousMillis1 = 0; //храним время последнего Включения света
unsigned long interval = 10000; //интервал работы (10 секунд)
boolean CLOSE0, CLOSE1, CLOSE2;
void setup() {
[size=2] pinMode (RELAY_PIN, OUTPUT);[/size]
pinMode (S_TRIG, OUTPUT);
}
void loop()
{
Serial.begin(9600);
int light = analogRead(LDR_PIN); //читаем освещенность
boolean dark = (light < tres); //сравниваем освещенность с порогом
Serial.println("light \t tres \t dark \t distance \t CLOSE0 \t CLOSE1 \t CLOSE2 \t needLight");
Serial.print(light); Serial.print("\t");
Serial.print(tres); Serial.print("\t");
Serial.print(dark); Serial.print("\t");
digitalWrite(S_TRIG, HIGH); /* Подаем импульс на вход trig дальномера */
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(S_TRIG, LOW); // Отключаем
impulseTime = pulseIn(S_ECHO, HIGH);
distance=impulseTime/58; // Пересчитываем в сантиметры
Serial.print(distance); Serial.print("\t ");
CLOSE0 = distance<RANGE;
Serial.print (CLOSE0); Serial.print("\t");
delay (50);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//начинаем проверки
if (CLOSE0 == 1) //итерация1
{
digitalWrite(S_TRIG, HIGH); /* Подаем импульс на вход trig дальномера */
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(S_TRIG, LOW); // Отключаем
CLOSE1 = (pulseIn(S_ECHO, HIGH)/58) <RANGE;
Serial.print (CLOSE1); Serial.print("\t");
delay (50);
}
if (CLOSE1 == 1) //итерация2
{
digitalWrite(S_TRIG, HIGH); /* Подаем импульс на вход trig дальномера */
delayMicroseconds(10); // равный 10 микросекундам
digitalWrite(S_TRIG, LOW); // Отключаем
CLOSE2 = (pulseIn(S_ECHO, HIGH)/58) <RANGE;
Serial.print (CLOSE2); Serial.print("\t");
delay (50);
}
boolean CLOSE = (CLOSE0 && CLOSE1 && CLOSE2);
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
boolean needLight = (CLOSE && dark);
if (needLight == 1) // Если расстояние менее предела
{
analogWrite (RELAY_PIN, 255); // горит
previousMillis1 = millis(); // отсчёт отсрочки начинается сначала...
}
// Прошло время выключаем свет
if (previousMillis1 && (millis()-previousMillis1 >= interval))
{
analogWrite (RELAY_PIN, 0); // не горит
previousMillis1 = 0;
}
Serial.println (needLight);
delay (1000);
}