Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
products:laboratory_iot:exp28 [2021/04/25 16:12] – labuser29 | products:laboratory_iot:exp28 [2024/11/15 13:32] (текущий) – [Программный код эксперимента] labuser30 | ||
---|---|---|---|
Строка 15: | Строка 15: | ||
// | // | ||
+ | ==== Программный код эксперимента ==== | ||
+ | <file python Exp28.py[enable_line_numbers=" | ||
+ | from machine import Pin | ||
+ | import time | ||
+ | import random | ||
+ | _init() | ||
+ | |||
+ | button = Pin(0, Pin.IN) | ||
+ | state_old = 1 | ||
+ | |||
+ | segments = [14, 13, 4, 5, 12, 16, 15] # ABCDEFG | ||
+ | |||
+ | for s in segments: | ||
+ | led = Pin(s, Pin.OUT).off() | ||
+ | |||
+ | digits = [ | ||
+ | [1, 1, 1, 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 | ||
+ | [1, 0, 1, 1, 0, 1, 1], # 5 | ||
+ | [1, 0, 1, 1, 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 | ||
+ | ] | ||
+ | |||
+ | def bit_summ(data): | ||
+ | count = 0 | ||
+ | while data: | ||
+ | count += data & 1 | ||
+ | data >>= 1 | ||
+ | return count | ||
+ | |||
+ | def draw_digit(digit): | ||
+ | for el in enumerate(digits[digit]): | ||
+ | if (el[1]): | ||
+ | Pin(segments[el[0]]).on() | ||
+ | else: | ||
+ | Pin(segments[el[0]]).off() | ||
+ | |||
+ | |||
+ | while True: | ||
+ | new_state = button.value() | ||
+ | if new_state == 0 and state_old == 1: | ||
+ | rand_bits = random.getrandbits(5) | ||
+ | rand_digit = bit_summ(rand_bits) | ||
+ | rand_digit+=1 | ||
+ | draw_digit(rand_digit) | ||
+ | state_old = new_state | ||
+ | </ | ||
+ | |||
+ | Импортируем библиотеку для работы со случайными числами | ||
+ | <code python [enable_line_numbers=" | ||
+ | import random | ||
+ | </ | ||
+ | |||
+ | Объявляем переменные и настраиваем кнопку. | ||
+ | <code python [enable_line_numbers=" | ||
+ | button = Pin(0, Pin.IN) | ||
+ | state_old = 1 | ||
+ | </ | ||
+ | |||
+ | В переменной '' | ||
+ | |||
+ | Рассмотрим основной цикл программы: | ||
+ | <code python [enable_line_numbers=" | ||
+ | while True: | ||
+ | new_state = button.value() | ||
+ | if new_state == 0 and state_old == 1: | ||
+ | rand_bits = random.getrandbits(5) | ||
+ | rand_digit = bit_summ(rand_bits) | ||
+ | rand_digit+=1 | ||
+ | draw_digit(rand_digit) | ||
+ | state_old = new_state | ||
+ | </ | ||
+ | |||
+ | В бесконечном цикле программа ждет нажатия на кнопку '' | ||
+ | <code python [enable_line_numbers=" | ||
+ | rand_bits = random.getrandbits(5) | ||
+ | </ | ||
+ | |||
+ | После выполнения этой строки в переменной '' | ||
+ | |||
+ | Чтобы просуммировать биты напишем функцию '' | ||
+ | <code python [enable_line_numbers=" | ||
+ | def bit_summ(data): | ||
+ | count = 0 | ||
+ | while data: | ||
+ | count += data & 1 | ||
+ | data >>= 1 | ||
+ | return count | ||
+ | </ | ||
+ | |||
+ | Функция принимает в качестве параметра число и возвращает сумму его бит. Но, как мы помним, | ||
+ | |||
+ | <code python [enable_line_numbers=" | ||
+ | rand_digit = bit_summ(rand_bits) | ||
+ | rand_digit+=1 | ||
+ | </ | ||
+ | |||
+ | Полученное число выводим на индикатор с помощью функции '' | ||
+ | <code python [enable_line_numbers=" | ||
+ | draw_digit(rand_digit) | ||
+ | </ | ||
+ | Данная функция полностью скопирована из предыдущего эксперимента без изменений, | ||
+ | |||
+ | ==== Дополнительные задания ==== | ||
+ | |||
+ | <WRAP center round tip 60%> | ||
+ | * Добавь визуальный эффект, | ||
+ | </ |