Мигание ночника днём.

Тема в разделе "Arduino & Shields", создана пользователем Vovka41, 12 фев 2015.

  1. Vovka41

    Vovka41 Нерд

    Подскажите, в чём дело. Сделал "ночник" на простом принципе: на фоторезистор падает свет- светодиод не горит, не падает свет- светодиод горит. Вот урезанная версия.
    Код (Text):
    int ledPin= 9;
    int switcher=0 ;
    void setup ()
    {
    pinMode(ledPin, OUTPUT);
    // Serial.begin(9600);
    }

    void loop()
    {
      int data= analogRead(switcher);
    data= constrain (data, 400, 950 );
      int ledLevel= map(data,400, 950,  255,0);
      analogWrite(ledPin, ledLevel);
    }
    Но когда показания с резистора почти максимальны, светодиод начинает мигать(яркость меняется очень быстро), пока показания не станут равны >=950. В чём дело?
     
  2. X-Dron

    X-Dron Гик

    Из-за ШИМ. Это вам не непрерывный аналоговый сигнал.
    Попробуй так
    int ledLevel= map(data,400, 950, 255,100);
    if (ledLevel <= 100) ledLevel=100;
    analogWrite(ledPin, ledLevel);
    Или ставьте преобразователь ШИМ в напряжение.
    С аналоговыми входами советуют работать через #define. Оно и памяти в контроллере не занимает
    #define swither A0
    и с дискреткой, кстати, тоже.
     
    Последнее редактирование: 12 фев 2015
    Vovka41 нравится это.
  3. Vovka41

    Vovka41 Нерд

    Спасибо больше, теперь работает стабильно. Скажите, а в чём разница между объявлением "int swither= A0", и "#define swither A0", только что, вроде, памяти стало меньше есть, тогда куда эта переменная сохраняется?
     
  4. X-Dron

    X-Dron Гик

    Во первых, int swither= A0 сделать не удастся. A0 не является целочисленным значением :)
    #define - это директива препроцессора C
    Вот именно, что для хранения значения не создается переменная. Компилятор подставляет значение макроопределения
    Учите.
    https://ru.wikipedia.org/wiki/Препроцессор_Си
     
  5. Vovka41

    Vovka41 Нерд

    Благодарю Вас)