Регулятор освещенности.

Антон142
Offline
Зарегистрирован: 21.01.2016

К аналоговому входу подключен светорезистор с делитем, Получаю значения от 200 до 900 как получить однократную реакцию при достижения значения диапазона 1) 0-300, 500-600, 800-1024 ?

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

*фоторезистор

Например через условия if и флаги. Пример привести не могу, т.к. Вы не полностью расписали алгоритм действий. Реакция при достижения значения диапазона одинаковая у всех диапазонов или разная для каждого? Что должно быть при уменьшении значения? Снова выполнять однократно реакцию нижнего диапазона или нет? А если после уменьшения значения до предыдущего диапазона снова начнёт расти?

Антон142
Offline
Зарегистрирован: 21.01.2016

Реакция для каждого диапазона своя (Допустим три комбинации кнопок Alt+1, Alt+2, Alt+3 ) реакция только при смене диапазона и желательно с выдержкой в 5 мин.(защита от ложных срабатываний) но в это время ардуино должна обрабатывать  события на других входах. 

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

Пока без задержки, как-то так:

byte flag = 0;
int value = 0;

void setup() {

}

void loop() {
  value = analogRead(A0);//тут вписать свой пин A0 - A7
  if (value <= 300 && flag != 1)
  {
    //Сюда вставить действие 1
    flag = 1;
  }
  if (value >= 500 && value <= 600 && flag != 2)
  {
    //Сюда вставить действие 2
    flag = 2;
  }
  if (value >= 800 && flag != 3)
  {
    //Сюда вставить действие 3
    flag = 3;
  }    
}

 

Антон142
Offline
Зарегистрирован: 21.01.2016

Спасибо, работает!

Антон142
Offline
Зарегистрирован: 21.01.2016

Спасибо, работает!

Антон142
Offline
Зарегистрирован: 21.01.2016

Фильтр я подсмотрел вот какой 

int value2 = 0;
unsigned long currentTime;
unsigned long loopTime;
#define analogInPin A2           // Аналоговый вход
const byte averageFactor = 6;   // коэффициент сглаживания показаний , чем выше, тем больше "инерционность"

void setup()
{
  Serial.begin(9600);
  currentTime = millis();       // считываем время, прошедшее с момента запуска программы
  loopTime = currentTime;
}

void loop()
{
  currentTime = millis();                           // считываем время, прошедшее с момента запуска программы
  if (currentTime >= (loopTime + 400)) {            // сравниваем текущий таймер с переменной loopTime + 0,4 секунда
    {
      int oldsensorValue = value2;
      value2 = analogRead(analogInPin); // Считываем показания датчика
      value2 = (oldsensorValue * (averageFactor - 1) + value2) / averageFactor;      // <новое среднее> = (<старое среднее>*19 + <текущее значение>) / 20
      delay(2);
    }
    loopTime = currentTime;                         // в loopTime записываем новое значение
  }

  Serial.print("sensor = " );
  Serial.println(value2);
}

Я не особо понимаю как он работаеть но суть в том, что мы считываем показания каждые 0,4 секунды а потом усредняем их. 

Это дает около 5 секунд инертности при переходе  из среднего состояния в крайнее.