Интересные показания с фоторезистора

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем haZe, 17 фев 2014.

  1. haZe

    haZe Нерд

    Добрый день!
    Положил фоторезистор на окно и каждую минуту писал его показания в базу данных. Теперь построил график. Результат очень интересный. Я ожидал увидеть более-менее ровный график, а он весь рваный. То есть получается, что показания постоянно колеблются в некой погрешности.
    Вопрос: почему показания колеблются, а не постоянные? Это нормально или нет? Как лучше стабилизировать: программно или можно как-то на уровне железа?
    График прилагаю. На графике чем ниже-тем темнее.
    Датчик лежит в комнате, направлен на улицу и стекло немного отражает свет, это можно увидеть.
    https://www.dropbox.com/s/mql7nabywqupkqu/Скриншот 2014-02-17 09.53.16.png
    Спасибо!
     
  2. Unixon

    Unixon Оракул Модератор

    Естественно, освещенность постоянно изменяется, просто глазом такие изменения не заметны. Зачем "стабилизоровать" эти показания? Конечно, можно посчитать плавающе среднее, если хочется показать среднюю освещенность за последние 5мин/полчаса/час.

    Нужно еще исключить возможность наводок по питанию и собственно на измерительную цепь: переключиться на внутренний источник опорного напряжения в 1.1V, поместить прибор в цельнометаллический корпус и запитать от батареек, на фоторезистор надеть бленду и закрепить ее перпендикулярно поверхности окна.
     
  3. haZe

    haZe Нерд

    Спасибо!
    Про наводки по питанию, я совсем забыл.
    А как переключится на внутренний источник питания? Я получаю данные с помощью raspberry pi. Может быть есть статья?
    Мне график рассвета напоминает игру Gravity Defied)))
     
  4. Unixon

    Unixon Оракул Модератор

    А, я думал у вас ардуинка. Про малину пока не в курсе. Вы через GertBoard работаете или как?
     
  5. haZe

    haZe Нерд

    В малине в комплекте идет АЦП, я методом научно-промышленного тыка научился им пользоваться и читаю показания с аналоговых датчиков. АЦП подключен к пирогу, а фоторезистор через делитель напряжения к АЦП. Что бы положить фоторезистор на окно пришлось сделать метровый провод, который лежит на столе и всем что есть на столе, а там розетка, вот и наводки. Но очень интересно, как можно вывести датчик на автономное питание, что бы получать точное показание. Я хочу выкинуть его за окно вместе с термодатчиком. Хотя на хабре есть интересный пост на эту тему, но я пока не имею столько знаний, что бы делать такие вещи)
     
  6. Unixon

    Unixon Оракул Модератор

    Ну я бы взял мелкий контроллер типа ATtiny13 (если не хочется заморачиваться так сильно, можно обойтись самой мелкой ардуиной) и его с фотодатчиком вынес на модуль. Связь и питание по экранированной витой паре, передача данных в цифре по SPI.
     
  7. haZe

    haZe Нерд

    Лан, буду изучать! Спасибо!
     
  8. Tomasina

    Tomasina Сушитель лампочек Модератор

    во-первых, наводки по питанию влияют на точность работы АЦП.
    Во-вторых, сам АЦП "плавает" в последних знаках, т.к. не используется AREF и ИОН.

    Но для твоих целей достаточно просто сглаживать результаты:
    Код (Text):
    // это поместить в начало
    float tempSensorA = 22.2;   // показания с датчика А
    byte averageFactor = 5;     // коэффициент сглаживания показаний температуры (0 = не сглаживать)

    // это в код перед получением показаний с датчиков
    float oldTempSensorA = tempSensorA;

    // это код получения температуры, (у тебя может быть другой)
    tempSensorA = sensors.getTempCByIndex(0);
    Serial.print("RAW temperature: ");
    Serial.println(tempSensorA);

    // это в код после получения показаний с датчиков
    if (averageFactor > 0 )    // если надо сглаживать показания // if не особо и надо, но если 0, то не тратим ресурсы понапрасну
      {
        Serial.println("Now averaging...");
        // <новое среднее> = (<старое среднее>*(k-1) + <текущее значение>) / k
        tempSensorA = (oldTempSensorA * (averageFactor - 1) + tempSensorA) / averageFactor;
        Serial.print("Averaged temperature: ");
        Serial.println(tempSensorA);
       }