Фоторезистор

Тема в разделе "Arduino & Shields", создана пользователем funyfizik, 9 окт 2014.

  1. funyfizik

    funyfizik Нерд

    Добры вечер всем) подскажите, на сколько падает напряжение на ардуино уно в цепи с фоторезиком? В пределах от чего до чего? Стандартный Фоторезистор из набора. Если я буду считывать аналоговым входом на плате будет меняться в темноте от 0 до 1024 на свету?
     
  2. Unixon

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

    Без схемы цепи вопрос не имеет смысла.
     
  3. funyfizik

    funyfizik Нерд

    Схема проста,
     

    Вложения:

  4. funyfizik

    funyfizik Нерд

    А0 это аналоговый вход, им я и считываю показатель
     
  5. ets

    ets Нерд

    Я занимался этим вопросом, когда решал эту схему. Вот мои выводы исходя из формулы делителя напряжения и номинала резистора. Если хочешь подключить резистор другого номинала, тогда уже считай сам и выводи диапазон значений по данной методике.

    В данном случае видно, что при резисторе в 100 кОм диапазон 110 – 853, а при 10 кОм 557 – 1004.
     

    Вложения:

    Дмитрий 07 и funyfizik нравится это.
  6. funyfizik

    funyfizik Нерд

    Спасибо большое) попробую
     
  7. funyfizik

    funyfizik Нерд

    А минимальное сопротивление оно в тени? или наоборот?
     
  8. funyfizik

    funyfizik Нерд

    Добрый вечер, я ламер. Извините за столь глупый вопрос, но почему при выполнении этой программы Условия If - перебираются и выполняются? Ошибка в чем? Пытаюсь считать показания с фоторезистора и вывести соответствующую цифру согласно поделенным показателям.... показания от 555..1000

    Прошу прощения, не пойму где запутался....(((((((((((

    Код (Text):

    void setup()
    {
     pinMode(2, OUTPUT); // Пищалка (в принципе не нужна)
     pinMode(A0, INPUT); // Аналоговый вход для считывания показания

    pinMode(3, OUTPUT); // цифорвые выходы питающие светодиодную цифру
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    digitalWrite(3, LOW);  // Заведомо выключенны
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    }

    void loop()

    {
      if (900 > analogRead(A0) < 1000) {
          digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);
      }
     //////////////////////////////////////////////// 9
        if (850 > analogRead(A0) < 900) {
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(3, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);
      }
     /////////////////////////////// 8
        if (700 > analogRead(A0) < 850) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        tone(2, analogRead(A0), 20);
        delay(500);
      } /////////////////////////////// 7
          if (650 > analogRead(A0) < 700) {
        digitalWrite(3, HIGH);
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(6, LOW);
        digitalWrite(9, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 6
        if (600 > analogRead(A0) < 650) {
        digitalWrite(3, LOW);      
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        digitalWrite(7, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(8, HIGH);  
         tone(2, analogRead(A0), 20);
         delay(500);

      } /////////////////////////////// 5
          if (580 > analogRead(A0) < 599) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);  
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
        digitalWrite(9, HIGH);
        digitalWrite(8, HIGH);  
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 4
            if (569 > analogRead(A0) < 579 ) {
        digitalWrite(3, LOW);      
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(6, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(5, HIGH);    
        digitalWrite(4, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 3
          if (556 > analogRead(A0) < 568) {
        digitalWrite(3, HIGH);
        digitalWrite(4, HIGH);  
        digitalWrite(5, LOW);
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        digitalWrite(6, HIGH);  
        tone(2, analogRead(A0), 20);  
        delay(500);

      } /////////////////////////////// 2
        if (550 > analogRead(A0) < 555) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);    
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);  
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 1  
    }

     
     
    Последнее редактирование: 10 окт 2014
  9. geher

    geher Гуру

    if (900 > analogRead(A0) < 1000) - забавная конструкция, и притом синтаксически правильная.
    А по факту она означает следующее: сравниваем 900 и то, что возвращает analogRead(A0). Результат сравнения, если не ошибаюсь, равен 1 (в любом случае, что-то не равное 0) в случае выполнения условия (вернулось меньше 900) или 0 в случае невыполнения условия.
    Данный результат сравнивается с 1000, что в итоге всегда верно.
    Насколько я себе представляю задуманное, то надо оформлять это дело так:

    int ar_rc=analogRead(A0);
    if ((900<ar_rc)&&(ar_rc<1000))

    В других if то же самое.
    Только считывание из A0 нужно только одно, перед первой проверкой.
    Кроме того, чтобы избежать лишних вычислений можно воспользоваться else
    Примерно так:

    int ar_rc=analogRead(A0);
    if ((900<ar_rc)&&(ar_rc<1000)) {
    ...
    } else if ((800<ar_rc)&&(ar_rc<901)) {
    ...
    } else if ((700<ar_rc)&&(ar_rc<801)) {
    ...
    }
     
    funyfizik нравится это.
  10. funyfizik

    funyfizik Нерд

    Спасибо, я точно знал что запутался, а ведь это основы млин(( СПАСИБО ЕЩЕ РАЗ
     
  11. funyfizik

    funyfizik Нерд


    можешь пояснить почему мой вариант не сработал, хотя вроде с точки зрения логики правильно все. До этого я кодил на делфи
     
  12. Unixon

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

    Ну в Delphi тоже нужно было бы написать

    if 900 > analogRead(A0) and analogRead(A0) < 1000 then begin
    end;
     
  13. funyfizik

    funyfizik Нерд

    Проверил, сделал сравнение иное чем было у меня, в итоге имею аналогичную ситцацию, все выражения верны и программа переключает цифры по очереди так, будто все они истина. Вот код
    Код (Text):
    void setup()
    {
    pinMode(2, OUTPUT); // Пищалка (в принципе не нужна)
    pinMode(A0, INPUT); // Аналоговый вход для считывания показания
    pinMode(3, OUTPUT); // цифорвые выходы питающие светодиодную цифру
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    digitalWrite(3, LOW);  // Заведомо выключенны
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);
    }

    void loop()

    {
    int result;
    result = analogRead(A0);
     
    if ((901 > result) && (result < 1004)) {
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);
      }
    //////////////////////////////////////////////// 9
     
    if ((851 > result) && (result < 900)) {
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(3, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);
      }
    /////////////////////////////// 8
     
      if ((701 > result) && (result < 850)) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        tone(2, analogRead(A0), 20);
        delay(500);
      } /////////////////////////////// 7
     
    if ((651 > result) && (result < 700)) {
        digitalWrite(3, HIGH);
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(6, LOW);
        digitalWrite(9, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 6
     
    if ((600 > result) && (result < 650)) {
        digitalWrite(3, LOW);    
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        digitalWrite(7, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(8, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 5
     
    if ((580 > result) && (result < 599)) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
        digitalWrite(9, HIGH);
        digitalWrite(8, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 4
     
    if ((569 > result) && (result < 579)) {
        digitalWrite(3, LOW);    
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(6, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(5, HIGH);  
        digitalWrite(4, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 3
     
    if ((559 > result) && (result < 568)) {
        digitalWrite(3, HIGH);
        digitalWrite(4, HIGH);
        digitalWrite(5, LOW);
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        digitalWrite(6, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 2
     
      if ((554 > result) && (result < 558)) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);  
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 1
    }
     
  14. geher

    geher Гуру

    Если все условия срабатывают, это означает. что из А0 считывается что-то меньшее, чем 554.
    Собственно говоря, любое условие из представленных в последнем коде выглядит странно.
    Возьмем, например, последнее
    ((554 > result) && (result < 558))
    Получается, что значение result проверяется на то, что оно меньше 554 и меньше 558.
    Т.е условие истинно, если result меньше 554.
    Логичнее было бы изменить оператор в первой паре скобок на <
    Т.е.
    ((554 < result) && (result < 558))
    Вот тогда условие будет истинным, если result между 554 и 558.

    PS. Еще один момент.
    На границах диапазонов ни один if не сработает. При использованных значениях границ логичнее использовать операторы <=, которые позволят включить границы в диапазон.
     
    Последнее редактирование: 10 окт 2014
  15. geher

    geher Гуру

    Если не ошибаюсь, то надо еще скобки расставить. В Delphi вроде and имеет тот же приоритет, что и операции сравнения.
    if (900 < analogRead(A0)) and (analogRead(A0) < 1000) then
     
  16. funyfizik

    funyfizik Нерд

    На деле практике получился разброс от 350 - при ярком свете и до 1024 - когда темно.
    В теории должно было быть от 555 до 1005......
    Это все зависит от материалов изготовления и т д, правильно я понимаю?


    А вот рабочий код
    Код (Text):


    void setup()
    {
    pinMode(2, OUTPUT); // Пищалка (в принципе не нужна)
    pinMode(A0, INPUT); // Аналоговый вход для считывания показания
    pinMode(3, OUTPUT); // цифорвые выходы питающие светодиодную цифру
    pinMode(4, OUTPUT);
    pinMode(5, OUTPUT);
    pinMode(6, OUTPUT);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);

    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);  // Заведомо выключенны
    }


    void LedOff()    // Отключение светодиодов на случий прерывания сигнала с А0
    {
    digitalWrite(3, LOW);
    digitalWrite(4, LOW);
    digitalWrite(5, LOW);
    digitalWrite(6, LOW);
    digitalWrite(7, LOW);
    digitalWrite(8, LOW);
    digitalWrite(9, LOW);

    }



    void loop()

    {


    int result;
    result = analogRead(A0);

      if ((1000 <= result) && (result <= 1024)) {
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(3, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);
      } //////////// 0
        else {
    LedOff();
        }

    if ((0 <= result) && (result <= 350)) {
        digitalWrite(3, LOW);
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);
      }
      else {
    LedOff();
      }
    //////////////////////////////////////////////// 9

    if ((351 <= result) && (result <= 450)) {
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(3, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);
      }
        else {
    LedOff();
      }
    /////////////////////////////// 8

      if ((451 <= result) && (result <= 550)) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        tone(2, analogRead(A0), 20);
        delay(500);
      } /////////////////////////////// 7
        else {
    LedOff();
      }

    if ((551 <= result) && (result <= 650)) {
        digitalWrite(3, HIGH);
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(8, HIGH);
        digitalWrite(7, HIGH);
        digitalWrite(6, LOW);
        digitalWrite(9, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 6
        else {
    LedOff();
      }

    if ((651 <= result) && (result <= 750)) {
        digitalWrite(3, LOW);  
        digitalWrite(4, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(6, LOW);
        digitalWrite(7, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(8, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 5
        else {
    LedOff();
      }

    if ((750 <= result) && (result <= 850)) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
        digitalWrite(9, HIGH);
        digitalWrite(8, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 4
        else {
    LedOff();
      }

    if ((851 <= result) && (result <= 950)) {
        digitalWrite(3, LOW);  
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(6, HIGH);
        digitalWrite(9, HIGH);
        digitalWrite(5, HIGH);
        digitalWrite(4, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 3
        else {
    LedOff();
      }

    if ((951 <= result) && (result <= 1000)) {
        digitalWrite(3, HIGH);
        digitalWrite(4, HIGH);
        digitalWrite(5, LOW);
        digitalWrite(7, HIGH);
        digitalWrite(8, LOW);
        digitalWrite(9, HIGH);
        digitalWrite(6, HIGH);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 2
        else {
    LedOff();
      }

      if ((1001 <= result) && (result <= 1024)) {
        digitalWrite(3, LOW);
        digitalWrite(4, LOW);
        digitalWrite(5, HIGH);
        digitalWrite(6, HIGH);
        digitalWrite(7, LOW);
        digitalWrite(8, LOW);
        digitalWrite(9, LOW);
        tone(2, analogRead(A0), 20);
        delay(500);

      } /////////////////////////////// 1
        else {
    LedOff();
      }
    }
    Фото: https://yadi.sk/i/syKQF-0Mbvkxx

    загрузил на яндекс диск, загрузить сюда не получилось

    Получилось что, при выключенном свете горит 0, при нарастании света вокруг датчика показатель растет до 9, не знаю для чего это можно и нужно ли использовать, но оно работает
     
  17. ets

    ets Нерд

    Вот тут я теряюсь в догадках. При теоретических расчётах я руководствовался этими данными http://files.amperka.ru/datasheets/vt900.pdf - там есть фоторезистор из набора - VT90N2.
    Далее, ошибка в формуле явно маловероятна, её нам дают с пошаговым выводом в конспекте, да и в других источниках она та же.

    При подаче на аналоговый вход Arduino напряжение от 0 до 5 вольт конвертируется в одну из градаций от 0 до 1023. Верно? Значит и диапазон выведен правильно.

    Сейчас соберу твою схему, посмотрю
     
  18. ets

    ets Нерд

    Ну дела. У меня значения:
    1009 - максимум
    198 - минимум

    198 - это 0,96 В (светил фонариком прямо впритык к фоторезистору)

    А значит если вывести из этого сопротивление фоторезистора по формуле, оно составит 2,38 кОм
    Если опять обратиться к тех характеристикам, то там написано, что 12 кОм - это минимальное сопротивление при 10 Лк. Наверное, фонарик обладает большим уровнем освещённости, чем это значение. К сожалению, не имею возможности измерять его свет в Люксах, т. к. нет приборов.

    Раз тех. описание молчит по этому поводу, значит было бессмысленно делать теоретический расчёт. Как всегда, победила практика.
     
  19. funyfizik

    funyfizik Нерд

    Явно видео, что теория редко совпадает с практикой. Все расчеты верны. Но у меня срабатывание от 350 идет.... Все зависит от качества и других физических параметров окр среды....