Помогите понять где допущена ошибка
- Войдите на сайт для отправки комментариев
Доброго времени суток. Прошу вашей помощи уважаемое сообщество
Нашел на просторах форума интересный код с подсчетом входящий и исходящих поситителей в помещение.
Ссылка вот. Был немного переработан и добавлено несколько условий.
Было добавлено плата 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); }