Чтение цифровых портов

Тема в разделе "Arduino & Shields", создана пользователем PAUK, 24 мар 2018.

Метки:
  1. Asper Daffy

    Asper Daffy Гик

    Знай.
     
  2. fogary

    fogary Гик

    ОК.

    Такой вопрос, приращение на 5 в первом цикле - это что бы яркость быстрее увеличилась, или что бы шаги увеличения яркости были более заметны?
    Если первое, не проще ли вернуть приращение на 1, но сократить задержку с 10 до 2 мс?
     
  3. fogary

    fogary Гик

    Вы не учитываете, что арифметика целочисленная. Например: 253 / 5 = 50; 50 * 5 = 250.
    С вещественными числами, оказывается, то же не все гладко.
     
  4. PAUK

    PAUK Нерд

    Так как раз это и нужно для приведения числа к кратному пяти.
     
    Gritsan нравится это.
  5. PAUK

    PAUK Нерд

    Где Вы это прочитали?
     
    Gritsan нравится это.
  6. parovoZZ

    parovoZZ Гуру

    Две пятерки должны сократиться. Ой, это уже алгебра=)
     
  7. PAUK

    PAUK Нерд

    А как тогда сделать кратность пяти. Например из числа 173 сделать 175 ?!
     
    Gritsan нравится это.
  8. parovoZZ

    parovoZZ Гуру

    Ну у тебя ж работает? Я, если честно, не знал, что компилятор не будет считать константы. Хотя, наверное, зависит от уровня выставленной оптимизации. В абдурино, наверное, не подкрутить её.
     
  9. AlexU

    AlexU Гуру

    Да, правильно у Вас сделано. Просто 'parovoZZ' иногда любит чушь нести.
     
    PAUK нравится это.
  10. PAUK

    PAUK Нерд

    По любому респект Вам ребята, Вы мне все очень помогли, если будут ещё какие нибудь предложения Я с удовольствием выслушаю, просто не нужно говорить то, чего сам не пробовал, дабы не ввести в заблуждение другого.
     
    Gritsan нравится это.
  11. Gritsan

    Gritsan Нерд

    Здравствуйте.
    Скетч от PAUK идеально подходит для меня, но так же мне необходимо менять яркость по фоторезистору.
    Может у кого то есть желание подсказать как правильно добавить в скетч, допустим вот этот код:
    Код (C++):
    t led = 13; //переменная с номером пина светодиода

    int ldr = 0; //и фоторезистора

    void setup() //процедура setup

    {

    pinMode(led, OUTPUT); //указываем, что светодиод - выход

    }

    void loop() //процедура loop

    {

    if (analogRead(ldr) < 800) digitalWrite(led, HIGH);

    //если показатель освещенности меньше 800, включаем светодиод

    else digitalWrite(led, LOW); //иначе выключаем

    }
    Но выключать мне светодиод не нужно как в коде выше. Все как у автора, но чтобы яркось менялась в зависимости от освещения и Плавный розжиг и затухание при включении выключении.

    Спасибо
     
    PAUK нравится это.
  12. PAUK

    PAUK Нерд

    Я сейчас как раз работаю на подобным проектом и по завершении могу поделится текстом :)
     
    Gritsan нравится это.
  13. Gritsan

    Gritsan Нерд

    Первая отличная новость за сегодняшний день. Буду очень благодарен)
     
  14. PAUK

    PAUK Нерд

    Ваш вопрос всё ещё актуален?
     
    Gritsan нравится это.
  15. Gritsan

    Gritsan Нерд

    С удовольствием протестировал бы скетч. Но через недельку, две. Улетаю в отпуск). Спасибо за ответ!!!
     
  16. PAUK

    PAUK Нерд

    Какой тип фоторезистора и как он подключён? При увеличении освещённости сопротивление увеличивается или уменьшается?
     
    Gritsan нравится это.
  17. Gritsan

    Gritsan Нерд

    Извиняюсь за долгий ответ.
    При увелечении освещенности сопротивление уменьшается.
    2мОм в темноте. 600 Ом яркий свет.
    Подключен вот так:
     

    Вложения:

    • 7схема.jpg
      7схема.jpg
      Размер файла:
      140,3 КБ
      Просмотров:
      24
    PAUK нравится это.
  18. PAUK

    PAUK Нерд

    Я написал под Вашу задачу следующий текст:

    Код (C++):

    const byte InPin = A0;            // вывод для подключения фоторезистора
    const byte PWMLedPin = 11;        // вывод для подключения светодиода
    const int onBrightness = 500;    // порог срабатывания от 0 до 1023
    const byte minBrightness = 20;    // минимальная яркость свечения от 0 до 255
    byte LedPWMValue;    // переменная для хранения данной яркости
    int Brightness;    // переменная для хранения нужной яркости

    void setup () {
        analogWrite(PWMLedPin, 0);  // запись начальной яркости в порт
    }

    void loop () {
      // считать уровень значения яркости:
      Brightness = analogRead(InPin);
      if (Brightness > onBrightness) {
      // привести десятибитное значение к восьмибитному:
      Brightness = map(Brightness, onBrightness, 1023, minBrightness, 255);
        }
      else {
      Brightness = 0;
      }
      // пока установленная яркость не равна требуемой будет выполнятся цикл:
      while (LedPWMValue != Brightness) {
        // если яркость меньше требуемой
        if (LedPWMValue < Brightness) {
          LedPWMValue += 1;   // значение яркости увеличивается на единицу
        }
        // если яркость больше требуемой
        if (LedPWMValue > Brightness) {
          LedPWMValue -= 1;   // значение яркости уменьшается на единицу
        }
      analogWrite(PWMLedPin, LedPWMValue);  // запись значения яркости в порт
      delay(4);   // время задержки до следующего шага
      }
    }
     
    Только нужно учитывать, что вывод "13" для подключения светодиода не годится, нужно использовать один из выводов с поддержкой ШИМ (значок ~ возле вывода).
    Порог срабатывания нужно подобрать опытным путём. Да и, фоторезистор с резистором нужно поменять местами - фоторезистор на общий провод, а резистор к +5В.
     
    Последнее редактирование: 7 ноя 2018
    Gritsan нравится это.
  19. Gritsan

    Gritsan Нерд

    Спасибо Вам PAUK . В ближайшее время протестирую. Да, конечно вывод поменяю.
     
    PAUK нравится это.
  20. PAUK

    PAUK Нерд

    Ещё хорошо бы избежать световой завязки между входом и выходом, разместив светодиод подальше от фоторезистора, что бы при включении света не засвечивать фоторезистор. Удачи Вам!
     
    Gritsan нравится это.