Проблема чтения данных из цифрового датчика освещенности tsl 2591

Тема в разделе "Arduino & Shields", создана пользователем Illaise, 19 фев 2021.

  1. Illaise

    Illaise Нерд

    Всем привет!
    Я использую Arduino UNO Wi-Fi Rev2 с TSL2591 (библиотека для TSL2591), чтобы проверить корректность значений яркости на ЖК-дисплее. Вот подробности:
    1. Схема подключения - (фото Schematic)
    2. Закрепил датчик в темной пластиковой бутылке и поставил рядом с экраном - (Фото Container)
    3. Мой код:
    Код (C++):
    #include <Wire.h>
    #include <Adafruit_Sensor.h>
    #include "Adafruit_TSL2591.h"

    Adafruit_TSL2591 tsl = Adafruit_TSL2591(2591); // pass in a number for the sensor identifier (for your use later)


    void setup() {
      Serial.begin(9600);
      //tsl.setGain(TSL2591_GAIN_MED);
      tsl.setGain(TSL2591_GAIN_HIGH);
      tsl.setTiming(TSL2591_INTEGRATIONTIME_300MS);

    }

    void loop(void)
    {
      uint16_t sens;
      int valueLight;
      if (Serial.available() > 0)
      {
        valueLight = Serial.parseInt();
        Serial.read();
        sens = tsl.getLuminosity(TSL2591_VISIBLE);
        Serial.println(sens & 0xFFFF, DEC);

        switch (valueLight)
        {
          case 12:
            if (sens > 1 && sens < 50)
            {
              Serial.println("SCREEN OFF: PASSED");

            } else if (sens > 51 && sens < 100)
            {
              Serial.println("ERROR: THE BACKLIGHT WORKS!");
            }
            else
            {
              Serial.println("SCREEN OFF: FAILED");
            }
            break;
          case 11:
            if (sens > 51 && sens < 10000)
            {
              Serial.println("SCREEN ON: PASSED");

            } else if (sens > 51 && sens < 100)
            {
              Serial.println("ERROR: THE SYSTEM DOES NOT RUN!");
            }
            else
            {
              Serial.println("SCREEN ON: FAILED");
            }
            break;
          case 10:
            if (sens > 6620 && sens < 6645)
            {
              Serial.println("BRIGHTNESS_100: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_100: FAILED");
            }
            break;
          case 9:
            if (sens > 5465 && sens < 5495)
            {
              Serial.println("BRIGHTNESS_90: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_90: FAILED");
            }
            break;
          case 8:
            if (sens > 4410 && sens < 4435)
            {
              Serial.println("BRIGHTNESS_80: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_80: FAILED");
            }
            break;
          case 7:
            if (sens > 3485 && sens < 3515)
            {
              Serial.println("BRIGHTNESS_70: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_70: FAILED");
            }
            break;
          case 6:
            if (sens > 2790 && sens < 2820)
            {
              Serial.println("BRIGHTNESS_60: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_60: FAILED");
            }
            break;
          case 5:
            if (sens > 2215 && sens < 2250)
            {
              Serial.println("BRIGHTNESS_50: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_50: FAILED");
            }
            break;
          case 4:
            if (sens > 1425 && sens < 1455)
            {
              Serial.println("BRIGHTNESS_40: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_40: FAILED");
            }
            break;
          case 3:
            if (sens > 835 && sens < 865)
            {
              Serial.println("BRIGHTNESS_30: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_30: FAILED");
            }
            break;
          case 2:
            if (sens > 230 && sens < 265)
            {
              Serial.println("BRIGHTNESS_20: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_20: FAILED");
            }
            break;
          case 1:
            if (sens > 385 && sens < 405)
            {
              Serial.println("BRIGHTNESS_10: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_10: FAILED");
            }
            break;
          case 0:
            if (sens > 95 && sens < 115)
            {
              Serial.println("BRIGHTNESS_0: PASSED");
            }
            else
            {
              Serial.println("BRIGHTNESS_0: FAILED");
            }
            break;
          case 30:
            if (sens > 142 && sens < 168)
            {
              Serial.println("BACKLIGHT_70: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_70: FAILED");
            }
            break;
          case 29:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_90: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_90: FAILED");
            }
            break;
          case 28:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_80: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_80: FAILED");
            }
            break;
          case 27:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_70: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_70: FAILED");
            }
            break;
          case 26:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_60: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_60: FAILED");
            }
            break;
          case 25:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_50: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_50: FAILED");
            }
            break;
          case 24:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_40: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_40: FAILED");
            }
            break;
          case 23:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_30: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_30: FAILED");
            }
            break;
          case 22:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_20: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_20: FAILED");
            }
            break;
          case 21:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_10: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_10: FAILED");
            }
            break;
          case 20:
            if (sens > 100 && sens < 105)
            {
              Serial.println("BACKLIGHT_0: PASSED");
            }
            else
            {
              Serial.println("BACKLIGHT_0: FAILED");
            }
            break;
          default:
            break;
        }
      }
      delay(500);
    }
    Изначально я проверил все значения датчиков на всех значениях яркости экрана (100, 90, 80, .... 0) и описывал диапазон значений датчика в switch cases. Итак, логика скетча следующая:
    1. Устанавливаем значение яркости экрана.
    2. Отправляем команду на последовательный порт.
    3. Получаем результат - если реальные значения датчика совпадают с ранее записанными значениями - результат Passed, если не совпадает - Failed.
    Я столкнулся с проблемой - через некоторое время или в результате отключения Arduino от источника питания, или повторной загрузки скетча, датчик показывает значения, отличные от тех, которые я записал ранее, при тех же внешних условиях (свет на него падает одинаковый).
    Для тестирования проблемы я загрузил стандартный скетч TSL2591 и проверил значения в течение 1 часа. Показания датчика постоянно растут или падают. Пример вывода Ардуино:
    Код (C++):
    2214
    2214
    2214
    2213
    2213
    .........
    2190
    .........
    2140
    Если убрать датчик от экрана, а затем снова поставить, значение станет правильным, но все равно потом будет расти или падать.
    Note 1
    Если использовать простой скетч для отображения введенных значений:
    Код (C++):
    void loop(void) // full code
      if (Serial.available() > 0)
      {
          int data = Serial.parseInt();
          Serial.println(data);
      }
    }
    Моя Arduino печатает введенное значение, а затем 0, выглядит это так:
    Код (C++):
    45
    0
    78
    0
    45
    0
    Также я обнаружил некоторые странности:
    1. В стандартном скетче TSL, в Void Setup (void) описана проверка подключения датчика
    Код (C++):
    Void setup(void)
    {
      Serial.begin(9600)
      Serial.println(F("Starting Adafruit TSL2591 Test!"));

      if (tsl.begin())
      {
        Serial.println(F("Found a TSL2591 sensor"));
      }
      else
      {
        Serial.println(F("No sensor found ... check your wiring?"));
        while (1);
      }

      /* Display some basic information on this sensor */
    Даже если отключить датчик, моя ардуино говорит, что он подключен
    Код (C++):
    Starting Adafruit TSL2591 Test!
    Found a TSL2591 sensor
    2. Я использовал Speed I2C Scanner для проверки проводов. И он показал, что подключилючено два устройства к I2C
    Код (C++):
    TIME DEC HEX   50 100 150 200 250 300 350 400 [KHz]
    12320 40 0x28   .  .   .   .   .   .   .   .
    12323 41 0x29   V  V   V   V   V   V   V   V
    12326 42 0x2A   .  .   .   .   .   .   .   .
    .............
    12471 94 0x5E   .      .       .       .       .        .       .        .
    12474 95 0x5F   .  .   .   .   .   .   .    .
    12477 96 0x60   V  V   V   V   V   V   V    V
    12479 97 0x61   .  .   .   .   .   .   .    .
    2 devices found in 322 milliseconds.
    3. При подключении TSL2891 к аналоговым A4 (SDA) и A5 (SCL) пинам, датчик не обнаруживается. В ардуино постоянно выводит в порт - 65535
    Как всегда, буду ооочень рад если кто-то сможет помочь.
    Заранее спасибо)
     

    Вложения:

    • Schematic.png
      Schematic.png
      Размер файла:
      387 КБ
      Просмотров:
      106
    • Container.jpg.jpg
      Container.jpg.jpg
      Размер файла:
      57,5 КБ
      Просмотров:
      115
  2. parovoZZ

    parovoZZ Гуру

    Датчик реагирует на ИК излучение тоже. Это учтено?
     
  3. Illaise

    Illaise Нерд

    Да, учтено, я тестировал датчик в закрытом помещении, где ИК излучения не могло быть (т.е., никакими пультами или другими ИК устройствами никто не пользовался), при воздействии обычного света лампы. Результат тот же. Плюс ко всему, в скетче включал вывод только видимого спектра.
     
    Последнее редактирование: 19 фев 2021
  4. parovoZZ

    parovoZZ Гуру

    Так не бывает. ИК излучение есть всегда. Вопрос в его в спектре. Впрочем, с видимым светом такой же вопрос))
     
  5. Illaise

    Illaise Нерд

    Я считывал значения всего спектра, ситуация та же((