Помогите понять где допущена ошибка

Anatolii Kramarenko
Offline
Зарегистрирован: 27.02.2017

Доброго времени суток. Прошу вашей помощи уважаемое сообщество

Нашел на просторах форума интересный код с подсчетом входящий и исходящих поситителей в помещение.

Ссылка вот. Был немного переработан и добавлено несколько условий.

Было добавлено плата 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);

}

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Anatolii Kramarenko пишет:
Хочу критики и коментариев возможно как то оптимизировать код. и решить эту проблему с кнопкой.
  Перепишите программу так, и гемора станет меньше http://arduino.ru/forum/programmirovanie/pomogite-novichku-ochen-prostoi-proekt-muchayus-3-dnya#comment-325365