Python GPIO: This channel is already in use, continuing anyway

Такая ошибка чаще всего возникает, если пытаетесь включить/выключить ногу работа с которой уже ранее была начата.

Решение: после того как с пином поработали, необходимо сбросить работу с пинами. Как например делаю это я при работе с реле.

Включаем реле:

#!/usr/bin/python
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.OUT)
GPIO.output(9, False)

Выключаем реле:

#!/usr/bin/python
import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
GPIO.setup(9, GPIO.OUT)
GPIO.output(9, True)
GPIO.cleanup()

1С: Получение ссылки на перечисление по её синониму

Нехитрая задача, и решение простое, «в лоб»:

&НаСервере
Функция НайтиПеречислениеПоИмени(перечисление,перечисление_строка)	
	для каждого стр из перечисление цикл
		если строка(стр)=перечисление_строка тогда 
			возврат стр;
		конецесли;	
	конеццикла;	
	возврат перечисление.ПустаяСсылка();
КонецФункции

MySQL: вычисление значения на основе предыдущей выборки значения

Дано: в БД пишутся счетчики прошедших через интерфейс байт нарастающим итогом в байтах

Задача: вычислить загрузку канала в мбит/сек

Решение:

В данном случае нам поможет оконная функция LAG, которая позволяет затаскивать к текущему значению выборки, предыдущее. Например так:

select dt,(cur-pred)/60/1024 as mbit from (
    SELECT 
    dt,value as cur,
    LAG(value) OVER(PARTITION BY value_type order by value) as pred
    FROM m_data WHERE place=10 and source=12 and value_type=7 order by id desc
)  as zx

Эмулятор Arduino

Редко когда пишу хвалебные отзывы, но тут исключение, ибо наконец нашел хороший инструмент для отладки проектов на ардулино и иже с ними, без доступа к железу. Лично для меня большим не удобством было, что чтобы что-то попрограммировать, нужно обязательно иметь железку, и обязательно собрать схему «в железе». Что иногда долго и безобразно выглядеще. Итак оно: https://wokwi.com/. Прмямо «онлайн» выбираешь железку, собираешь схему и прямо там пишешь код и выполняешь его. Светодиоды моргают, датчики и дисплеи показывают. А вот когда уже отладил всё, собирай железку живьем на здоровье..

Пишем игру Питон на Python ;). Часть 3

Продолжаем начатое. Добавим в игру увеличение скорости если питон ест, и подсчет очков. Добавим переменные:

...
speed=500;          # начальная скорость питона
increase_speed=10;  # размер увеличения скорости при удачной еде
score=0;            # набранные очки в результате игры
score_color=(100,100,50)  # цвет очков
...

Интересный момент работы с таймером. По умолчанию time.time() отдает данные в секундах целые числа, и доли секунд в цифрах после запятой. Для того чтобы соответственно удобно считать миллисекунды, значения нужно умножать на 1000. Изменим код:

start_time=time.time()*1000
...
while running:
    if (time.time()*1000-start_time)>speed:
        start_time=time.time()*1000
        Draw_foods(screen)
        Draw_python(screen)
...

А теперь изменим функцию Draw_python, добавив отрисовку количества очков, а так-же увеличение скорости и количества очков при поедании:

...
global score,speed
..
        for element in foods:
            if [element[0],element[1]] == head_coor:
                del_tail=False
                foods.remove(element)
                speed=speed-increase_speed  # увеличиваем скорость питона
                score=score+element[0]      # увеличиваем очки в зависимости от типа сожранного
...
 # Рисую набранные очки
    pygame.draw.rect(screen,(0,0,0),(width_field,0,width_field+300,100))
    img = font.render(f'Очки: {score}', True, score_color)
    screen.blit(img, (width_field+10, 20))
...

Добавим еще штрих — сделаем реакцию на столкновение со стенами поля, а именно чтоб питон переходил на левый край при столкновении с правым и т.д.,

...        if (head_coor[0]>size_x):
            head_coor[0]=1;
        if (head_coor[1]>size_y):
            head_coor[1]=1;
        if (head_coor[0]<0):
            head_coor[0]=size_x;
        if (head_coor[1]<0):
            head_coor[1]=size_y;
...

Теперь не хватает последнего: проигрыша в случае столкновения головы с хвостом. Объявим глобальный цикл в котором будет крутится игра, в нём разместим цикл игры. При проигрыше выводим вопрос «Вы проиграли хотите еще (Y/N)» Если игрок выбирает Y, то из глобального цикла не выходим, иначе покидаем глобальный цикл.

gloop=True
while gloop: # глобальный цикл
    pygame.init()
    ...
    font = pygame.font.SysFont(None, 24)
    while running: # цикл игры
        if (time.time()*1000-start_time)>speed:
            start_time=time.time()*1000
...
 # здесь оказываемся когда проиграли...
    pygame.draw.rect(screen,(200,100,5),(50,50,width_field-50,100))
    img = font.render(f'Вы проиграли. Сыграем еще партию? (Y/N)', True, score_color)
    screen.blit(img, (100, 80))
    pygame.display.flip()
    pygame.display.update()
    running = True
    while running:
        for event in pygame.event.get():
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_y:
                    moved_direction_x = 0
                    moved_direction_y = 0
                    speed=500
                    score=0
                    gloop=True
                    running=False
                if event.key == pygame.K_n:
                    gloop=False
                    running = False
print("нормально вышли")

Окончательную версию игры можно скачать здесь

1 37 38 39 40 41 310