Конспект хакера Эксперименты
8. Жмите «Upload» на панели инструментов для прошивки платы!
Перепрошивать плату можно сколько угодно раз. Программа сохраняется после обесточивания платы.
Внешний вид Arduino IDE
Если прошивка не удаётся
Плата получает питание, горит светодиод «ON»
Драйверы под Windows установились корректно, и в диспетчере устройств вы видите устройство «Arduino Uno»
Вы выбрали правильную модель платы и правильный порт (пункты 5 и 6)
Эксперимент 1. Маячок
Список деталей для эксперимента
1 плата Arduino Uno
1 беспаечная макетная плата
1 резистор номиналом 220 Ом
2 провода «папа-папа»
Схема на макетке
Не забудьте, как соединены рельсы в беспаечной макетной плате . Если на вашей макетке красная и синяя линии вдоль длинных рельс прерываются в середине, значит проводник внутри макетки тоже прерывается!
Катод («минус») светодиода — короткая ножка, именно её нужно соединять с землёй (GND)
Не пренебрегайте резистором, иначе светодиод выйдет из строя
Выбрать резистор нужного номинала можно с помощью таблицы маркировки или с помощью мультиметра в режиме измерения сопротивления
Плата Arduino имеет три пина GND, используйте любой из них
// настраиваем пин №13 в режим выхода,
// т.е. в режим источника напряжения pinMode ( 13 , OUTPUT ) ;
// подаём на пин 13 «высокий сигнал» (англ. «high»), т.е.
// выдаём 5 вольт. Через светодиод побежит ток.
// Это заставит его светиться digitalWrite ( 13 , HIGH ) ;
// задерживаем (англ. «delay») микроконтроллер в этом
// состоянии на 100 миллисекунд delay ( 100 ) ;
// подаём на пин 13 «низкий сигнал» (англ. «low»), т.е.
// выдаём 0 вольт или, точнее, приравниваем пин 13 к земле.
// В результате светодиод погаснет digitalWrite ( 13 , LOW ) ;
// замираем в этом состоянии на 900 миллисекунд delay ( 900 ) ;
// после «размораживания» loop сразу же начнёт исполняться
// вновь, и со стороны это будет выглядеть так, будто
// светодиод мигает раз в 100 мс + 900 мс = 1000 мс = 1 сек
Пояснения к коду
Процедура setup выполняется один раз при запуске микроконтроллера. Обычно она используется для конфигурации портов микроконтроллера и других настроек
После выполнения setup запускается процедура loop , которая выполняется в бесконечном цикле. Именно этим мы пользуемся в данном примере, чтобы маячок мигал постоянно
Процедуры setup и loop должны присутствовать в любой программе (скетче), даже если вам не нужно ничего выполнять в них — пусть они будут пустые, просто не пишите ничего между фигурными скобками. Например:
Запомните, что каждой открывающей фигурной скобке < всегда соответствует закрывающая >. Они обозначают границы некого логически завершенного фрагмента кода. Следите за вложенностью фигурных скобок. Для этого удобно после каждой открывающей скобки увеличивать отступ на каждой новой строке на один символ табуляции (клавиша Tab)
Обращайте внимание на ; в концах строк. Не стирайте их там, где они есть, и не добавляйте лишних. Вскоре вы будете понимать, где они нужны, а где нет.
Функция digitalWrite(pin, value) не возвращает никакого значения и принимает два параметра:
o pin — номер цифрового порта, на который мы отправляем сигнал
o value — значение, которое мы отправляем на порт. Для цифровых портов значением может быть HIGH (высокое, единица) или LOW (низкое, ноль)
Если в качестве второго параметра вы передадите функции digitalWrite значение,
отличное от HIGH , LOW , 1 или 0 , компилятор может не выдать ошибку, но считать, что передано HIGH . Будьте внимательны
Обратите внимание, что использованные нами константы: INPUT , OUTPUT , LOW , HIGH , пишутся заглавными буквами, иначе компилятор их не распознает и выдаст ошибку. Когда ключевое слово распознано, оно подсвечивается синим цветом в Arduino IDE
Вопросы для проверки себя
1. Что будет, если подключить к земле анод светодиода вместо катода?
2. Что будет, если подключить светодиод с резистором большого номинала (например, 10 кОм)?
3. Что будет, если подключить светодиод без резистора?
4. Зачем нужна встроенная функция pinMode ? Какие параметры она принимает?
5. Зачем нужна встроенная функция digitalWrite ? Какие параметры она принимает?
6. С помощью какой встроенной функции можно заставить микроконтроллер ничего не делать?
7. В каких единицах задается длительность паузы для этой функции?
Задания для самостоятельного решения
1. Сделайте так, чтобы маячок светился полсекунды, а пауза между вспышками была равна одной секунде
2. Измените код примера так, чтобы маячок включался на три секунды после запуска устройства, а затем мигал в стандартном режиме
Эксперимент 2. Маячок с нарастающей яркостью
Список деталей для эксперимента
1 плата Arduino Uno
1 беспаечная макетная плата
1 резистор номиналом 220 Ом
2 провода «папа-папа» Для дополнительного задания
еще 1 светодиод
еще 1 резистор номиналом 220 Ом
Схема на макетке
Не любой порт Arduino поддерживает широтно-импульсную модуляцию , если вы хотите регулировать напряжение, вам подойдут пины, помеченные символом тильда «
Arduino Uno это пины 3, 5, 6, 9, 10, 11
// даём разумное имя для пина №9 со светодиодом
// (англ. Light Emitting Diode или просто «LED»)
// Так нам не нужно постоянно вспоминать куда он подключён
#define LED_PIN 9
// настраиваем пин со светодиодом в режим выхода,
// как и раньше pinMode ( LED_PIN, OUTPUT ) ;
// выдаём неполное напряжение на светодиод
// (он же ШИМ-сигнал, он же PWM-сигнал).
// Микроконтроллер переводит число от 0 до 255 к напряжению
// от 0 до 5 В. Например, 85 — это 1/3 от 255, // т.е. 1/3 от 5 В, т.е. 1,66 В. analogWrite ( LED_PIN, 85 ) ;
// держим такую яркость 250 миллисекунд delay ( 250 ) ;
// выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В.
// Больше напряжение — выше яркость! analogWrite ( LED_PIN, 170 ) ; delay ( 250 ) ;
// все 5 В — полный накал! analogWrite ( LED_PIN, 255 ) ;
// ждём ещё немного перед тем, как начать всё заново delay ( 250 ) ;
Пояснения к коду
Идентификаторы переменных, констант, функций (в этом примере идентификатор LED_PIN )
являются одним словом (т.е. нельзя создать идентификатор LED PIN ).
Идентификаторы могут состоять из латинских букв, цифр и символов подчеркивания _ . При этом идентификатор не может начинаться с цифры.
Что произойдет если создать директиву define high low
В этом эксперименте мы задаем различные уровни яркости светодиода.
-
Список деталей для эксперимента
-
Обратите внимание
Скетч
// даём разумное имя для пина №9 со светодиодом
// (англ. Light Emitting Diode или просто «LED»)
// Так нам не нужно постоянно вспоминать куда он подключён
#define LED_PIN 9
void setup()
<
// настраиваем пин со светодиодом в режим выхода,
// как и раньше
pinMode(LED_PIN, OUTPUT);
>
void loop()
<
// выдаём неполное напряжение на светодиод
// (он же ШИМ-сигнал, он же PWM-сигнал).
// Микроконтроллер переводит число от 0 до 255 к напряжению
// от 0 до 5 В. Например, 85 — это 1/3 от 255,
// т.е. 1/3 от 5 В, т.е. 1,66 В.
analogWrite(LED_PIN, 85);
// держим такую яркость 250 миллисекунд
delay(250);
// выдаём 170, т.е. 2/3 от 255, или иными словами — 3,33 В.
// Больше напряжение — выше яркость!
analogWrite(LED_PIN, 170);
delay(250);
// все 5 В — полный накал!
analogWrite(LED_PIN, 255);
// ждём ещё немного перед тем, как начать всё заново
delay(250);
>
Arduino.ru
то встает вопрос можно ли поменять глобально на нескольких пинах значения HIGH и LOW для того что бы не переписывать и что бы код остался читабельным и логически правильным. Может функцию какую дописать по типу
Может кто подскажет другое решение что бы минимизировать движения, покупать другой блок реле не выход)
- Войдите на сайт для отправки комментариев
- Войдите на сайт для отправки комментариев
не понял, можно объяснить?
- Войдите на сайт для отправки комментариев
Zara других вариантов нет: либо переписывать участки программы, либо инвертировать сигнал аппаратно.
- Войдите на сайт для отправки комментариев
Предполагается, что люди, задающие вопрос в разделе «программирование», догадаются в гугле поискать #define
А если нет, так и нет.
- Войдите на сайт для отправки комментариев
Предполагается, что люди, задающие вопрос в разделе «программирование», догадаются в гугле поискать #define
А если нет, так и нет.
что оно делает я знаю, не понял почему у вас константа с одним именем имеет разные значения, или это просто для примера
- Войдите на сайт для отправки комментариев
Просто для примера — как инвертируются значения без всяких функций.
- Войдите на сайт для отправки комментариев

Для Zara: всё равно придётся вручную менять в программе HIGH на ON в нужных местах. И это займёт столько же времени, сколько поменять HIGH на LOW. Применить директиву #define имеет смысл если Вы планируете периодически менять модуль реле с другим управляющим логическим уровнем. Если же это нужно сделать однократно, то смысла не имеет.
- Войдите на сайт для отправки комментариев
А просто писать изначально нужно по нормальному, что бы потом не бегать и не менять по всей программе, при этом ещё и забыть где-нибудь. (
- Войдите на сайт для отправки комментариев

Для того, чтобы код был читабельным, его нужно переписать. Тогда и с изменениями проблемы не будет от слова совсем.
Вот скажите, на кой, простите мой французский, хер, Вы включаете реле конструкцией
Это по-Вашему читабельно?
Всегда делайте по уму:
и везде используйте turnRelayOn и turnRelayOff !
А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.
Не ленитесь, перепишите.
- Войдите на сайт для отправки комментариев
Для того, чтобы код был читабельным, его нужно переписать. Тогда и с изменениями проблемы не будет от слова совсем.
Вот скажите, на кой, простите мой французский, хер, Вы включаете реле конструкцией
Это по-Вашему читабельно?
Всегда делайте по уму:
и везде используйте turnRelayOn и turnRelayOff !
А если и приспичит изменить логику, так в одном месте одну константу поменять и всего делов.
Не ленитесь, перепишите.
Круто, спасибо) по неопытности все)
- Войдите на сайт для отправки комментариев
А просто писать изначально нужно по нормальному, что бы потом не бегать и не менять по всей программе, при этом ещё и забыть где-нибудь. (
Это да, тут вы правы, но нельзя вот взять и написать без опыта что то прям вот хорошее, как нельзя сделать космический корабль если только вчера колесо изобрел
- Войдите на сайт для отправки комментариев

- Войдите на сайт для отправки комментариев

#define HIGH LOW
- Войдите на сайт для отправки комментариев
#define HIGH LOW
угу. а классический #define true false ещё круче.
- Войдите на сайт для отправки комментариев
В начале программы опрашиваешь все входы и пихаешь в переменные, потом что-то делаешь, а в конце программы из переменных пихаешь на выходы. В итоге искать по всей программе не нужно. Как пример:
- Войдите на сайт для отправки комментариев

Всегда делайте по уму:
и везде используйте turnRelayOn и turnRelayOff !
Красиво, спасибо, пригодится.
- Войдите на сайт для отправки комментариев
Интересный факт — само имя переменной как бы подразумевает невысказанный программистом вопрос: действительно ли On равно HIGH. Что даже придаёт некий философский смысл функциям, заставляющий задуматься — On или не On.
- Войдите на сайт для отправки комментариев
Ага, толи дело оn(LED), off(LED) — всё ясно как божий день, какие вопросы?
- Войдите на сайт для отправки комментариев
дефайнить конечно удобно, а решение от Евгения П. — вообще красиво. Но что делать с «маленькими хитростями»? Типа тех, что компилятор относится спокойно и к HIGH и к true, и к любому числу больше 0.
К примеру, digitalWrite(led, true), digitalWrite(led, HIGH), digitalWrite(led, 8) — засветит светодиод, а digitalWrite(led, false), digitalWrite(led, LOW), digitalWrite(led, 0) — погасит. Очень удобно использовать без доп. обработки или доп.переменных в коде. Если нужно перевернуть, работает даже такое digitalWrite(led, !8) — выключит, а digitalWrite(led, !0) — включит.
У меня в одном проекте управление DTMF так сделано — 0 выключить, а 9 — включить. В digitalWrite() просто передаю второе число из кода управления, удобно, зараза.
А вот как такое задефайнить или перевернуть наоборот? Мне не надо, но просто интерсно.
Arduino digitalWrite 1 or 0 instead of HIGH or LOW
![]()
Yes, that is fine. LOW is 0 and HIGH is 1. digitalWrite() sets the output to off if it receives a 0 and on if it receives anything of 1 or more.
That means that these are all equivalent:
It’s especially useful when you are examining a variable for, say, a certain bit being set:
That will set the pin to high on any value from 128 to 255 in the byte variable, and low for anything below 128.
So HIGH is exactly the same as 1 . And LOW exactly the same as 0 .
When you look at the source code of Arduino, HIGH is defined as 1 and LOW is defined as 0 using #define.
You may heard about Preprocessor, Compiler, and Linker. When you build the project, preprocessor do its job before the code is compiled. What the preprocessor does is basically converting defined words into corresponding value.
For example when you write a syntax like:
When you build your project, the preprocessor converts the above like into this:
