Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

Предыдущая версия справа и слеваПредыдущая версия
Следующая версия
Предыдущая версия
products:laboratory_iot_с:exp17 [2024/11/14 13:30] – [Массивы] labuser30products:laboratory_iot_с:exp17 [Дата неизвестна] (текущий) – удалено - внешнее изменение (Дата неизвестна) 127.0.0.1
Строка 1: Строка 1:
-===== Эксперимент 17. Индикатор уровня =====  
- 
-В технике часто применяются индикаторы уровней на светодиодной шкале. Например в звукозаписывающем оборудовании, как индикаторы уровня громкости динамиков или микрофона. Давайте тоже соберем такой индикатор. 
- 
-В левой части платы конструктора имеется 6 светодиодов подходящих по цвету для использования в качестве шкалы. Когда уровень сигнала в пределах нормы, он отображается зеленым, когда он достаточно высокий — желтым, а при перегрузке загорается красный. 
- 
-Подключим все 6 светодиодов к микроконтроллеру. 
-==== Схема эксперимента ==== 
- 
-{{ :products:esp-iot:exp7.4.2.png?nolink |}} 
-//Рисунок 1. Электрическая принципиальная схема эксперимента// 
- 
-{{ :products:esp-iot:exp7.4.1.png?direct&600 |}} 
-//Рисунок 2. Монтажная схема эксперимента// 
- 
-==== Программный код эксперимента ==== 
- 
-<file arduino Exp17.ino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-#define ACD_PIN A0    
- 
-int value = 0;   
-int myPins[6] = {5, 12, 13, 14, 15, 16}; 
-         
-void ledOff(){ 
-  for (int i = 0; i < 6; i++) { 
-    digitalWrite(myPins[i], LOW); 
-  } 
-} 
- 
-void ledOn(int count){ 
-  for (int i = 0; i < count; i++) { 
-    digitalWrite(myPins[i], HIGH); 
-  } 
-} 
- 
-void setup() 
-{ 
-  for (int i = 0; i < 6; i++) { 
-    pinMode(myPins[i], OUTPUT); 
-  }           
-} 
-  
-void loop() 
-{    
-  value = analogRead(ACD_PIN); 
-  ledOff(); 
-   
-  if (value > 850) ledOn(6); 
-  else if (value > 680) ledOn(5); 
-  else if (value > 510) ledOn(4); 
-  else if (value > 340) ledOn(3); 
-  else if (value > 170) ledOn(2); 
-  else ledOn(1);          
-} 
-</file> 
- 
-В коде программы много нового. Давайте разбираться. 
- 
-<code arduino [enable_line_numbers="2", start_line_numbers_at="4"]> 
-int myPins[6] = {5, 12, 13, 14, 15, 16}; 
-</code> 
- 
-==== Массивы ==== 
-Ранее мы уже много раз сталкивались с //переменными//. Это был некий контейнер для хранения какого либо значения или объекта. Например, мы записывали значение АЦП переменную. Теперь настала пора познакомиться с //массивами//. Массив, это тоже контейнер, как и переменная, но он может хранить не одно значение, а много. Если переменную можно было представить как коробку, в которую можно что-то положить, то переменная, это полка шкафа, на которую можно поставить несколько коробок со значениями. 
- 
-{{ :products:esp-iot:array.png?nolink |}} 
- 
-В строке 4 мы объявили массив ''ledPins'' переменных типа ''int'' длинной ''[6]''  и с помощью фигурных скобок сразу записали в него 6 значений. Эти значения номера выводов, к которым подключены светодиоды. Важным свойством массива является то, что каждый элемент имеет свой номер. Номера элементов массива начинаются с 0. Так если в массиве 3 элемента, то у них будут номера 0, 1 и 2. Эти номера нам будут нужны потом для обращения к конкретным элементам массива для чтения или записи значений в них. Для чтения или записи элемента массива необходимо обратится к нему по номеру, например, ''ledPins[2]'' вернет значение третьего элемента массива — 13. 
- 
-Теперь нам необходимо переключить 6 выводов микроконтроллера в режим ''OUTPUT'' c помощью знакомой нам функции pinMode(). Мы могли бы написать шесть строк с вызовом этой функции для каждого пина, но это достаточно громоздко. Цикл ''for'' позволит нам сделать тоже самое в 3 строчки. Вроде не очень большая экономия? Представь, что пинов не 6, а например 20 или еще больше.  
-<code arduino [enable_line_numbers="2", start_line_numbers_at="18"]> 
-void setup() 
-{ 
-  for (int i = 0; i < 6; i++) { 
-    pinMode(myPins[i], OUTPUT); 
-  }           
-} 
-</code> 
-Мы уже знакомы с циклом ''for'', он нужен для итерации значений. В данном случае он перебирает все значения массива ''myPins'', в котором записаны номера выводов. Эти номера поочередно передаются в функцию pinMode, которая настраивает их на выход. 
- 
-Объявляем подпрограмму ''ledOff()'' 
-<code arduino [enable_line_numbers="2", start_line_numbers_at="6"]> 
-void ledOff(){ 
-  for (int i = 0; i < 6; i++) { 
-    digitalWrite(myPins[i], LOW); 
-  } 
-} 
-</code> 
- 
-Эта функция гасит все светодиоды. Она поочередно перебирает все светодиоды и выключает их. 
- 
-Объявляем функцию ''ledOn()'' 
-<code arduino [enable_line_numbers="2", start_line_numbers_at="12"]> 
-void ledOn(int count){ 
-  for (int i = 0; i < count; i++) { 
-    digitalWrite(myPins[i], HIGH); 
-  } 
-} 
-</code> 
-Она нужна для включения нужного количества светодиодов подряд. В качестве  параметра ''count'' она принимает количество светодиодов для включения. Цикл ''for'' перебирает элементы массива до полученного параметра и зажигает светодиоды. привычным нам способом. 
- 
-Теперь у нас есть 2 функции ''ledOff'', которая гасит все светодиоды и ''ledOn'', которая включает нужное число светодиодов начиная с первого. Осталось воспользоваться этими функциями для создания светодиодной шкалы. 
- 
-<code arduino [enable_line_numbers="2", start_line_numbers_at="25"]> 
-void loop() 
-{    
-  value = analogRead(ACD_PIN); 
-  ledOff(); 
-   
-  if (value > 850) ledOn(6); 
-  else if (value > 680) ledOn(5); 
-  else if (value > 510) ledOn(4); 
-  else if (value > 340) ledOn(3); 
-  else if (value > 170) ledOn(2); 
-  else ledOn(1);          
-} 
-</code> 
- 
-Здесь все просто. Мы считываем значение напряжения с помощью АЦП, выключаем все светодиоды и анализируем сколько светодиодов нужно зажечь. Мы помним, что при 0 вольт результатом преобразования АЦП является 0, а при напряжении питания — 1023. Разобьем этот диапазон на 6 одинаковых интервалов. 
- 
-Мы последовательно с помощью оператора ''if...else'' сравниваем полученное значение с верхней границей интервала и если оно больше зажигаем с помощью функции ''ledOn()'' соответствующее количество светодиодов.  
- 
-Внимательные экспериментаторы заметили отсутствие фигурных скобок ''{}'' после оператора''if''. После операторов и циклов допускается опускать фигурные скобки в случае, если тело состоит только из одной строки. Кроме того в этом случае тело можно записать в одной строке сразу после объявления оператора или цикла. 
- 
-==== Дополнительное задание ==== 
-<WRAP center round tip 60%> 
-  * Попробуй изменить границы интервалов , чтобы добиться более резкого или плавного роста показаний шкалы 
-  * Измени 1 строку в программе, чтобы светодиодная шкала начинала светиться не снизу-вверх, а наоборот 
-</WRAP>