Диод горит в полсилы

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

  1. treds

    treds Нуб

    Купил матрёшку, разбираюсь. Делаю не как по инструкции, а дополнительно усложняя себе задачи. На этом этапе:
    http://wiki.amperka.ru/конспект-arduino:ночной-светильник
    столкнулся с небольшим недопониманием. Делаю вот это дополнительное задание: 2)Добавьте в схему еще один светодиод. Дополните программу так, чтобы при падении освещенности ниже порогового значения включался один светодиод, а при падении освещенности ниже половины от порогового значения включались оба светодиода.

    Проблема в том, что если я подключаю оба диода через цифровой выход, то второй горит в полсилы. Если сделать второй аналоговым, то всё впорядке, но тогда яркость диода нарастает при падении освещения. (оно и логично).

    У всех так? Это особенность Ардуино или кривой код? Получается, что 2 налаговых выхода не будут работать в полную силу?
     
  2. treds

    treds Нуб

    #define LED_PIN 12
    #define LDR_PIN A0
    #define POT_PIN A1
    #define LED2_PIN 9

    void setup()
    {
    pinMode(LED_PIN, OUTPUT);
    }

    void loop()
    {
    int lightness = analogRead(LDR_PIN);

    int threshold = analogRead(POT_PIN);

    boolean tooDark = (lightness < threshold);


    if (tooDark) {
    // ...включаем освещение
    digitalWrite(LED_PIN, HIGH);}
    else {
    digitalWrite(LED_PIN, LOW);
    } if (lightness < threshold/2) {
    analogWrite(LED2_PIN, 255);}else{ analogWrite(LED2_PIN, 0);}
    }

    Сейчас код имеет такой вид
     
  3. vvr

    vvr Инженерище

    В сетапе про второй светодиод забыли:)
     
    treds нравится это.
  4. treds

    treds Нуб

    Спасибо огромное!!!
    Странно, что вообще хоть как то работало)
    Вообще много у меня пробелов по электронике, доучившись до второго курса на специальности телекоммуникаций если бы не купил набор, так бы и не увидел резистор, транзистор...

    Удивляет, что когда убираешь минус иногда продолжает работать, но не стабильно, удивляет, что диод светится, если с одной стороны минус, а с другой.... палец:D

    Спасибо за набор, уважаемые разработчики;)
     
  5. vvr

    vvr Инженерище

    Вот и ардуина помогла расширить кругозор и увеличить багаж знаний, пригодится...
     
  6. AntonEryomin

    AntonEryomin Нуб

    Столкнулся с такой проблемой: не горит второй диод, если совсем темно (закрываю пальцем фоторезистор). Если вывод сделать сразу на оба диода, то они горят, т.е. схема собрана верна, явно проблема в коде.

    #define LED_PIN 12
    #define LED_PIN2 4
    #define LDR_PIN A0
    #define POT_PIN A1


    void setup()
    {
    pinMode(LED_PIN, OUTPUT);
    pinMode(LED_PIN2, OUTPUT);
    }

    void loop()
    {
    int lightness = analogRead(LDR_PIN);
    int threshold = analogRead(POT_PIN);
    if (lightness < threshold) {
    digitalWrite(LED_PIN, HIGH);
    } else {
    digitalWrite(LED_PIN, LOW);
    }
    if (lightness < threshold / 2) {
    digitalWrite(LED_PIN2, HIGH);
    } else {
    digitalWrite(LED_PIN2, LOW);
    }
    }

    Хотел заменить циклы немного иначе, но для наглядности пусть будут хотя бы так.
     
  7. Unixon

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

    Выведите в терминал значения переменных. Видимо, одно из условий не выполняется и при "нулевой" освещенности.
     
  8. AntonEryomin

    AntonEryomin Нуб

    Да вы правы, не попадает. Поменял немного код, добавив выводы в консоль и при 0 освещенности во втором блоке ничего не выводится, но мне все равно не ясно почему. В чем ошибка?

    #define LED_PIN 12
    #define LED_PIN2 4
    #define LDR_PIN A0
    #define POT_PIN A1


    void setup()
    {
    pinMode(LED_PIN, OUTPUT);
    pinMode(LED_PIN2, OUTPUT);
    Serial.begin(9600);
    }

    void loop()
    {
    int lightness = analogRead(LDR_PIN);
    int threshold = analogRead(POT_PIN);
    if (lightness < threshold) {
    digitalWrite(LED_PIN, HIGH);
    Serial.print(threshold);
    } else {
    digitalWrite(LED_PIN, LOW);
    }
    if (lightness < threshold / 2) {
    digitalWrite(LED_PIN2, HIGH);
    Serial.print(threshold);
    } else {
    digitalWrite(LED_PIN2, LOW);
    }
    }
     
  9. geher

    geher Гуру

    Чему равен threshold, и чему равна lightness при нулевой освещенности?
    Условие может не выполняться потому, что уровень на входе A0 в темноте оказывается выше половинного порога.
     
  10. AntonEryomin

    AntonEryomin Нуб

    А как лучше выводить значения? В самой IDE у меня все выводится в горизонтальную линию, я знаю что вывод содержит 4 знака, но все же.
     
  11. geher

    geher Гуру

    Serial.print("threshold=");Serial.println(threshold);
    Первый Serial.print выдаст поясняющую надпись
    ln во втором обеспечит перевод строки после выдачи значения параметра.
    Будет удобнее смотреть в мониторе последовательного порта Arduino IDE.