Режимы работы цифровых портов

Основные функции и понятия

Структура программы

1: // Однострочный комментарий

2: /* Многострочный комментарий (комментарии не занимают память) */

3: #include - подключить файл (библиотеку)

4: void setup() {} - всё находящееся внутри {} будет выполнено 1 раз при загрузке Ардуино

5: void loop() {} - всё находящееся внутри {} бесконечно повторяется сверху вниз

6: После каждого «действия» ставится точка запятой;

Типы данных

1: <тип данных> <имя>;

2: int my_val; // объявить переменную my_val)

3: <тип данных> <имя> = <значение>;

4: int my_val = 2300; // объявить переменную my_val и присвоить ей число 2300


Особенности использования переменных

1: • Внимательно следите за значением, которое принимает переменная. Если значение превысит максимальное или принизит минимальное (выйдет из диапазона) для этого типа данных, то переменная сбросится в 0, либо выдаст вообще случайное число. Такую ошибку потом будет трудно отследить.

2: • Тип данных указывается при объявлении переменной ТОЛЬКО ОДИН РАЗ, далее переменная

3: используется чисто по имени (обращение к переменной). При попытке сменить тип

4: переменной (переобъявить переменную) вы получите ошибку. Но только в том случае, если

5: переменная глобальная, либо когда локальная переобъявляется внутри функции, в которой

6: она была объявлена. 

Типы переменных

1: • Глобальная переменная – объявляется ВНЕ функций, например в самом начале скетча. Обращаться к глобальной переменной (использовать её значение) можно использовать ВЕЗДЕ.

2: • Локальная переменная – объявляется ВНУТРИ функции, и обращаться к ней можно только внутри этой функции.

Математические операторы

1: +, -, *, / - сложить, вычесть, умножить...

2: pow(x, a); - возвести "х" в степень "а" ( xa ), pow может возводить в дробную степень!

3: sq(x); - возвести число "х" в квадрат ( x2 )

4: sqrt(x); - взять квадратный корень числа "х"

5: abs(x); - найти модуль числа, |х|

6: sin(x), cos(x), tan(x); - синус, косинус, тангенс

7: round(x); - математическое округление (если после запятой больше или равно 5, то округляем в большую сторону)

8: ceil(x); - округлить в бОльшую сторону

9: floor(x); - округлить в меньшую сторону

10: x += a; - прибавить "а" к "х"

11: x -= a; - вычесть "а" из "х"

12: x *= a; - домножить "х" на "а"

13: x /= a; - разделить "х" на "а"

14: x++; - увеличить "х" на 1

15: x--; - уменьшить "х" на 1 

Последовательный порт

1: Serial.begin(<скорость>); - открыть порт

2: Serial.begin(9600); // открыть порт на 9600 БОД

3: ВНИМАНИЕ! Скорость, установленная в begin(), должна быть равна скорости монитора порта (в самом мониторе правый нижний угол). Иначе в выводе получите крокозябры!

4: Serial.print(); - вывод в порт. Переменные и цифры напрямую, текст – в кавычках " "

5: Serial.println(); - вывод с переводом строки

Условный оператор if

6: if () {} - условный оператор, проверяет условие в () и выполняет код в {} если оно верно

7: if () { - проверяет условие, если верно,

8: выполняет эту часть кода

9: } else { - если неверно

10: выполняет вот эту

11: }

Операторы сравнения

1: a == b - если а равно b

2: a != b - если а не равно b

3: > - если a больше b (строго)

4: < - если a меньше b (строго)

5: >= - если a больше или равна b

6: <= - если a меньше или равна b

Логические операторы

7: && - логическое И (одно условие И второе)

8: || - логическое ИЛИ (либо одно, либо второе)

9: ! – отрицание (например if (!val) - если val - ложь, т.е. 0)

Функции таймера

1: millis() - возвращает количество миллисекунд, прошедших с момента включения МК.

2: Макс. значение: 4’294’967’295 мс или 50 суток.

3: micros() - возвращает количество микросекунд, прошедших с момента включения МК. Макс. значение: 4’294’967’295 мкс или 70 мин

4: Пример: нужно раз в пять секунд выполнять какое-то действие

5: unsigned long last_time = 0; //создаем глобальную перменную

6: if (millis() - last_time > 5000) {

7: // что-то сделать

8: last_time = millis();

9: }

Режимы работы цифровых портов

1: Аналоговые и цифровые порты могут работать как ВХОДЫ и как ВЫХОДЫ

2: По умолчанию все порты работают КАК ВХОДЫ

3: pinMode(pin, mode); - настроить порт

4: • pin - номер порта. Цифровые: 0 – 13. Аналоговые: 14 - 19, либо A0 - A5

5: • mode - режим работы порта

6: • INPUT - вход, принимает сигнал

7: • OUTPUT - выход, выдаёт 0 или 5 Вольт

8: • INPUT_PULLUP - вход с подтяжкой к 5 В

 


Генерация цифрового сигнала

1: digitalWrite(pin, signal); - подать цифровой сигнал

2: • pin - номер порта. Цифровые: 0 – 13. Аналоговые: 14 - 19, либо A0 - A5

3: • signal - какой сигнал подаём

4: • LOW, или 0 (ноль), или false - 0 Вольт

5: • HIGH, или 1, или true - 5 Вольт

Чтение цифрового сигнала

1: digitalRead(pin); - прочитать цифровой сигнал

2: • pin - номер порта. Цифровые: 0 – 13. Аналоговые: 14 - 19, либо A0 - A5

Чтение аналогового сигнала

1: analogRead(pin); - прочитать аналоговый сигнал (оцифровать)

2: • pin - номер пина. Аналоговые: 0 - 7

3: • Функция возвращает значение 0.. 1023 в зависимости от напряжения на пине от 0 до опорного напряжения (грубо 5 В)

Изменение диапазона значений

1: map(val, min, max, new_min, new_max); - возвращает величину в новом диапазоне

2: • val - входная величина

3: • min, max - минимальное и максимальное значение на входе в map

4: • new_min, new_max – соответственно мин. и макс. значения на выходе

5: constrain(val, min, max); - ограничить диапазон переменной val до min и max

Генерация ШИМ сигнала

1: analogWrite(pin, duty);

2: • pin – пин, На котором генерировать ШИМ

3: • duty – величина 0.. 255, соответствует скважности ШИМ 0.. 100%

4: ШИМ пины Arduino NANO, UNO: 3, 5, 6, 9, 10, 11

5: ШИМ пины Arduino MEGA: все до 13

Цикл for, «счётчик»

1: for (counter; condition; change) {} - цикл for

2: • counter – переменная счётчика, обычно создают новую «локальную», в стиле int i = 0;

3: • condition – условие, при котором выполняется цикл, например «счётчик меньше 5» i < 5;

4: • change – изменение, т.е. увеличение или уменьшение счётчика, например i++, i--, i += 10;

5: Пример:

6: for (byte i = 0; i < 100; i++) { // счётчик от 0 до 99

7: Serial.println(i); // вывести в монитор порта числа от 0 до 99

8: }

Цикл while

1: while (condition) {}

2: • condition – условие, при котором выполняется блок кода, заключённый в {}

3: Пример:

4: while (flag==1) {

5: // какой-то кусок кода, который выполняется, пока flag равен логической 1

6: }

Создание массива

1: <тип данных> <имя массива>[<число элементов>];

2: <тип данных> <имя массива>[<число элементов>] = {элемент1, элемент2…};

3: Если не указываются элементы, то обязательно нужно указать размер массива, чтобы под него выделилось место в памяти. Размер можно не указывать в том случае, если сразу указываются все элементы.

4: Примеры:

5: int myInts[6];

6: int myPins[] = {2, 4, 8, 3, 6};

7: int mySensVals[6] = {2, 4, -8, 3, 2};

8: char message[6] = "hello";

Чтение-запись массива

1: Главное помнить, что нумерация элементов НАЧИНАЕТСЯ С НУЛЯ!

2: myArray[5] = 10; // присвоить пятому элементу число 10

3: if (myArray[5] == 20) ….. // если элемент массива под номером 5 равен 20…

4: Пример. Забивка массива случайными числами

5: byte myArray[50]; // создать массив myArray на 50 ячеек

6: for (byte i = 0; i < 50; i++) { // счётчик от 0 до 49

7: myArray[i] = random(100); // присвоить случайное число от 0 до 99 элементам массива под

8: номерами 0.. 49

9: }

10: Пример трех массивов для Морзе:

11:

12: char chrMorze[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5',  '6', '7', '8', '9', '0', '.', ';', ',', ':', '?', '!', '-', ' ', '\n', '\r'};

13:

14: uint8_t lenMorze[] = { 2, 4, 4, 3, 1, 4, 3, 4, 2, 4, 3, 4, 2, 2, 3, 4, 4, 3, 3, 1, 3, 4, 3, 4, 4, 4, 5, 5,   5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5};

15:

16: uint8_t varMorze[] = {0x1, 0x8, 0xA, 0x4, 0x0, 0x2, 0x6, 0x0, 0x0, 0x7, 0x5, 0x4, 0x3, 0x2, 0x7, 0x6, 0xD, 0x2, 0x0, 0x1, 0x1, 0x1, 0x3, 0x9, 0xB, 0xC, 0xF, 0x7, 0x3, 0x1, 0x0, 0x10, 0x18, 0x1C, 0x1E, 0x1F, 0x0, 0x2A, 0x15, 0x38, 0x0C, 0x33, 0x21, 0x11, 0x15, 0x0A};

17:

Пояснение к массиву с Морзе

· chrMorze - содержит символы;

· lenMorze - содержит количество точек или тире для символа;

· varMorze - содержит комбинацию точек и тире для символа (точка = 0, тире = 1);

 

Пример: возьмем второй элемент каждого массива - из массива chrMorze понятно что это символ «В», из массива lenMorze понятно что он состоит из 4 точек или тире, а из массива varMorze понятно, что комбинация равна значению 0x8 = 0b00001000 (из 16-ой системы счисления в двоичную). Берем последние 4 бита - 1000, точка = 0, тире = 1, значит в азбуке Морзе это « – • • • ».


Пример: возьмем седьмой элемент каждого массива - из массива chrMorze понятно что это символ «G», из массива lenMorze понятно что он состоит из 3 точек или тире, а из массива varMorze понятно, что комбинация равна значению 0x6 = 0b00000110. Берем последние 3 бита - 110, точка = 0, тире = 1, значит в азбуке Морзе это « – – • ».


Дата добавления: 2018-05-12; просмотров: 210; Мы поможем в написании вашей работы!

Поделиться с друзьями:




Мы поможем в написании ваших работ!