Объясните по аналоговым входам

Тема в разделе "Arduino & Shields", создана пользователем StruM, 17 ноя 2015.

  1. StruM

    StruM Нуб

    Есть программка:
    Код (C++):
    // Подключаем библиотеку для работы с жидкокристаллическим
    // экраном (англ. Liquid Crystal Display или просто LCD)
    #include <LiquidCrystal.h>
    //Выводит сообщения, помогает при определинии
    //пороговых необходимых пороговых значений
    #define PRINT_MESSAGES

    // Задает используемые цифровые выходы
    #define CAMERA_FLASH_PIN 3
    #define LASER_PIN 4
    //Задает вход высоты (задержка)
    #define HEIGHT_PIN A0
    //Задает вход порогового значения срабатывания лазерного триггера
    #define LASER_THRESSHHOLD_PIN A1
    //Задает вход срабатывания на номер капли
    #define SET_NUMBER_DROP_PIN A2
    // Задает используемые аналоговые входы фоторезистора
    #define LASER_TRIGGER_ANALOG_PIN A3

    //Пороговые значения для срабатывания триггера
    //Определяются в зависимости от окружающих факторов

    //LASER_THRESHHOLD 813

    // Объявляем объект, для управления дисплеем. Для его создания
    // необходимо указать номера пинов, к которым он подключен в
    // порядке:       RS   E DB5 DB6 DB7 DB8
    LiquidCrystal lcd(13, 12, 11, 10,  9,  8);
    int NumberDrop=1;
    void setup()
    {

      // начинаем работу с экраном. Сообщаем объекту количество
      // строк и столбцов. Опять же, вызывать pinMode не требуется:
      // функция begin сделает всё за нас
      //lcd.begin(16, 2);


      pinMode(CAMERA_FLASH_PIN, OUTPUT);
      digitalWrite(CAMERA_FLASH_PIN, LOW);
      pinMode(LASER_PIN, OUTPUT);
      digitalWrite(LASER_PIN, HIGH);

      pinMode(HEIGHT_PIN, INPUT_PULLUP);
      pinMode(LASER_THRESSHHOLD_PIN, INPUT_PULLUP);
      pinMode(SET_NUMBER_DROP_PIN, INPUT_PULLUP);
      pinMode(LASER_TRIGGER_ANALOG_PIN, INPUT_PULLUP);


    #ifdef PRINT_MESSAGES
      Serial.begin(9600); // открыть серийный порт
    #endif
    }
    //void LcdDATA () //функция вывода на LCD дисплей
    //{
    // устанавливаем курсор, колонку 0, строку 0. На деле — это
    // левый квадрат 1-й строки, т.к. нумерация начинается с нуля
    //  lcd.setCursor(0, 0);
    //  lcd.print("Laser Scan:");
    //  lcd.print(laserVal, DEC);
    //  lcd.print("   ");
    // устанавливаем курсор, колонку 0, строку 1. На деле — это
    // левый квадрат 2-й строки, т.к. нумерация начинается с нуля
    //  lcd.setCursor(0, 1);
    //  lcd.print("FlashDelay:");
    //  lcd.print(SpeedDrop, DEC);
    //  lcd.print("   ");
    //  lcd.print("ms");
    //}
    void loop()
    {


      // считывание показаний потенциометра высоты (240) задержка
      int SpeedDrop = analogRead(HEIGHT_PIN);
      SpeedDrop = map(SpeedDrop, 0, 1023, 20, 300);
      SpeedDrop = constrain(SpeedDrop, 20, 300);
      // считывание показаний потенциометра чуствительности (813)
      int LASER_THRESHHOLD = analogRead(LASER_THRESSHHOLD_PIN);
      LASER_THRESHHOLD = map(LASER_THRESHHOLD, 0, 1023, 700, 900);
      LASER_THRESHHOLD = constrain(LASER_THRESHHOLD, 700, 900);
      // считывание показаний потенциометра количества капель (2)
      int SetNumberDrop = analogRead(SET_NUMBER_DROP_PIN);
      SetNumberDrop = map(SetNumberDrop, 0, 1023, 1, 10);
      SetNumberDrop = constrain(SetNumberDrop, 1, 10);
      int laserVal;




      ////////////////////////////////////////////////////////////
      // Лазерный сенсор
      ////////////////////////////////////////////////////////////

      laserVal = analogRead(LASER_TRIGGER_ANALOG_PIN);

      if (laserVal < LASER_THRESHHOLD)
      {

        NumberDrop = NumberDrop + 1;

        if (NumberDrop > SetNumberDrop)
        {
          delay(SpeedDrop);
          NumberDrop = 1;
          digitalWrite(CAMERA_FLASH_PIN, HIGH);
    #ifdef PRINT_MESSAGES
          Serial.println("Flash Triggered!!!");
    #endif
          delay(100);
          digitalWrite(CAMERA_FLASH_PIN, LOW);
        }
      }
    #ifdef PRINT_MESSAGES
      Serial.print("Laser: ");
      Serial.print(laserVal, DEC);

      Serial.print("Laser Threshhold: ");
      Serial.print(LASER_THRESHHOLD, DEC);

      Serial.print("NumbeDrop: ");
      Serial.print(NumberDrop, DEC);

      Serial.print("SetNumbeDrop: ");
      Serial.print(SetNumberDrop, DEC);

      Serial.print("Height: ");
      Serial.println(SpeedDrop, DEC);
    #endif

    }
    До того как сконфигурировал аналоговые порты как
    pinMode(HEIGHT_PIN, INPUT_PULLUP);
    было
    pinMode(HEIGHT_PIN, INPUT);
    все переменные регулировались одним резистором подключеным на любой из портов одновременно

    Почему?
     
  2. vvr

    vvr Инженерище

    вы с аналоговыми входами что то намудрили
    почитайте
    http://arduino.ru/Tutorial/AnalogInputPins

    pinMode(LASER_THRESSHHOLD_PIN, INPUT_PULLUP);
    pinMode(SET_NUMBER_DROP_PIN, INPUT_PULLUP);
    pinMode(LASER_TRIGGER_ANALOG_PIN, INPUT_PULLUP); - ВЫКИНУТЬ!!!!!!!!!!!!!!!!!
     
  3. StruM

    StruM Нуб

    Я ж объясняю.
    Когда я выкидываю этот код, то один резистор установленый на любой из этих портов регулирует их все вместе - параллельно,
    т.е. резистор на А0, но при его вращении происходит и изменемя по пинам А1 А2 А3.
    когда же включаю INPUT_PULLUP - все становится нормально - из за чего это может быть?
     
  4. Vetrinus

    Vetrinus Гик

    Captain mode=true;
    Может быть потому, что INPUT_PULLUP подключает внутренний подтягивающий резистор?
    Captain mode=false;
     
  5. StruM

    StruM Нуб

    Это я понял, но поченму не работает без подтягивающего?