Попытка измерить изменение уровня освещенности с течением времени

У меня есть два LDR, подключенных к Arduino Uno, и светодиод RGB в качестве выходного компонента. Два LDR расположены на разной высоте, чтобы можно было увидеть разницу в освещении между ними. Я хочу написать код на Arduino так, чтобы, если разница в освещении между двумя LDR не сильно менялась в течение 1 часа (т.е. оставалась одинаковой), светодиод RGB мигал. Я знаю, что для этого мне нужно использовать операторы if и else, но знает ли кто-нибудь, как я могу это закодировать, чтобы получить указанный выше оператор?

Спасибо

, 👍1

Обсуждение

сначала вам нужно иметь возможность читать значения LDR .... начните с чтения значения одного LDR и распечатайте значение в последовательный порт ..... когда вы добьетесь успеха, прочитайте значения двух LDR и распечатать их значения в последовательный порт, @jsotola

Необходимый алгоритм сильно зависит от того, что вы действительно хотите обнаружить. Представьте себе следующую установку: ваши датчики расположены в двух темных коробках, а в первую коробку вы кладете фонарик. Через полчаса вы достаете фонарик и кладете его во вторую коробку. Каждую минуту, глядя на оба датчика, вы получите полный максимум часа. разница. За весь час оба датчика увидели одинаковое количество света. Чтобы помочь вам, было бы хорошо, если бы вы предоставили немного больше информации о том, каковы ваши варианты использования., @RJPlog


1 ответ


2

Разбейте это на части. Решайте детали по одному.

Напишите код, который считывает данные двух фотоэлементов и вычисляет разницу между ними. Запишите эту разницу в консоль.

Затем добавьте глобальную переменную, чтобы запомнить старую разницу и максимальную разницу. Каждый раз, когда вы снимаете новый набор показаний и рассчитываете разницу, сравнивайте ее со старой разницей. Если новая разница больше старой, обновите максимальную разницу. Затем обновите «старую разницу» новым чтением.

Выясните, как использовать millis() для записи времени начала и отслеживать разницу показаний, пока не пройдет час. Если разница показаний ниже порога «большой суммы», начните мигать индикатором.

Затем вам нужно решить, что делать со временем, превышающим час. Отслеживаете ли вы максимальную разницу за последние 60 минут и мигаете ли вы, если она ниже вашего порога? Может быть, сохранить разницу, считываемую каждые 5 минут, в кольцевой буфер с 12 записями (записей за час) и продолжать проверять кольцевой буфер на наличие значения разницы, превышающего ваш порог? (Вы должны иметь возможность поискать в Google «кольцевой буфер C» образец кода кольцевого буфера. На самом деле это довольно просто реализовать.

Возможно, вы также захотите вычислить разницу скользящих средних и сравнить каждое значение с этим. Я рекомендую использовать экспоненциальную скользящую среднюю (EMA).

В моем проекте есть код, который использует EMA для расчета одного значения яркости, а не разницы, но идея та же. Вот отрывок из моего кода:

Определите глобальное значение:

float   photocellAverage =      0;

#define sampleCountToAverage 100  //Чем больше количество выборок, тем медленнее будет меняться среднее значение с каждым новым показанием.

Тогда

int photocellValue = analogRead(photocellPin);
photocellAverage -= photocellAverage / sampleCountToAverage;
photocellAverage += float(photocellValue)/sampleCountToAverage;

Для вас вы должны рассчитать значение разницы и EMA для этой разницы:

float   photocellDifferenceAverage =      0;

int photocell1Value = analogRead(photocell1Pin);
int photocell2Value = analogRead(photocell2Pin);
int photocellDifference = photocell1Value - photocell2Value;
photocellDifferenceAverage -= photocellDifferenceAverage / sampleCountToAverage;
photocellDifferenceAverage += float(photocellDifference)/sampleCountToAverage;
,

Мне нравится, как вы реализовали EMA. Могу ли я предложить для лучшего понимания изменить название разницы EMA с «photocellAverage» на «photocellDiffAvarage». Мне потребовалось несколько минут, чтобы понять, что контекст изменился во втором отрывке. Мне также интересно, почему вы инициализируете 0 вместо инициализации первого значения датчика/первой разницы. У вас есть для этого конкретная причина?, @RJPlog

Что касается не инициализации первым значением, то это лень. Мне следует иметь. В конце концов, он довольно быстро стабилизируется до того же значения., @Duncan C

Спасибо за ваш ответ, я не хочу раздражать, но не могли бы вы изменить photocellDifferenceAverage -= photocellAverage / sampleCountToAverage; to photocellDifferenceAverage -= photocellDifferenceAverage / sampleCountToAverage;? Или я так и не понял вашу конструкцию ;-)? Я попробовал это в Excel, на первый взгляд это похоже на элемент PT1. Является ли ваша EMA элегантным способом реализации элемента PT1 или есть математические различия?, @RJPlog

Я исправил вторую часть своего ответа. Должен признаться, я нашел код для EMA в Интернете и адаптировал его под свои нужды. Я недостаточно знаю базовую математику, чтобы сравнивать ее с элементом PT1. (Мне пришлось поискать в Google, чтобы узнать, что это такое.), @Duncan C