Всем привет! Я использую 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 Как всегда, буду ооочень рад если кто-то сможет помочь. Заранее спасибо)
Да, учтено, я тестировал датчик в закрытом помещении, где ИК излучения не могло быть (т.е., никакими пультами или другими ИК устройствами никто не пользовался), при воздействии обычного света лампы. Результат тот же. Плюс ко всему, в скетче включал вывод только видимого спектра.
Так не бывает. ИК излучение есть всегда. Вопрос в его в спектре. Впрочем, с видимым светом такой же вопрос))