Урок 5. Первая программа. Функции управления вводом/выводом. Кнопка, светодиод.

Кнопка и светодиод

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

Предыдущий урок     Список уроков     Cледующий урок

Первая программа должна управлять светодиодом с помощью кнопки:

  • при нажатой кнопке светодиод светится;
  • при отжатой кнопке светодиод не светится.

 

Подключение кнопки и светодиода к плате Ардуино.

Для связи с внешними элементами в контроллере Arduino UNO существуют 14 цифровых выводов. Каждый вывод может быть определен программой как вход или выход.

У цифрового выхода есть только два состояния высокое и низкое. Высокое состояние соответствует напряжению на выходе порядка 5 В, низкое состояние – 0 В. Выход допускает подключение нагрузки с током до 40 мА.

Когда вывод определен как вход, считав его состояние, можно определить уровень напряжения на входе. При напряжении близком к 5 В (реально более 3 В) будет считано высокое состояние, соответствующее константе HIGH. При напряжении близком к 0 (менее 1,5 В) будет считано низкое состояние, или константа LOW.

Светодиод мы должны подключить к выводу, определив его как выход, а кнопка подключается к выводу с режимом вход.

Светодиод подключается через резистор, ограничивающий ток. Вот типичная схема.

Подключение светодиода
Резистор рассчитывается по формуле I = Uвыхода – Uпадения на светодиоде / R.

Uвыхода = 5 В, Uпадения на светодиоде можно принять равным 1,5 В (более точно указывается в справочнике). Получается, то в нашей схеме ток через светодиод задан на уровне 10 мА.

Можете выбрать любой вывод, но я предлагаю для простоты соединений использовать светодиод, установленный на плате. Тот самый, который мигал в первом тестовом примере. Он подключен к цифровому выводу 13. В этом случае дополнительный светодиод к плате подключать не надо.

Кнопку подключаем к любому другому выводу, например, 12. Аппаратная часть схемы подключения кнопки должна обеспечивать уровни напряжений 0 В при нажатой кнопке и 5 В при свободной. Это можно сделать простой схемой.

Подключение кнопки
При отжатой кнопке резистор формирует на выводе 5 В, а при нажатой – вход замыкается на землю. Рекомендации по выбору резистора я напишу в заключительном уроке про кнопки. Сейчас предложу другой вариант. Все выводы платы имеют внутри контроллера резисторы, подключенные к 5 В. Их можно программно включать или отключать от выводов. Сопротивление этих резисторов порядка 20-50 кОм. Слишком много для реальных схем, но для нашей программы и кнопки, установленной вблизи контроллера, вполне допустимо.

В итоге схема подключения будет выглядеть так.

Подключение кнопки
Кнопку можно припаять на проводах к разъему. Я установил ее на макетную плату без пайки. Купил специально для демонстрации уроков.

Подключение кнопки к Ардуино

Функции управления вводом/выводом.

Для работы с цифровыми выводами в системе Ардуино есть 3 встроенные функции. Они позволяют установить режим вывода, считать или установить вывод в определенное состояние. Для определения состояния выводов в этих функциях используются константы HIGH и LOW, которые соответствуют высокому и низкому уровню сигнала.

pinMode(pin, mode)

Устанавливает режим вывода (вход или выход).

Аргументы: pin и mode.

  • pin – номер вывода;
  • mode – режим вывода.
 mode = INPUT вывод определен как вход, подтягивающий резистор отключен
 mode = INPUT_PULLUP вывод определен как вход, подтягивающий резистор подключен
 mode = OUTPUT вывод определен как выход

Функция не возвращает ничего.

digitalWrite(pin, value)

Устанавливает состояние выхода (высокое или низкое).

Аргументы pin и value:

  • pin – номер вывода;
  • value – состояние выхода.
 value = LOW устанавливает выход в низкое состояние
 value = HIGH устанавливает выход в высокое состояние

Функция не возвращает ничего.

digitalRead(pin)

Считывает состояние входа.

Аргументы:  pin - номер вывода.

Возвращает состояние входа:

 digitalRead(pin) = LOW  низкий уровень на входе
 digitalRead(pin) = HIGH  высокий уровень на входе

Программа управления светодиодом.

С учетом предыдущего урока теперь у нас есть вся необходимая информация для написания программы. Программа в Ардуино состоит из двух функций setup() и loop. В setup() мы устанавливаем режимы выводов, а в loop() считываем состояние кнопки в переменную buttonState и передаем его на светодиод. По пути инвертируем, т.к. при нажатой кнопке низкое состояние сигнала, а светодиод светится при высоком.

/* Программа scetch_5_1 урока 5
   Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */
 
boolean buttonState;   // создаем глобальную переменную buttonState
   
 void setup() {
  pinMode(13, OUTPUT);        // определяем вывод 13 (светодиод) как выход
  pinMode(12, INPUT_PULLUP);  // определяем вывод 12 (кнопка) как вход
}

//  бесконечный цикл
void loop() {
  buttonState = digitalRead(12);  // считываем состояние 12 входа (кнопки) и записываем в buttonState
  buttonState = ! buttonState;    // инверсия переменной buttonState
  digitalWrite(13, buttonState);  // записываем состояние из buttonState на выход 13 (светодиод)
}

Для хранения промежуточного значения состояния кнопки создаем переменную buttonState с типом boolean. Это логический тип данных. Переменная может принимать одно из двух значений: true (истинно) или false (ложно). В нашем случае - светодиод светится и не светится.

Скопируйте или перепишите код программы в окно Arduino IDE. Загрузите в контроллер и проверьте.

Для сохранения проектов Ардуино я создал папку d:\Arduino Projects\Lessons\Lesson5. В каждом уроке программы называю scetch_5_1, scetch_5_2, … Вы можете поступать также или ввести свою систему сохранения файлов.

Блок программы:

buttonState = digitalRead(12);  // считываем состояние 12 входа (кнопки) и записываем в buttonState
  buttonState = ! buttonState;    // инверсия переменной buttonState
  digitalWrite(13, buttonState);  // записываем состояние из buttonState на выход 13 (светодиод)

можно записать без использования промежуточной переменной buttonState.

digitalWrite(13, ! digitalRead(12) );

В качестве аргумента для функции digitalWrite() выступает  функция digitalRead(). Хороший стиль это именно такой вариант. Не требуются дополнительные переменные, меньше текст.

Т.е. функцию можно использовать как аргумент другой функции. Функции можно вызывать из функций.

Другой вариант этой же программы, использующий условный оператор if.

/* Программа scetch_5_2 урока 5
   Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */
  
void setup() {
  pinMode(13, OUTPUT);        // определяем вывод 13 (светодиод) как выход
  pinMode(12, INPUT_PULLUP);  // определяем вывод 12 (кнопка) как вход
}

//  бесконечный цикл
void loop() {
  if ( digitalRead(12) == LOW ) digitalWrite(13, HIGH);
  else digitalWrite(13, LOW);
}

В бесконечном цикле проверяется состояние вывода 12 (кнопка), и если оно низкое (LOW), то на выводе 13 (светодиод) формируется высокое состояние (HIGH). В противном случае состояние светодиода низкое (LOW).

 

Директива  #define.

Во всех примерах для функций ввода/вывода мы указывали аргумент pin, определяющий номер вывода, в виде конкретного числа - константы. Мы помнили, что константа 12 это номер вывода кнопки, а 13 – номер вывода светодиода. Гораздо удобнее работать с символьными именами. Для этого в языке C существует директива, связывающая идентификаторы с константами, выражениями.

Директива #define определяет идентификатор и последовательность символов, которая подставляется вместо идентификатора, каждый раз, когда он встречается в тексте программы.

В общем виде она выглядит так:

#define имя последовательность_символов

Если в наших программах мы напишем:

#define LED_PIN 13     // номер вывода светодиода равен 13

то каждый раз, когда в программе встретится имя LED_PIN, при трансляции вместо него будет подставлены символы 13. Функция включения светодиода выглядит так:

digitalWrite(LED_PIN, HIGH);

Окончательный вариант программы с использованием #define.

/* Программа урока 5
   Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12) */
  
#define LED_PIN 13     // номер вывода светодиода равен 13
#define BUTTON_PIN 12  // номер вывода кнопки равен 12

void setup() {
  pinMode(LED_PIN, OUTPUT);    // определяем вывод 13 (светодиод) как выход
  pinMode(BUTTON_PIN, INPUT_PULLUP);  // определяем вывод 12 (кнопка) как вход
}

//  бесконечный цикл
void loop() {
  digitalWrite(LED_PIN, ! digitalRead(BUTTON_PIN) );
}

Обратите внимание, что после директивы #define точка с запятой не ставится, потому что это псевдо оператор. Он не совершает никаких действий.  Директива задает константы, поэтому принято имена для нее писать в верхнем регистре с разделителем – нижнее подчеркивание.

 

В следующем уроке будем бороться с дребезгом кнопки, разобьем программу на блоки и создадим интерфейс связи между блоками.

Предыдущий урок      Список уроков      Cледующий урок

4

Автор публикации

не в сети 10 часов

Эдуард

285
Комментарии: 1946Публикации: 198Регистрация: 13-12-2015

96 комментариев на «Урок 5. Первая программа. Функции управления вводом/выводом. Кнопка, светодиод.»

  1. Здравствуйте! Не совсем понял чем отличается директива #define от простого задания глобальной константы const int? или в ардуино такого нет?

    0
    • Здравствуйте!
      Директива #define просто заменяет при трансляции одну последовательность символов на другую.
      Строка #define TIME_BUTTON 12 означает, что везде где в тексте программы встретится имя TIME_BUTTON компилятор тупо заменит его на символы 12.

      0
  2. Здравствуйте, мне захотелось немного разнообразить первые уроки по ардуино и вот моя проблема: вроде бы ничего сложного, хочу что бы при нажатии кнопки (digitalRead(12) == LOW) светодиод на 13м пине моргнул несколько раз, пробую простейшее
    void loop() {
    if ( digitalRead(12) == LOW ) digitalWrite(13, HIGH);
    delay(300);
    digitalWrite(13, LOW);
    delay(300);
    digitalWrite(13, HIGH);
    delay(300);
    digitalWrite(13, LOW);
    }

    почему это не работает, ведь в описании функции сказано что она выполняет любое действие при истинном значении?. Как правильно написать код для такой простой ситуации?

    0
    • Здравствуйте! Действие оператора if распространяется только на следующий оператор или на блок операторов в скобках {}.

      Вам надо взять весь ваш блок в скобки.

      if ( digitalRead(12) == LOW ) {
      digitalWrite(13, HIGH);
      delay(300);
      digitalWrite(13, LOW);
      delay(300);
      digitalWrite(13, HIGH);
      delay(300);
      digitalWrite(13, LOW);
      }

      0
  3. Здравствуйте. Объясните почему выбрана схема при которой факту нажатия кнопки соответствует низкий уровень сигнала, а не высокий.

    0
    • Здравствуйте!
      Сигнал находящийся в высоком уровне меньше подвержен действию помех. Хороший стиль — выбирать активным низкое состояние сигнала. Поэтому лучше использовать схему с резисторами подтягивающими к + 5 В.

      0
  4. Здравствуйте. Моё любопытство мучает вопрос касаемо директивы #define. Можно ли используя её присвоить нескольким пинам одно имя в таком виде: #define LED_PIN 13,1,2. Или надо каждому пину присваивать отдельное имя.

    0
    • Здравствуйте!
      Если вы напишите #define LED_PIN 13,1,2, то в любом месте программы, при компиляции сочетание символов LED_PIN будет заменено на последовательность символов 13,1,2. Оператор define отработает, но компилятор выдаст ошибку. Он ждет число, а вы даете ему несколько чисел.

      0
      • Так, это я понял. А есть какие либо методы одновременного вывода одной функции на несколько портов-выводов? Или просто нужно продублировать код для каждой отдельной переменной, которой присвоен определённый порт-вывод?

        0
  5. данный вопрос меня интересует, т.к. требуется сделать параллельный вывод программным путём. Спаять (или скрутить) несколько проводов в один для меня не вариант.

    0
  6. Эдуард не совсем (точнее совсем) не могу представить электрическую схему данного урока в сборе. Например такой момент: мне видится что в схеме с кнопкой (схема №3) ток течет из pin12 в GND, но мы задаем тип вывода как ВХОД т.е. питание должно подаваться на него, а после входа (в плате) должна быть земля. Можно где-то посмотреть полную схему для этого урока для понимания течения тока. Или же вы сможете мне объяснить как-нибудь где я ошибаюсь и каких знаний мне не хватает? Возможно дадите ссылку на учебник для чайников где даются объяснения физики работы цифровых выводов.

    0
    • Здравствуйте!
      Схема N3 полностью эквивалентна предыдущей схеме, только резистор расположен внутри микроконтроллера. Это «подтягивающий» резистор сопротивлением 20-50 кОм. Ток течет по цепи 5 В (внутри микроконтроллера), подтягивающий резистор (внутри микроконтроллера), кнопка, земля. При разомкнутой кнопке потенциал поднимается до 5 В, при замкнутой — 0. Внутренний резистор имеет довольно высокое сопротивление. Поэтому, часто используют внешний, с низким сопротивлением (1 — 10 кОм), что повышает помехозащищенность.

      0
  7. Так же не понял со схемой питания диода на плате. В моем (наверняка дилетантском) понимании ток движется от источника в плате сначала к резистору потом к диоду, потом на клемму pin13. Соответственно что бы диод загорался от pin13 нужно кинуть проводок на GND.

    0
    • Выход микроконтроллера в состоянии логической 1 представляет собой источник напряжения 5 В. Ток течет по цепи 5 В (внутри микроконтроллера), вывод PIN13, резистор, светодиод, земля. Таким образом светодиод светится при высоком уровне на выходе PIN13.

      0
  8. На фоне 2х предыдущих реплик может сделать урок со схемой полностью вынесенной на макетную плату, а с pin модулировать источник питания, GRN уже есть на плате..

    pinMode(13,OUTPUT); //он будет источником питания.

    0
    • Станислав, не совсем понял, что значит «модулировать источник питания».
      Если у вас вопросы достаточно объемные вопросы, особенно требующие схем, картинок, то лучше открывайте тему на форуме сайта.

      0
      • Вы мне уже ответили «Выход микроконтроллера в состоянии логической 1 представляет собой источник напряжения 5 В» именно это я и имел ввиду.

        Спасибо за ответы! Немного начинаю разбираться. Перехожу в форум.

        0
  9. Здравствуйте.
    Не могу понять почему вот этот код
    void setup()
    {
    pinMode(13, OUTPUT);
    pinMode(12, INPUT_PULLUP);
    }
    void loop() {
    if(digitalRead(12) == LOW)
    digitalWrite(13, HIGH);
    else digitalWrite(12, LOW);
    }
    зажигает светодиод без нажатой кнопки, хотя с остальными примерами всё работает нормально

    0
  10. Доброго дня, Эдуард. Скажите, можно ли в Ардуино обратиться к порту целиком, а не к отдельным ногам. Например: как в атмелах — PORT B, PORT D

    0
  11. Добрый день!
    Извините за глупый вопрос.
    Не понимаю практичность директивы #define. Как мне представляется, при набивании (особенно при быстром) программы напечатать номер проще, чем НАЗВАНИЕ_ИМЯ, в котором к тому же можно допустить ошибку в одной из сток.
    Не могли бы Вы объяснить положительную сторону этой директивы?
    Спасибо.

    0
    • Здравствуйте!
      Представьте себе, что у вас программа, в которой вы в 10 местах считываете состояние вывода с определенным номером. А затем вы решили изменить вывод. При использовании #define вам надо поменять число только в одном месте. Без этой директивы вы будете лазить по программе и искать где происходят обращения к выводу.
      К тому же #define позволяет собрать константы, определяющие работу программы, в одном месте. Благодаря этому удобно конфигурировать программу под конкретные условия.
      Вот пример из урока 42. Это программа контроллера элемента Пельтье. Все эти параметры редактируются в начале программы. Представьте, что вам надо выискивать их и менять.

      #define Ver «1.1» // версия программы

      // адреса EEPROM
      #define EEPROM_SET_TEMP_REF 5 // заданная температура в камере
      #define EEPROM_MAX_SET_POWER 10 // заданная максимальная мощность

      // выводы
      #define ERROR_LED_PIN 13 // вывод светодиода ОШИБКА _-_
      #define VENT_PIN 10 // вывод вентилятор _-_

      #define powerU 12.11 // напряжение источника питания
      #define koeffU 0.01679 // массштабный коэффициент напряжения,
      // koeffU = 1.1 / R1 * (R1 + R2) / 1024 = 1.067/820*(820 + 12000)/1024 =0.01629 В/ед. АЦП
      #define koeffI 0.02148 // массштабный коэффициент тока
      // koeffI = 1,067 / R8 / 1024 = 0.02084 А/ед. АЦП

      #define koeffRegPwrInt 0.05 // интегральный коэффициент регулятора мощности
      #define DEAD_TIME 8 // мертвое время ШИМ (* 62,5 нс)
      #define koeffRegTmpInt 0.002 // интегральный коэффициент регулятора температуры
      #define koeffRegTmpPr 0.5 // пропорциональный коэффициент регулятора температуры
      #define koeffRegTmpDif 50. // дифференцирующий коэффициент регулятора температуры

      #define tempOnVent 30. // температура включения вентилятора
      #define tempOffVent 27. // температура выключения вентилятора

      #define MAX_POWER 10. // максимальная выходная мощность контроллера
      #define INC_MAX_POWER 1. // приращение максимальной выходной мощности при установке
      #define MAX_SET_TEMP 30. // максимальная заданная температура
      #define MIN_SET_TEMP -10. // минимальная заданная температура
      #define INC_SET_TEMP 0.1 // приращение заданной температуры при установке

      #define TIME_PRESS 40 // время удержания кнопок + и — для ускорения изменения параметра (* 20 мс)
      #define INC_BUTT_TIME 10 // время изменения параметров при удержании кнопки (* 20 мс)

      #define overHeatTemp 50. // температура перегрева радиатора

      #define MEASURE_PERIOD 10 // время периода измерения (* 2 мс)
      #define MAX_PWM 255. // максимальное значение ШИМ

      #define MEASURE_MIN_TEMP -40. // минимальная температура измерения
      #define MEASURE_MAX_TEMP 100. // максимальная температура измерения
      #define NUM_VER_TEMP_SEN 3 // число подтверждений ошибок датчиков температуры

      0
      • Добрый день!
        Спасибо большое за ответ. Про замену числа предельно ясно. А вот второй пример понятен не целиком, но думаю к 42 уроку прояснится.

        0
        • Здравствуйте. Насколько я понял, второй пример показывает, что легче менять параметры в начале программы, где они все по порядку расположены, чем искать эти параметры по всему коду.

          0
  12. Добрый день!
    Спасибо за интересные и познавательные уроки.
    Попробовал немного разнообразить пример на 2 кнопки и два светодиода, взял подпрограмму из примера выше, но получил, что при нажатии кнопки 2 , кнопка 3 либо не считывается либо есть задержка. Понятно , что пока не отработается подпрограмма не считывается кнопка 3. Можно ли , что бы кнопка 3 не зависела от нажатия кнопки 2?
    Спасибо.
    void setup() {
    pinMode(10, OUTPUT); // определяем вывод 10 (светодиод) как выход
    pinMode(11, OUTPUT);
    pinMode(2, INPUT_PULLUP); // определяем вывод 2 (кнопка) как вход подключаем встроенный резистор
    pinMode(3, INPUT_PULLUP);
    }

    // бесконечный цикл
    void loop() {
    if ( digitalRead(2) == LOW ) {
    digitalWrite(10, HIGH);
    delay(300);
    digitalWrite(10, LOW);
    delay(300);
    digitalWrite(10, HIGH);
    delay(300);
    digitalWrite(10, LOW);
    }
    else digitalWrite(10, LOW);
    if ( digitalRead(3) == LOW ) digitalWrite(11, HIGH);
    else digitalWrite(11, LOW);

    }

    0
    • Здравствуйте!
      В следующих нескольких уроках будет дан принцип обработки кнопок параллельно. Там никакой задержки не будет.

      0
  13. Здравствуйте. Подскажите, может ли повредится микросхема если ошибочно прописать
    pinMode(12, OUTPUT);
    digitalWrite(12, HIGH);
    на который подключена и нажата кнопка?

    0
    • Здравствуйте!
      Микроконтроллер не сгорит. В нем есть ограничение тока выходов. Неприятный режим, если одновременно несколько выходов перегружены. Микроконтроллер может перегреться. Вывод моментально сгорает если на него без ограничительного резистора подать напряжение выше напряжения питания на 0,7-1 В.

      0
      • Не понятно, почему он сгорит?
        И как именно идёт подключение: пин выдаёт +5в и мы его на землю соединяем или как?

        Поясните, пожалуйста (продублировав на email).

        0
  14. никак не получается упрвление кнопкой.
    запускаю такую конструкцию

    #define LED_PIN 7 // номер вывода светодиода равен 7
    #define BUTTON_PIN 2 // номер вывода кнопки равен 2

    void setup() {
    pinMode(LED_PIN, OUTPUT); // определяем вывод 7 (светодиод) как выход
    pinMode(BUTTON_PIN, INPUT); // определяем вывод 2 (кнопка) как вход
    }

    void loop() {
    if ( digitalRead(BUTTON_PIN) == LOW )
    {
    digitalWrite(LED_PIN, HIGH);
    }

    при загрузке скетча из урока 5 все работает хорошо,

    0
  15. Очень часто в примерах работ в инете вместо дерективы #define вижу использование переменной int для указания пина. Типа: int buttom = 7; // Кнопка на пине 7.
    Причем таким методом пользуются вполне серьезные ребята! Целых два байта в топку! А если кнопок и различных устройств на каждом пине?.. Верх расточительства! ))

    0
    • Здравствуйте!
      Согласен с вами. Я думаю, что многие используют подход к программированию на компьютерах, где ресурсы практически бесконечны. Когда я пишу программу для персонального компьютера я тоже не задумываюсь о минимизации разрядности переменных, оптимизации вычислений и т.п.

      0
  16. void loop() {
    digitalWrite(LED_PIN, ! digitalRead(BUTTON_PIN) );
    }
    Подскажите как тут понять почему зажигается светодиод? Что означает ! — эта команда?

    0
    • Здравствуйте!

      digitalRead(BUTTON_PIN) — чтение состояния вывода кнопки;

      ! digitalRead(BUTTON_PIN) — чтение и инверсия состояния кнопки. Состояние вывода при нажатой кнопке «низкое», а светодиод зажигается при «высоком». Поэтому нужна инверсия.

      digitalWrite(LED_PIN, ! digitalRead(BUTTON_PIN) ); — запись инверсного состояния кнопки на вывод светодиода.

      0
  17. Спасибо.
    digitalWrite(LED_PIN, ! digitalRead(BUTTON_PIN) );
    Просто не много не понятно было т.к токо начал изучать ардуино.

    0
  18. Подскажите что еще можно почитать для изучения програмирования ардуино? Именно для совсем плохо разбирающихся. Спасибо за отзыв!

    0
  19. Может подскажете, как лучше подключить 63 кнопки (по 3 на пульте) на длинные провода?

    0
          • А как сделать передачу по последовательному каналу?
            В принципе нужно как-то подключить 21 пульт (каждый имеет 3 кнопки) к компьютеру и чтобы в любой момент можно было определить какая кнопка была нажата. Каким образом и с помощью каких деталей это лучше сделать?

            0
          • Здравствуйте!
            Много способов. Например, реализовать сеть RS-485. У меня есть уроки на эту тему.

            0
  20. Здравствуйте. Вопросик а при подключении геркона нужен подтягивающий резистор. или встроенный большой ом?

    0
  21. «…Резистор рассчитывается по формуле I = Uвыхода – Uпадения на светодиоде / R….»

    Случайно не надо ли заключить в скобки разницу напряжений?

    P.S. Уроки СУПЕР! БОЛЬШОЕ СПАСИБО!

    0
    • Здравствуйте!
      Это не формула, а последовательность действий. Конечно, сначала надо вычесть.
      За отзыв спасибо.

      0
      • Здравствуйте!
        Подскажите, величину значения R в этой формуле. Откуда она взята, из предыдущих уроков так и не понял.

        0
        • Здравствуйте!
          На схеме указано сопротивление 360 Ом. Это для тока 10 мА. Современные яркие светодиоды светятся при гораздо меньших токах.

          1
          • То что, 360 Ом для 10 мА я понял. Как нашли? Если в формулу подставили U=5 В и Uпад=1.5 В. т.е. 3.5 делим на R (оно из паспорта? ). Как получил уровень тока 10мА.
            Ампер=В/Ом. .1Амер=0.001милиАмпер.
            Для меня неизвестны два параметра в этой формуле , это I и R.
            Я запутался. На практике : взял контролер, взял светодиот, как определить сопротивление ?
            Нагрузка по току у контролера указана до 40 мА.

            0
          • Вроде так: Высокое U=5 В разделить 360 Ом получили 0.013 А т.е. 13 миАмпер.
            На практике получается я этим сопротивлением задаю уровень тока в этой цепочке: PIN13—>R=360 Ом—>LED—>GND.
            Светодиот по паспорту на 10 мА.
            Сильно не бейте , первый раз лезу в тайную жизнь микросхем!!!!

            0
          • Всем привет!
            А вот янеразобрался зачем снижать ток, думал резистором снижается напряжение 5 В до уровня нормы светодиода 2-3 В чтобы он не сгорел.
            Эдуард же акцент делает на ограничении тока. Может в следующих уроках раскрыта эта тема, я ещё не дочитал.

            И ещё, светодиод питается от 2В и потребляет 0,01А (это примерные характеристики)
            Получается без резистора сопротивление цепи будет 5В/0,01А = 500Ом
            Чтобы понизить напряжение до 2В нужно увеличить сопротивление до… 2В/0,01А = 200Ом, это что…получается нужно, наоборот, уменьшить сопротивление, а не увеличить.
            Фигня какая-то получилась, я всегда думал что сопротивление снижает напряжение, а по закону Ома — снижает ток ;(
            Как же тогда светодиод не сгорает при напряжении 5В?

            0
          • Разобрался в чём моя ошибка.
            При последовательном соединении нескольких потребителей каждый потребитель снижает напряжение у следующего.
            Таким образом, чтобы снизить подаваемое напряжение с 5В до 2В нужно сопротивление на 3В, т.е. 3В/0,01А = 300Ом
            360Ом используемое в уроке получается снижает напряжение подаваемое на светодиод на 0,01А*360Ом = 3,6В и на светодиод поступает напряжение 1,4В (5-3,6)…слабенько будет гореть светодиод, особенно если он не красный
            Сложно вспоминать школьные знания через 30 лет 😉

            0
          • Здравствуйте!
            У светодиода должен быть ограничен именно ток. Можете подать на него тысячу вольт, только через резистор, ограничивающий ток на допустимом уровне.

            0
          • Приветствую!
            Вот как! Для меня это открытие. Спасибо, запомню и пойду искать информацию почему так, иначе недолго буду помнить.
            Спасибо что заставляете думать! 🙂 Статьи очень интересные, очень правильная подача материала.

            0
          • Эдуард, здравствуйте!

            Всё-таки подключая светодиод через резистор пишут что огранивают напряжение, а не ток, так как поданное напряжение на светодиод выше номинала выведет из строя светодиод

            http://silatoka.net/kak-podklyuchit-svetodiod

            0
          • Здравствуйте!
            Найдите вольтамперную характеристику светодиода. Посмотрите ту часть, которая работает при прямом токе. Увидите, что напряжение на светодиоде зависит от тока нелинейно. Прямая характеристика светодиода похожа на характеристику стабилитрона. При увеличении тока напряжение изменяется незначительно. Светодиод стабилизирует прямое напряжение. Попробуйте на стабилитрон подать напряжение, при котором ток через него не превысит допустимого значения. Не получится. Посмотрите по характеристике как будет меняться ток при увеличении напряжения. Еще учтите, что никто не гарантирует точно перелом характеристики и прямое напряжение светодиода зависит от температуры.
            Должен быть стабилизирован ток через стабилитрон. Посмотрите практические схемы, подумайте, как с помощью подачи напряжения можно задать нужный ток светодиода. Это в принципе невозможно.

            0
          • Эдуард, здравствуйте!

            Многое что вы написали мне ещё не под силу понять, не хватаем знаний, вернусь к этому через пару месяцев когда смогу понять что вы написали.
            Согласен и это мне понятно, что при снижении напряжения с помощью резистора снижается и ток и, наоборот.
            Мне как новичку понятнее что резистор снижает напряжение, а уж потом ток и для подключения светодиода нужно приложить правильное напряжение, иначе он сгорит. Не могу сказать почему у меня такое понимание, видимо, я себе придумал упрощение

            0
          • Что тут сложного. Берете источник на 1000 В и через резистор подключаете к нему светодиод. Ток в цепи считается, как 1000 В минус напряжение на светодиоде, делить на сопротивление резистора. Если ток через светодиод выбираете в разумных пределах (3 — 15 мА), то напряжение на светодиоде будет примерно 1,5 В. Причем оно в небольшой степени зависит от тока. Если ток зададите слишком большой, то светодиод сгорит.
            Попробуйте нарисуйте стройную картину при подключении светодиода к источнику напряжения. Какое напряжение задавать?

            0
          • Ощущение что мы обо одном и том же говорим, я со стороны напряжения, вы со стороны тока.
            Модифицируем ваш вариант с источником питания 1000В добавив ему характеристику — ток 0,15А
            Подключив к нему светодиод без обвязки (ведь источник больше 0,15А не выдаст) сгорит или светодиод или источник.
            Я понимаю (надеюсь) что как ни крути всё равно на светодиод будет подано 2-3В при соблюдении тока 20мА, но почему говорится ограничение по току, когда даже формула считается от разности напряжений при расчёте сопротивления R=(Uобщ — Uсветодиода / I светодиода
            По «тупому» я бы назвал это ограничение напряжения, просто так проще неопытному.
            У резистора линейная вольт-амперная характеристика (боже, что за незнакомые слова я пишу) и чем больше он снижает ток, то настолько же он снижает напряжение.
            Получается, слово «токоограничивающий» происходит из начальной формулы закона Ома I = U/R когда при увеличении сопротивления понижается ток.
            А вот светодиод по току не ограничить, ему сколько требуется столько и возьмёт, а чтобы больше не взял нужно ему ограничить напряжение, так как сопротивление у него константа.

            0
  22. Здравствуйте!
    Решил усложнить себе задачу, сделать «переключение» состояния светодиода по кнопке. Код отрабатывает нормально, но светодиод, вместо того, чтобы гаснуть, лишь уменьшает свечение. Схема собиралась в соответствии с примером 2. Использовал на светодиод 220 Ом резистор. Проблема в схеме или в коде? Код прилагаю:
    boolean buttonState;
    boolean led = false;
    void setup() {
    pinMode(12,INPUT_PULLUP);
    pinMode(13,OUTPUT);
    }

    void loop() {
    buttonState = digitalRead(12);
    if(buttonState == HIGH)
    {
    led = !led;
    }
    if(led == false)
    {
    digitalWrite(13, HIGH);
    led=true;
    }
    else
    {
    if(led == true)
    {
    digitalWrite(13, LOW);
    led=false;
    }
    }
    }
    Заранее спасибо!

    0
  23. void loop() {
    int x;
    while (digitalRead(BUTTON_PIN)==LOW){

    for (x=100; x>=10; x—){
    digitalWrite(LED_PIN, HIGH);
    delay (x);
    digitalWrite(LED_PIN, LOW);
    delay (x);
    }

    for (x; x<=100; x++){
    digitalWrite(LED_PIN, HIGH);
    delay (x);
    digitalWrite(LED_PIN, LOW);
    delay (x);
    }

    }

    0
  24. Здравствуйте!
    Ранее нечто похожее уже спрашивал, но не точно формулировал вопрос.
    Для подачи логического сигнала на входы Ардуины требуется 5 вольт.
    Допустим, имеется ЛБП, где можно регулировать силу тока при неизменном напряжении. При какой минимальной силе тока на плату пройдет логический сигнал?
    Спасибо!

    0
    • Здравствуйте!
      Входы ATmega328 имеют высокое входное сопротивление. Ток утечки 1 мкА. Т.е. для обеспечения напряжения 5 В на входе блок питания должен иметь нагрузочную способность 1 мкА.

      0
  25. Доброе время.
    Подскажите как написать изначально что порт является выходом да и ещё с высоким уровнем.
    Заранее спасибо.

    0
  26. Доброе время.
    Я использую Arduino Nano ATmega328P
    Подскажите мне пожалуйста из за чего может быть ошибка при:
    pinMode (4, OUTPUT)

    0
  27. Эдуард добрый день. В программе номер вывода светодиода 13, а кнопки 12. Но это выходы на разъеме платы Ардуино. На самом деле это это выводы порта РВ 17 и РВ 16 контроллера Atmega328. Мне не понятно следующее, мы программируем контроллер и в прошивке указываем выводы платы, а не контроллера. Почему так ?

    0
    • Здравствуйте!
      Мы обращаемся через функции. В них в качестве аргументов используется нумерация выводов, которая преобразовывается в разряды портов ATmega328.

      0
  28. Поясните пожалуйста, зачем нужна инверсия digitalWrite(13, ! digitalRead(12) )? Ведь выражение digitalWrite(13, digitalRead(12) ) и без инверсии так же работает

    0
    • Здравствуйте!
      Активный уровень кнопки (нажата) — низкий (0 В). А светодиод светится при высоком уровне на выводе 13. Если надо, чтобы при нажатии кнопки светодиод светился, надо инвертировать. Иначе светодиод при нажатии кнопки будет гаснуть.

      0
  29. Доброе время.
    Я использую Arduino Nano ATmega328P
    Подскажите мне пожалуйста из за чего может быть ошибка при компиляции скетча, выдает:
    Arduino: 1.6.13 (Windows XP), Плата:»Arduino Nano, ATmega328″

    collect2.exe: error: ld returned 5 exit status

    exit status 1
    Ошибка компиляции для платы Arduino Nano.

    вот сам скетч:
    /*Программа sketch_5_1 УРОКА 5
    Зажигает светодиод (вывод 13) при нажатии кнопки (вывод 12)
    */

    boolean buttonState; //создаём глобальную переменную buttonState

    // настройка параметров
    void setup() {
    pinMode(13, OUTPUT); // определяет вывод 13 (светодиод) как выход
    pinMode(12, INPUT_PULLUP); // определяет выыод 12 (кнопка) как вход

    }

    // выполнение программы (бесконечный цикл)
    void loop() {
    buttonState=digitalRead(12); // считываем состояние 12 вывода (вход, кнопка)и записываем в переменную buttonState
    buttonState=!buttonState; // инвертируем переменную buttonState
    digitalWrite(13, buttonState); // записываем состояние из buttonState на вывод 13 (выход, светодиод)

    }

    0
    • Здравствуйте!
      Посмотрите в интернете решение этой проблемы. Например, здесь
      https://frompinskto.wordpress.com/2016/01/14/arduino-%D0%BE%D1%88%D0%B8%D0%B1%D0%BA%D0%B0-%D0%BF%D1%80%D0%B8-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%86%D0%B8%D0%B8-%D0%BF%D0%BE%D0%B4-windows-xp/

      0

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Нажимая кнопку "Отправить" Вы даёте свое согласие на обработку введенной персональной информации в соответствии с Федеральным Законом №152-ФЗ от 27.07.2006 "О персональных данных".