Ошибка в библиотеке датчика освещенности Troyka Light

Тема в разделе "Arduino & Shields", создана пользователем logomind, 25 окт 2017.

  1. logomind

    logomind Нерд

    Чтение значения датчика возвращает отрицательные значения: -2571,-3049 и т.п.

    Платформа Seeeduino Cloud (аналог Arduino Yun)
    Использую библиотеку TroykaLight.h
    отсюда https://github.com/amperka/TroykaLight

    Схема работы через объект
    Код (C++):
       LIGHT sensorLight(SENSOR_PIN);
     
    и чтение посредством
    Код (C++):
       val += sensorLight.readLight();
     
    Немало помучившись, нашел проблему в файле библиотеки TroykaLight.cpp

    Строка
    Код (C++):
       sensorValue = sensorValue >> 5;
     
    вызывает ошибку.
    Если заменить на примитивное
    Код (C++):
       sensorValue = sensorValue / SAMPLE_TIMES;
     
    получаются похожие на правду значения.
    Почему так получается? Действительно в библиотеке ошибка или она возникает где-то ещё?

    Главный вопрос:
    Как работать с датчиком, чтобы получать не абстрактные результаты? Или это невозможно в принципе?
    Может быть есть библиотеки от разработчиков? (Библиотеку для Iskra JS не предлагать. Самого кода я нигде не нашел)

    Уверен, что проблема решена не полностью и значения далеки от правды. Люксметра у меня нет.
     
    Последнее редактирование: 26 окт 2017
  2. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

     
  3. sdfg

    sdfg Гик

    был бы люксметр можно было бы не морочиться, синхронизироать, заполонить формулу и всё
     
  4. sdfg

    sdfg Гик

    PS просто отклонения в самом датчике как вариант не берем, обязательно валим всё на библиотеку на амперку
     
  5. logomind

    logomind Нерд

    Отклонения быть не может, выборка в самой библиотеке из 32 чтений, плюс в самом коде я делал от 10 таких запросов.
     
  6. BAR__MEN

    BAR__MEN Вселенский Няш Администратор

    Ну зачем использовать библиотеку???Вот код, посмотрите с ним:
    Код (C++):
    //Пин для подключения фоторезистора
    const int LxPin = A0;
    //Переменные для работы с п.п фоторезистора
    unsigned short adc_value = 0;
    double volt, resistor,lx;
    void setup() {
      Serial.begin(9600);
    }

    void loop() {
        Serial.print("Lx=");
        Serial.print(((int)LxOutput));
        Serial.println("---------------");
        delay(1000);
    }
    float LxOutput()  {
      adc_value = analogRead(LxPin);
      volt = 5.0*(adc_value/1024.0);
      resistor = (10.0*5.0)/volt-10.0;
      lx = 223.35*pow(resistor,-10/8);
      return lx;
    }
     
    Tomasina нравится это.
  7. logomind

    logomind Нерд

    Спасибо. Но ваш код вообще не работает. Значение volt всегда ноль.

    Изменив строку
    Код (C++):
      volt = 5.0*(adc_value/1024.0);
     
    на
    Код (C++):
            volt = 5.0*((1024.0-adc_value)/1024.0);
     
    (чем меньше значения тем выше освещенность)

    получились какие-то положительные значения, но все равно разница между вашим кодом и библиотекой в 7 раз. Причем оба явно неточные.

    Установка свежего датчика(старый проработал меньше полугода) дало разницу в освещённости в 2 раза.

    Пришел к выводу, что датчик неспособен измерять абсолютную освещенность, только относительную.
     
  8. b707

    b707 Гуру

    Исходники библиотеки доступны, достаточно посмотреть код метода readLight(), чтобы убедиться, что он не может возвращать отрицательных значений.

    Строки sensorValue = sensorValue >> 5; и sensorValue = sensorValue / SAMPLE_TIMES; - абсолютно эквивалентны, от замены одной на другую ничего меняться не должно.

    Вывод - Ищите ошибку в своем коде.
     
    arkadyf нравится это.
  9. logomind

    logomind Нерд

    Спасибо, я тоже удивился, что проблема в этой строке.

    Как в моем коде может быть ошибка, если всё решается заменой только этой части кода?

    Тут скорее какая-то разница в обработке этой команды моей платформой (то есть в отличии Seeeduino Cloud от Arduino Yun). Хотя я даже представить не могу какая.
     
  10. sdfg

    sdfg Гик

    а что я говорил, датчики не одинаковы что вы отвергли здесь
    я был прав (ну просто посудите сами КАК Н-НОЕ КОЛЛВО ЗАВОДОВ МОЖЕТ ВЫПУСКАТЬ АБСОЛЮТНО ОДИНАКОВЫЕ ДАТЧИКИ)
     
  11. logomind

    logomind Нерд

    Мы просто не поняли друг друга. Ваша фраза "отклонения в самом датчике" говорит мне о погрешности измерений от ОДНОГО датчика (что всегда есть и должно находиться в разумном диапазоне).

    А я в итоге говорил о конструкционных особенностях, не позволяющих проводить одинаковые измерения разными датчиками одной модельной линейки. Или если показания тотально изменяются через N часов работы.

    Это недоработка разработчиков и производителей. Если каждая новая партия пива, например, одной марки будет сильно отличаться по вкусу, крепости и качеству, то никто не будет доверять этому продукту.