Регулятор освещенности.
- Войдите на сайт для отправки комментариев
Пнд, 29/02/2016 - 11:29
К аналоговому входу подключен светорезистор с делитем, Получаю значения от 200 до 900 как получить однократную реакцию при достижения значения диапазона 1) 0-300, 500-600, 800-1024 ?
*фоторезистор
Например через условия if и флаги. Пример привести не могу, т.к. Вы не полностью расписали алгоритм действий. Реакция при достижения значения диапазона одинаковая у всех диапазонов или разная для каждого? Что должно быть при уменьшении значения? Снова выполнять однократно реакцию нижнего диапазона или нет? А если после уменьшения значения до предыдущего диапазона снова начнёт расти?
Реакция для каждого диапазона своя (Допустим три комбинации кнопок Alt+1, Alt+2, Alt+3 ) реакция только при смене диапазона и желательно с выдержкой в 5 мин.(защита от ложных срабатываний) но в это время ардуино должна обрабатывать события на других входах.
Пока без задержки, как-то так:
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; } }Спасибо, работает!
Спасибо, работает!
Фильтр я подсмотрел вот какой
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 секунд инертности при переходе из среднего состояния в крайнее.