![]() |
|
|
#22 |
|
Junior Member
Регистрация: 14.08.2014
Сообщений: 5
Вес репутации: 0 ![]() |
Как оказалось, в коде, о котором я писал, присутствует баг. Если проводим рукой туда или обратно, то все нормально. Но если задержались (закрыты оба фоторезистора), то программа начинала прибавлять людей.
Сын обещал исправить в свободное время. Пришлось сесть за учебники и написать свою версию. Код далек от совершенства, простой и деревянный. Программисты отполируют надеюсь. Багов пока не нашел. Давайте искать вместе. Это моя первая прога, не смеяться и сильно не пинать))) Код:
/*==Created by Midway==========
====МЕГА КРУТОЙ ВЫКЛЮЧАТЕЛЬ)))====
*/
// Светодиоды пины-выходы
int ledOUT1 = 20; //контрольный
int ledOUT2 = 21; //контрольный
int ledOUT3 = 19; //Как бы освщение в комнате
// Фоторезисторы пины-входы
int sensorPin1 = A0;
int sensorPin2 = A1;
// Данные с фоторезисторов
int sensorVal1 = 0;
int sensorVal2 = 0;
// Событие
int event;
// Количество людей в комнате
int humanCount;
// Аналоговые входы фоторезисторов буду преобразовывать
// в сигналы: либо сработал, либо нет
boolean sens1;
boolean sens2;
// У двух датчиков может быть 4 состояния: (--), (-+), (++), (+-)
// Нужно отслеживать предыдущее и текущее состояние
int status_curr = 0;
int status_prev = 0;
// Порог срабатывания фоторезисторов. Подбирается индивидуально
int tresh = 700;
// Для отладки. Потом можно убрать
boolean debug;
void setup()
{
// Режимы светодиодов
pinMode(ledOUT1, OUTPUT);
pinMode(ledOUT2, OUTPUT);
pinMode(ledOUT3, OUTPUT);
digitalWrite(ledOUT3, LOW);
// Передача
Serial.begin(9600);
}
void loop()
{
// Для отладки. Потом можно убрать
debug = false;
// Начальные значения сенсоров
sens1 = false;
sens2 = false;
// Считываем значение с фоторезисторов
sensorVal1 = analogRead(sensorPin1);
sensorVal2 = analogRead(sensorPin2);
// Если фоторезистор сработал, переводим в значение сенсора TRUE
if (sensorVal1<tresh) sens1 = true; debug = true;
if (sensorVal2<tresh) sens2 = true; debug = true;
// Если сработал первый,
if (sens1)
{
//зажигаем первый светодиод
digitalWrite(ledOUT1, HIGH);
}
else digitalWrite(ledOUT1, LOW);
// Если второй,
if (sens2)
{
//зажигаем второй светодиод
digitalWrite(ledOUT2, HIGH);
}
else digitalWrite(ledOUT2, LOW);
// Состояние сенсоров (фоторезисторов)
{
// Здесь текущий статус (состояние) фоторезисторов превращается в предыдущий
status_prev = status_curr;
// Здесь определяется текущий статус (--), (-+), (++), (+-)
if (sens1 == false && sens2 == false) status_curr = 0;
if (sens1 == true && sens2 == false) status_curr = 1; debug = true;
if (sens1 == true && sens2 == true) status_curr = 2; debug = true;
if (sens1 == false && sens2 == true) status_curr = 3; debug = true;
}
// При переходе с предыдущего состояния к текущему (если состояние датчиков
//изменилось), в нашем случае может произойти 8 вариантов развития событий.
//Нас интересуют события 3 и 7 (остальные так, на всякий...)
{
if (status_prev == 0 && status_curr == 1) event = 1;
if (status_prev == 0 && status_curr == 3) event = 5;
if (status_prev == 1 && status_curr == 2) event = 2;
if (status_prev == 1 && status_curr == 0) event = 8;
if (status_prev == 2 && status_curr == 3) event = 3;
if (status_prev == 2 && status_curr == 1) event = 7;
if (status_prev == 3 && status_curr == 0) event = 4;
if (status_prev == 3 && status_curr == 2) event = 6;
// Если текущее состояние не отличается от предыдущего, то никаких событий не произошло
if (status_curr == status_prev) return;
// Для отладки. Потом можно убрать
if (debug) Serial.println ("Previous Status = " + String(status_prev));
if (debug) Serial.println ("Current Status = " + String(status_curr));
if (debug) Serial.println ("Event = " + String(event));
}
// Считаем хьюманов...
{
if (debug) Serial.println ("Human count in room WAS : " +String(humanCount) );
if (event == 3) humanCount++;
if (event == 7) humanCount--;
humanCount = max(humanCount, 0);
if (debug) Serial.println ("Human count in room NOW : " +String(humanCount) );
}
// ...и зажигаем
{
if (humanCount > 0) digitalWrite(ledOUT3, HIGH);
else digitalWrite(ledOUT3, LOW);
}
}
|
|
|
|
| Здесь присутствуют: 6 (пользователей: 0 , гостей: 6) | |
|
|