Программирование на Python «для тупых» 007.1 Делимся кодом

Как делиться кодом на в комментариях на сайтах, если плывёт форматирование или код не влазит в сайт, а файл прикреплять нельзя? Используйте сервисы для публикации кода!
Как делиться кодом на в комментариях на сайтах, если плывёт форматирование или код не влазит в сайт, а файл прикреплять нельзя? Используйте сервисы для публикации кода!
Что-то с YouTube вставляться не хочет, ошибку выдаёт. Так что вставлю с ВК, но на Youtube так же есть https://youtu.be/9EKUjKoVpEI
Проверяем домашнее задание по переводу данных из типа «целое число» или «вещественное число» в тип «строка» с помощью функции str()
00:00 Вступление
00:27 1 задание
06:07 2 задание
09:53 3 задание
12:50 4 задание
14:53 5 задание
19:17 Финал
Мы научились преобразовывать строку (текст) в число, теперь научимся делать обратное, чтобы полностью управлять выводом
00:00 Приветствие и новости
01:43 Пример с проблемой
05:00 Функция str()
12:35 Другой пример
20:25 Необязательный бонус
25:16 ДЗ
30:30 Анонс следующей темы
Ссылочки на меня:
@vrom1990
Итак, какие новости. Курс «Программирование на Python „для тупых“» загружен
- в Телеграм https://t.me/vrom1990pb
- в Яндекс.Дзен https://zen.yandex.ru/vrom1990
- во ВКонтакте https://vk.com/vrom1990pb
- на вебархив https://archive.org/details/python-tupyh
Лицензию везде, где можно, выставил на CC BY 4.0. То есть бесплатно, можно хоть скачивать (ну на вебархив только загружайте), нарезать на болванки и продавать, если при этом моё авторство указывается, вы не ограничиваете права других на курс и вы не заявляете, что я лично поддерживаю вас в ваших действиях (если я этого не делал).
Подписывайтесь где хотите, комментарии пишите где хотите. Буду выкладывать везде.
Кто хочет материально поддержать меня, тот может подписаться на Яндекс.Дзен и читать и лайкать там, так как за это я получаю небольшие выплаты. Либо разово отправить деньги на виртуальный счёт, я завёл виртуальный кошелёк+карту.
Про стримы написало только два человека пока, думаю на следующей или послеследующей неделе попробую один анонсировать так, но не ожидаю, что особо кто-то будет
Объясняю «для тупых» переменные — способ быстро объяснить Python, как запомнить что-то и потом использовать
0:00 Приветствие и благодарности
0:55 Что было на прошлом занятии
2:25 Про запоминание и память компьютера
6:41 Создаём переменную в консоли
9:25 Про имена переменных
10:45 Создаём и используем переменную в коде
15:30 Как записать в переменную ответ на вопрос
18:45 Комбинируем переменные с простым текстом
23:36 Соединяем просто текст и текст из переменной плюсом
35:48 Итоги
37:45 Домашка
Наверное любой кто занимался "умнизацией" своего жилища, задумывался или даже сделал "умный" домофон, а точнее своё абонентское устройство координатного домофона в квартире. Я не стал исключением и тоже решил сделать своё.
Почему своё, а не уже придуманное кем-то? Всё потому что: 1. Идеи заложенные в уже придуманные немного не входили в мои планы, и не все функции реализованы. 2. Как-то колхозно всё реализовано и с большими вопросами к элементной базе и габаритам устройств.
Итак, чего же тебе не хватает, сабака? - Все придуманные варианты, которые я смог найти в этих ваших интернетах:
1. Наследовали принцип - разобрать трубку, перерезать дорожки, подпаяться к контактам и прочие непотребства нацеленные на порчу абонентского устройства.
2. Использовали куеву тучу реле и/или оптопар.
Тоесть: Берём несколько реле и подпаиваем их выходы к геркону - для эмуляции снятия трубки, к кнопке - для открытия, еще реле к линии зачем-нибудь. Оптопару на линию для детекции (это понятно), и прочее прочее... Фу так делать. Схема получается хоть и простая, но габаритная.
3. Никто не реализовал передачу аудио сигнала на блок вызова.
В связи с этим, мои требования были такие:
1. Устройство (печатная плата) должна влезать в обычную монтажную телефонную коробку. Это значит что сразу готовый корпус, а также подключение линии и телефона можно выполнить нормальным способом, а не так как "было" - на соплях примотали толстую медную лапшу на тонкую многожилку провода трубки. Провод трубки обжимается разъемом RJ11, вставляется в розетку девайса, а там нормально клеммами прижимается к плате.
2. Передача аудио сигнала на блок вызова.
3. Минимально возможное использование релюх или оптопар.
Поставив цель стало ясно, что раз я не хочу ломать трубку, а так же передавать аудио сигнал и управление открытием, надо делать её полный эквивалент.
Начинаю шуршать схемы трубок. И после детального изучения принципов работы, что и за что отвечает - делаю вывод: Все схемы трубок координатных домофонов идентичны где-то на 90% как бы по разному из не рисовали. Беру за основу ту. которая мне показалась наиболее удобна для понимания.
И начинаем в ней разбираться. Геркон не надо, Динамик не надо, значит "схему его обвязки" тоже не надо. Резисторы 100-ки не надо, тумблер тоже.
Кнопка открытия... Зачем там люди реле ставят?... транзистор же нужен.
Микрофон... Как подать сигнал. Да просто. Микрофон электретный, а значит это по сути транзистор. Вот и поставим туда транзистор, только через 10 кОм, что бы сигнал по громкости не завалило. Немного поколдовав схему в ИзиИдея получаем:
Далее, детектор линии. Тут без оптопары не обойтись. Ну на схеме трубки есть диод индикации через 10кОм, делаем аналогично. Вход на светодиод, Выход на ногу ESP.
Теперь, как ни крути, но одно реле понадобится. Задача которого состоит в том, чтобы в выключенном состоянии коммутировалась на линию трубка, а во включенном наша схема. Я долго пытался найти решение как тут отказаться от реле, но всё сходилось к тому, что если нет питания, никакой коммутации не будет, т.е. если устройство по какой-либо причине не запитано, то домофон вообще не работает. Эх ладно, пусть будет одно реле =( к счастью нашлась одна миниатюрная релюшка от OMRON.
Теперь задача самая весёлая. развести всё это хозяйство и нужные габариты. Очень маленькие габариты. Разводим, заказываем, паяем, получаем:
Моя система умного дома - это HomeAssistant. Значит писать будем под ESPHome. (MQTT-шники, лишний брокер - это ваш выбор. Мой выбор ESPHome).
Всё бы было хорошо, если бы ни два НО:
1. Хоть маленькая заметка о том как воспроизвести звук на ESPHome используя библиотеку ESP8266Audio и есть, но она не работает, а точнее, там много не описано и досказано. Пришлось додумывать самому.
2. Ни одной статьи как использовать LittleFS в ESPHome нет. Пришлось всё решать самому.
Как итог:
Прошивка написана, всё работает как и положено.
В HomeAsistant карточка выглядит так:
А поскольку у меня имеется аж 2 Алиса-станции мини, и они умеют взаимодействовать с этой системой, то и домофоном теперь можно управлять голосом.
Ссылка на прошивку: https://github.com/SCratORS/SmartIntercom
Если у Вас тоже есть вопросы как работать с LittleFS и воспроизводить из нее Аудио файлы в ESPHome - Это для Вас.
Ссылка на схему: https://easyeda.com/scrators/intercom
Спасибо за внимание. Надеюсь кому-нибудь пригодится
Здравствуйте, вопрос к профессионалам и сведующим людям. Дочь 9 лет, интересуется компами, информатикой и программированием, подскажите пожалуйста, с чего лучше начать ребенку, покурил гугл, сейчас ей устанавливаю Scratch, стоит ли? Сам в детстве дальше Бейсика и Фортрана не ушел, но это ж уже не актуально. Прошу камнями не кидать.
Доброго времени суток!
Да, может уже надоело по ШИМ, но я хочу закончить этот ШИМ для себя и оставить немного полезностей.
В первой части программного ШИМа, уважаемый @Begemot911 подкинул одну занимательную статейку (если интересно - ссылку найдете там же), а именно про то, что analogWrite довольно медленный в силу своей универсальности, и для того что бы его ускорить, нужно просто ручками вписать в нужный таймер в нужный регистр сравнения значение скважности (в таймер, или подключить вывод нужного таймера, - не знаю как это правильно сказать). Да, это действительно ускоряет результат, но нужно знать какой таймер, какой регистр, какой бит порта, и пока analogWrite все это определит и получается задержка.
Так же в статейке написано как "подключить таймер", и как "записать значение в регистр", по сути это просто скопировано из исходника.
Я тут же решил проверить, как это работает в реалиях,.. и да... это работает, если все нужные данные известны. И вот мне пришла в голову мысль, - а если написать заранее все функции записи в каждый таймер/регистр, и запилить их указатели в один массив. Казалось бы затея простая, но гугл сказал - "давай ты сам", возможно, я гуглить разучился.
Спустя полчаса-час мучений и баданий с Arduino IDE, его компилятор сказал, что он понял чего я хочу, и скомпилировал код.
Что получилось на практике - Если записать сначала скважность хотя бы 1, то потом, записав 0 - на выходе все-равно есть сигнал. Вообщем перед записью значений 0 и 255 надо бы еще и ШИМ выключить (в статейке про это сказано, что типа нефиг писать 0 и 255) - да, логично, но я чот подумал что если в порт на этот пин записать 0 или 1, то ШИМ сам отключится - *индейская народная изба*. Ладно, берем все необходимое, и пишем код:
Взять код можно на github.com
Как работает котэ:
Дефайны - просто определяют cbi и sbi, ничего интересно, все это знают.
Есть 6 функций, каждая и которых отвечает за свой пин (3, 5, 6, 9, 10, 11), по порядку. Алгоритм функции таков: сначала порт переводится в режим OUTPUT, затем, если задаваемое значение скважности 0 или 255, то отключается режим ШИМ, и в порт пина записывается 0 или 1, иначе, включается ШИМ на нужное значение скважности. В общем и целом, вся логика сделана такая же как и у analogWrite, только без всех проверок и прочих определений, все только по факту.
Далее определяем массив из указателей на эти функции. Делается это так:
void ( * название_массива_функции[])(типы_условных_параметров) = {&название_функции_1, &название_функции_2 ... и т.д.}
Как я понял, можно использовать функции с разными параметрами, но тут я не нашёл ответа как, понял только, что если будет функция без параметров в массиве функций с параметрами, то ничего страшного, а вот если разное количество параметров, разного типа - то ответа я не нашёл.
Конечно же, если у вас не Nano, а что-то более жирное, то можно добавить свои функции
И получаем вот такую удобную конструкцию.
Например надо на все пины ШИМ, подать какие-либо значения скважности
Определяем значения скважности в массив
byte valueMass[]=;
и банальным FORэм передаем все значения в функции
for(byte i=0;i<6;i++) analogFastWrite[i](valueMass[i]);
Вот и всё!
Я думаю что существует способ обойтись без FOR и передать значения как-то напрямик, но я пока не нашёл как. Если кто знает, напишите в комментариях, очень требуется.
Наверняка кому-нибудь пригодится, если не вариация замены analogWrite, то пример как сделать массив из указателей на функции в Arduino IDE.
Доброго всем времени суток!
В связи с оглушительным успехом первой части аппаратного ШИМа, я решил, что не стоит останавливаться, и хочу поделиться еще одним вариантом реализации данного действа, но чуть более издевательского. А читая комментарии к первой части, я сделал для вывод, что не стоит пытаться реализовать код универсально, кому надо - тот сам все сделает под свои цели. Ну что же, так и поступим.
Да простит меня сообщество, - не вижу смысла заливать код куда либо, если там несколько строк:
Итак, котэ работает на 2 прерываниях, одно прерывание срабатывает при совпадении, другое при переполнении. Т.е. когда сработало прерывание по переполнению, а значит таймер обнулился, - на пин подается высокий уровень. Когда таймер досчитал до значения регистра сравнения - вызывается прерывание по совпадению, в котором на пин подается низкий уровень. И таймер продолжает считать дольше, пока не вызовет прерывание по переполнению. И так по кругу.
Пройдемся по алгоритму:
Допустим, хотим ШИМ на D13, смотрим табличку вначале... D13 - это первая таблица, она относится к PORTB и регистр настроек DDRB, В самой верхней шапке - управляющие биты, ПИНу D13 соответствует байт 32 (если так можно сказать), разложив его в бинарный код, будет 00100000 , это 6 бит,.. но нам надо записать в переменную bit число 32.
Далее, прописываем нужные порты и регистры.. т.е. в блоке setup - DDRB и в прерываниях таймеров прописываем порты PORTB.
Соответственно, если порты и регистры будут не B, а например на аналоговых пинах - это С, то пишем вместо DDRB - DDRC, вместо PORTB - PORTC.
Для более простой настройки, конечно же можно это все переопределить в define.
Для установления значения скважности, нужно значение скважности записать в регистр сравнения, в данном примере используется таймер 2, канал B, значит записываем OCR2B = 0-255. Максимально 255, т.к. таймер 2 - 8 битный. Нужно ли вызывать перед записью значений запрет прерываний cli(); и их разрешение sei(); после - каждый решает сам, от требований поставленной задачи.
Вот и всё.
Приветствую всех!
Сегодня я хочу затронуть тему реализации программного ШИМ на Ардуино НАНО.
Бывают такие моменты, что надо ШИМ там где его нет, например на Аналоговых пинах.. почему нет?
Что такое ШИМ я затрагивал ТУТ, Напомню в краце: ШИМ - это отношение высокого и низкого сигнала за какой-либо период, который называется частотой ШИМ.
Картинка из интернетов:
И вот понадобилось мне сделать ШИМ там, где его нет в Ардуине.
Да простит меня сообщество, - не вижу смысла заливать код куда либо, если там несколько строк:
Котэ работает на прерывании по таймеру2, так как на нем висит Аппаратный ШИМ пинов 3 и 11, то никаких критичных "базовых" функций этим не испортим.
Значит в блоке setup просто переводим таймер в режим работы по CLK, т.е. 16 мГц, и разрешаем прерывание по таймеру.
Для включения ШИМ на каком-либо пину делаем так: в массиве пинов пишем пины какие надо, через запятую,.. ну там и тд...
Затем в Массиве значений ШИМ записываем им всем начальное значение, лучше нули, ... т.е. - 4 Пина юзаем, 4 значения записали,.. хотя наверное можно вообще не писать, они и так при инициализации нулями будут..
Ну а дальше в цикле программы, когда нужно записываем в переменную нужное значение, т.е. надо на пин A0 подать 50%, - пишем PWM_pins[1] = 127; обьясняю: в 1 ячейке массива пинов записан A0,.. 127 - это половина от 255 (0-255 значения). Вот и всё.
Надеюсь кому поможет.
Вечер добрый.
Подскажите, есть ли у программистов-фрилансеров потребность в человеке, который бы вёл переговоры с заказчиками за плату?
Работаю аналитиком и интересно, мог бы я помогать фрилансерам работать, принимая на себя все мутные переговоры и неадекватный негатив заказчиков? Речь про удалённую работу.
Здравствуйте. У меня возник вопрос, насчёт моих постов с анонсами игр и я прошу совета у вас. Как лучше поступить: И дальше постить по обзору на каждую из моих игр, или же сделать один пост, про все мои игры, но с очень кратким описанием? Также могу выкладывать обзоры на самые интересные игры: Как и с Scratch так и с Пикабу (т.е. те игры которые сделали вы),но опять же всё зависит от вашего выбора.
Здравствуйте, я делаю игры в Scratch. Scratch-визуальная объектно-ориентированная среда программирования. На данный момент у меня на официальном сайте Scratch 93 проекта, 40 из которых-игры И у меня возник вопрос, если я буду выкладывать анонсы лучших из моих игр, то это будет кому-то интересно?
Думаю многие из вас видели рекламу сайта geekbrains. и наверняка некоторые решили для себя, что сайт шикарный, а вот материал откровенное говно. Ну так вот, если вы из Москвы, рекомендую компьютерные курсы вмк МГУ. Сайт конечно убогий, но объем материала и его подача шикарна. Про С/С++ написал, потому как по факту это база, и для изучения других языков она очень полезна. Прошу не минусить так как помню себя, как искал грамотных преподавателей. И найти место, где дадут реальные знания найти не так и просто.