Помогите понять где допущена ошибка
- Войдите на сайт для отправки комментариев
Доброго времени суток. Прошу вашей помощи уважаемое сообщество
Нашел на просторах форума интересный код с подсчетом входящий и исходящих поситителей в помещение.
Ссылка вот. Был немного переработан и добавлено несколько условий.
Было добавлено плата RTC и кнопка
Так вот все работает четко кроме этой злой кнопки.
Логика работы всей программы такова:
В зависимости от времени суток при пересичении сенсоров записываеться количество людей и включаеться дневной или ночной свет.При проходе обратно свет гаснет! Так же есть мануальное управление. При нажатии на кнопку проверяеться время и включаеться дневной или ночной свет на некоторый промежуток времени и по истечении его он отключаеться.Так вот.
Проблема заключаеться в том что есть использовать только мануальное управление и часы все работает. Но если совместить еще и пересечение то диод(реле) моргает елиели пока держишь зажатую кнопку и все. Соответственно ничего не включаеться. На просторах интернета нашел способ дебажить на кристале(Ссылка на расширение) и проверил что он заходит в это условие (сработка на кнопку есть в зависиности от времени) но почему то не выполняет!
а еще может быть помогите советом, что иногда когда проходит один человек считает как за двоих. Датчики стоят на уровне туловища. Хочу критики и коментариев возможно как то оптимизировать код. и решить эту проблему с кнопкой.
//Библиотеки для работы часов//
#include <Wire.h>
#include "RTClib.h"
RTC_DS1307 rtc; //A4 (SDA), A5 (SCL)
//Библиотеки для работы часов//
const int buttonPin = 2; //кнопка мануального управлением света
const int ledSignalPin = 3;// ИК светодиоды
int IN_IR_1 = 6; // вход ИК фото-приемника 1
int IN_IR_2 = 7; // вход ИК фото-приемника 2
const int ledPin1 = 8;// индикация сработки ик луча 1 orange
const int ledPin2 = 9;// индикация сработки ик луча 2 red
const int relayPin1 = 12;
const int relayPin2 = 11;
long unsigned int time; //Захват сигнала
long unsigned int pause = 5000; //Время работы
long counts; //количество людей в помещении
int buttonState = 0;
int buttonOptions;
int State; //састоянии для алгоритма, определяющего направление движения
int timeNow;// определение время дня
void setup() {
Wire.begin();
rtc.begin();
Serial.begin(9600);
pinMode(ledSignalPin, OUTPUT);
pinMode(IN_IR_1, INPUT);
pinMode(IN_IR_2, INPUT);
pinMode(ledPin1, OUTPUT);
pinMode(ledPin2, OUTPUT);
pinMode(relayPin1, OUTPUT);
pinMode(relayPin2, OUTPUT);
pinMode(buttonPin, INPUT);
counts = 0;
}
void loop() {
tone(ledSignalPin, 38000); //38кГц частота с каторой работает ИК фота - приемник
buttonState = digitalRead(buttonPin);
DateTime now = rtc.now();
//алгоритм дня и ночи// ( 1 = День 2 = Ночь )
if (now.hour() >= 6 && now.minute() >= 00 && now.hour() <= 23 && now.minute() <= 59) timeNow = 1;// День
if (now.hour() >= 0 && now.minute() >= 00 && now.hour() <= 5 && now.minute() <= 59) timeNow = 2;// Ночь
//Алгоритм дня и ночи//
//Алгоритм работы кнопки по времени//
if ((buttonState == HIGH) && (timeNow == 1)) buttonOptions = 1;
if ((buttonState == HIGH) && (timeNow == 2)) buttonOptions = 2;
if (buttonState == LOW) buttonOptions = 3;
//Алгоритм работы кнопки по времени//
////////////////////////////////////////////////
//Мануальное управление светом//
if (buttonOptions == 1 )
{
time = millis();
digitalWrite(relayPin1, HIGH);
}
if (buttonOptions == 3 )
{
if (millis() - time > pause)
{
digitalWrite(relayPin1, LOW);
}
}
if (buttonOptions == 2)
{
time = millis();
digitalWrite(relayPin2, HIGH);
}
if (buttonOptions == 3)
{
if (millis() - time > pause)
{
digitalWrite(relayPin2, LOW);
}
}
//Мануальное управление светом//
///////////////////////////////////////////////
if (digitalRead(IN_IR_1) == HIGH) // индикация работы ИК луча 1, если не пересечен то светадиод ledPin_3 светит, иначе моргнет 1 раз
{
digitalWrite(ledPin1, LOW);
}
else
{
digitalWrite(ledPin1, HIGH);
}
if (digitalRead(IN_IR_2) == HIGH) // индикация работы ИК луча 2, если не пересечен то светадиод ledPin_4 светит, иначе моргнет 1 раз
{
digitalWrite(ledPin2, LOW);
}
else
{
digitalWrite(ledPin2, HIGH);
}
//////////////Алгоритм опредиляющий направление движения/////////////
if (digitalRead(IN_IR_1) == LOW && digitalRead(IN_IR_2) == LOW) State = 0;
if (digitalRead(IN_IR_1) == HIGH && digitalRead(IN_IR_2) == LOW && State == 0) State = 1;
if (digitalRead(IN_IR_2) == HIGH && digitalRead(IN_IR_1) == LOW && State == 1) State = 2; //1 человек вошел
if (digitalRead(IN_IR_2) == HIGH && digitalRead(IN_IR_1) == LOW && State == 0) State = 4;
if (digitalRead(IN_IR_1) == HIGH && digitalRead(IN_IR_2) == LOW && State == 4) State = 5; // 1 человек вышел
//////////////Алгоритм опредиляющий направление движения/////////////
if (State == 2)
{
counts = counts + 1;
State = 0;
}
if (State == 5)
{
counts = counts - 1;
State = 0;
}
if ((counts > 0) && (timeNow == 1))
{
digitalWrite(relayPin1, LOW);
}
if ((counts > 0) && (timeNow == 2))
{
digitalWrite(relayPin2, LOW);
}
if (counts <= 0) {
digitalWrite(relayPin1, HIGH);
digitalWrite(relayPin2, HIGH);
}
if (counts < 0) counts = 0; //обнуляем отрицательные значения количества
/////////////////////////////////////////////////////////////////////////
Serial.print("\n Button: ");
Serial.println(buttonState);
Serial.print(now.hour(), DEC);
Serial.print(':');
Serial.print(now.minute(), DEC);
Serial.print(':');
Serial.print(now.second(), DEC);
Serial.print("\n Counts: ");
Serial.println(counts);
}