Различия

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

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

Следующая версия
Предыдущая версия
products:laboratory_iot_c:exp26 [2024/11/14 20:23] – создано labuser30products:laboratory_iot_c:exp26 [2024/11/15 12:25] (текущий) – [Программный код эксперимента] labuser30
Строка 18: Строка 18:
 ==== Программный код эксперимента ==== ==== Программный код эксперимента ====
  
-<file python Exp26.py[enable_line_numbers="2", start_line_numbers_at="1"]> +<file arduino Exp26.ino[enable_line_numbers="2", start_line_numbers_at="1"]> 
-from machine import Pin +int segments[7] = {14, 13, 4, 5, 12, 16, 15}; // ABCDEFG
-import time +
-_init()+
  
-segments = [1413, 4, 5, 121615] # ABCDEFG+int digits[10][7] = { 
 +    {111, 1, 1, 1, 0}, // 0 
 +    {0, 1, 1, 0, 0, 0, 0}, // 1 
 +    {1, 1, 0, 1, 1, 0, 1}, // 2 
 +    {1, 1, 1, 1, 0, 0, 1}, // 3 
 +    {0, 1, 1, 0, 0, 1, 1}, // 4 
 +    {10, 1, 1, 0, 1, 1}, // 5 
 +    {1011, 1, 1, 1}, // 6 
 +    {1, 1, 1, 0, 0, 0, 0}, // 7 
 +    {1, 1, 1, 1, 1, 1, 1}, // 8 
 +    {1, 1, 1, 1, 0, 1, 1}, // 9 
 +};
  
-for s in segments: +void draw_time(int digit) { 
-    led = Pin(sPin.OUT).off()+  for (int i = 0; i < 7; i++) { 
 +    if (digits[digit][i]) digitalWrite(segments[i]HIGH)
 +    else digitalWrite(segments[i], LOW);  
 +  }  
 +}
  
-digits +void setup() { 
-    [1, 1, 1, 1, 1, 1, 0], # 0 +  for (int i = 0; i < 7; i++){ 
-    [0, 1, 1, 0, 0, 0, 0], # 1 +    pinMode(segments[i], OUTPUT);  
-    [1, 1, 0, 1, 1, 0, 1], # 2 +   
-    [1, 1, 1, 1, 0, 0, 1], # 3 +}
-    [0, 1, 1, 0, 0, 1, 1], # 4 +
-    [1, 0, 1, 1, 0, 1, 1], # 5 +
-    [1, 0, 1, 1, 1, 1, 1], # 6 +
-    [1, 1, 1, 0, 0, 0, 0], # +
-    [1, 1, 1, 1, 1, 1, 1], # 8 +
-    [1, 1, 1, 1, 0, 1, 1], # 9 +
-]+
  
- +void loop() { 
-def draw_time(digit): +  for (int i = 0; i < 7; i++{ 
-    for el in enumerate(digit): +    draw_time(i); 
-        if (el[1]): +    delay(1000) 
-            Pin(segments[el[0]]).on(+    
-        else: +}
-            Pin(segments[el[0]]).off() +
- +
- +
-while True: +
-    for digit in digits: +
-        draw_time(digit+
-        time.sleep(1)+
 </file> </file>
  
Строка 59: Строка 58:
  
 <WRAP center round info 60%> <WRAP center round info 60%>
-Комментарии используются в программах, чтобы записать какие либо пояснения к коду, и предназначены только для человека, который читает код. Комментарии никак не влияют на выполнение программы. В языке Python комментарий начинается с символа #. Также часто комментируют части кода, которые не должны исполняться, но удалять совсем их пока не нужно.+Комментарии используются в программах, чтобы записать какие либо пояснения к коду, и предназначены только для человека, который читает код. Комментарии никак не влияют на выполнение программы. В языке Arduino комментарий начинается с символов %%//%%. Также часто комментируют части кода, которые не должны исполняться, но удалять совсем их пока не нужно.
 </WRAP> </WRAP>
  
-В строке 10 объявляем массив, в котором описываем цифры от 0 до 9 и какие сегменты должны светиться на индикаторе, чтобы эту цифру отобразить, а какие должны быть потушены. Для описания этого мы использовали двумерный массив. Это массив, у которого каждый из элементов является тоже массивом. Посмотрим внимательнее: элементом под индексом 0 у массива ''digits'' является массив ''[1, 1, 1, 1, 1, 1, 0]''. Это перечисление состояний сегментов для отображения цифры 0. Порядок перечисления соответствует порядку в массиве ''segments''. Это важно и потребуется нам для отображения цифр.+В строке объявляем массив, в котором описываем цифры от 0 до 9 и какие сегменты должны светиться на индикаторе, чтобы эту цифру отобразить, а какие должны быть потушены. Для описания этого мы использовали двумерный массив. Это массив, у которого каждый из элементов является тоже массивом. Посмотрим внимательнее: элементом под индексом 0 у массива ''digits[0]'' является массив ''{1, 1, 1, 1, 1, 1, 0}''. Это перечисление состояний сегментов для отображения цифры 0. Порядок перечисления соответствует порядку в массиве ''segments''. Это важно и потребуется нам для отображения цифр. Для того, чтобы обратиться элементу массива состояний нужно использовать выражение такого вида''digits[0][0]'', оно вернет 1.
  
-В основном цикле программы мы перебираем все элементы массива ''digits'' с целью отображения на дисплее.  +В основном цикле программы мы с помощью цикла ''for'' перебираем цифры от 0 до 9 включительно и вызываем функцию ''draw_time(i)'' для каждой цифры. Обрати внимание на оператор меньше или равно ''%%<=%%'' в цикле ''for''.  
-<code python [enable_line_numbers="2", start_line_numbers_at="32"]> +<code arduino [enable_line_numbers="2", start_line_numbers_at="29"]> 
-while True: +void loop() { 
-    for digit in digits: +  for (int i = 0; i <= 9; i++) { 
-        draw_time(digit+    draw_time(i); 
-        time.sleep(1)+    delay(1000);  
 +  }   
 +}
 </code> </code>
  
-Рассмотрим код функции ''draw_time'', которая предназначена для отображения цифры, передаваемой ей в качестве параметра. Начнем с того, что разберемся что именно передается функции в качестве входных данных. Ей передается один из элементов массива ''digits'', каждый элемент которого, как мы помним, сам является массивом, описывающим состояние сегментов. +Рассмотрим код функции ''draw_time'', которая предназначена для отображения цифры, передаваемой ей в качестве параметра.
- +
-<code python [enable_line_numbers="2", start_line_numbers_at="24"]> +
-def draw_time(digit): +
-    for el in enumerate(digit): +
-        if (el[1]): +
-            Pin(segments[el[0]]).on() +
-        else: +
-            Pin(segments[el[0]]).off() +
-</code> +
- +
-Получается, что функция получила данные о том какие сегменты ей нужно включить, а какие выключить. Соответственно она должна это исполнить. Для этого она проходит по всем элементам массива сегментов, как обычно, с помощью оператора ''in'', но в этот раз мы использовали еще оператор ''enumerate''. Обычно оператор ''in'' перебирая элементы массива записывает в переменную содержимое элемента массива, его значение, а ''enumerate(digit)'' создает последовательность кортежей, состоящих из индексов и значений. В кортеже ''el'' в элементе 0 оказывается индекс, а в элементе 1 значение. +
- +
-Номер индекса нам нужен, чтобы обратиться по нему к нужному сегменту, а его значение, чтобы знать что с ним делать- зажигать или тушить+
  
-<code python [enable_line_numbers="2", start_line_numbers_at="26"]> +<code arduino [enable_line_numbers="2", start_line_numbers_at="16"]> 
-        if (el[1])+void draw_time(int digit) { 
-            Pin(segments[el[0]]).on() +  for (int i = 0; i < 7; i++) { 
-        else+    if (digits[digit][i]) digitalWrite(segments[i], HIGH); 
-            Pin(segments[el[0]]).off()+    else digitalWrite(segments[i], LOW);  
 +  }  
 +}
 </code> </code>
-Если сегмент должен быть включен (''el[1]'' истинно), то нужно его зажечь. Номер пина, который нужно включить записан в переменной ''segments'' в элементе с индексом, который мы берем из ''el[0]''. Именно поэтому мы сделали так, что последовательность пинов в массиве ''segments'' соответствует им в массиве ''digits'', чтобы у них были одинаковые индексы. 
  
-Не совсем обычным является и то, как мы зажигаем сегменты. ''Pin(segments[el[0]]).on()''. Обычно мы создавали объект ''Pin'', записывали его в переменную и оперировали с нейСейчас мы сделали тоже самое, только не создавали отдельную переменную, а сделали все сразу. Просто нам не нужна эта переменная в будущемпоэтому мы ее не создавали и для краткости записи сделали так.+Если сегмент должен быть включен ''(digits[digit][i])'', то нужно его зажечь. Номер пина, который нужно включить, записан в массиве ''segments'' в элементе с индексом ''i''Именно поэтому мы сделали такчто последовательность пинов в массиве ''segments'' соответствует им в массиве ''digits''чтобы у них были одинаковые индексы.
  
 <WRAP center round info 60%> <WRAP center round info 60%>
-  * [[https://younglinux.info/python/feature/enumerate|Подробнее об enumerate]] +  * [[https://alexgyver.ru/lessons/arrays/|Подробнее о массивах]]
-  * [[https://pythonworld.ru/tipy-dannyx-v-python/kortezhi-tuple.html|Подробнее о кортежах в Python]]+
 </WRAP> </WRAP>
 ==== Дополнительные задания ==== ==== Дополнительные задания ====