Найти - Пользователи
Полная версия: Управление 8 канальным реле на Raspberry Pi (GPIO) c GUI
Начало » GUI » Управление 8 канальным реле на Raspberry Pi (GPIO) c GUI
1
Rauf
Здравствуйте!
Прошу оказать помощь. Мне удалось написать программу для управления реле на Raspberry Pi, но не удаётся правильно написать код так чтобы каждая кнопка могла выполнять два действия (сравнивать состояние реле и менять его состояние на противоположное), а также вид самой кнопки. ниже прилагаю код, опыт проводил только над первой кнопкой.
За ранее благодарю.

doza_and
По идее вы тут должны не кнопку использовать а чекбокс.
На ваш код без слез смотреть невозможно. Откройте для себя циклы.
Rauf
doza_and
По идее вы тут должны не кнопку использовать а чекбокс.На ваш код без слез смотреть невозможно. Откройте для себя циклы.
Подскажите пожалуйста на примере одной кнопки. Дальше я сам отредактирую.
Rauf
Подскажите прошу почему нет реакции на события кнопок, код не выдаёт ошибки.
doza_and
Rauf
Подскажите прошу почему нет реакции на события кнопок
Rauf
код не выдаёт ошибки.
Очень даже выдает. Как вы смотрите? Смотрите в консоли что получается.

Ошибки
1 tkinter - существенен регистр букв модуля.
2 grid ничего не возвращает

Как я уже упоминал, ваш код обладает недостатками.

Вот как у вас:
from time import sleep
from tkinter import *
def R10Quit(event):
    global root
    root.destroy()
def R1Off(event):
    print ("SYSTEM OFF")
def R1On(event):
    print ("RELAY 1 - ON")
[code python][/code]
def R2Off(event):
    print ("RELAY 2 - OFF")
def R2On(event):
    print ("RELAY 2 - ON")
def R3Off(event):
    print ("RELAY 3 - OFF")
def R3On(event):
    print ("RELAY 3 - ON")
....

Обычно такое называют говнокод. Никому не охота среди десяктов накопипащеных строк искать ошибку. Вы ведь в любом месте можете ошибиться в одной букве и оно не будет работать.

Что вам мешает выразить свою мысль более четко. Оно и вам время сэкономит и нам. Общие действия выносите в функции, пользуйтесь циклами, как я вам ранее уже говорил.
from Tkinter import *
def Quit(event):
    global root
    root.destroy()
def R9Reset(event):
    print ("SYSTEM SHUTDOWN")
class pts:
    def __init__(self,msg):
        self.msg=msg
    def __call__(self,event):
        print(self.msg)
root = Tk()
def bb(txt,i,j,f=None,bg='black'):
    btn = Button(root, text=txt,width=25,heigh=2,bg=bg,fg='red',font='arial 16')
    btn.grid(row=i, column=j)
    if f is None:
        f=pts(txt)
    btn.bind("<Button-1>",f)
    return btn
rbtn=[[bb("Relay {} ON".format(i+1),i,0),bb("Relay {} OFF".format(i+1),i,1)] for i in range(8)]
last=[bb("RESET",i+1,0,R9Reset,'grey'),bb("QUIT",i+1,1,Quit,'grey')]
root.title('Relay Button')
root.mainloop()

Не воспринимайте это как образец, нужны адекватные названия функций и много чего еще, это иллюстрация идей которые вы можете использовать. Даже в таком виде код в 3 раза короче чем у вас.

p.s.
не мучайте себя, для вашей задачи и консольный интерфейс достаточен. считываете в цикле букву и используете ее для упрвления разными реле. например цифры 1-9 для релюшек Q для выхода. Поверьте реальные кнопки на клавиатуре намного удобнее чем виртуальные на экране монитора.





Rauf
doza_and
Огромное человеческое спасибо! Буду изучать данный код чтобы понять его каждое значение. Постараюсь дописать команды управления портами GPIO на Raspbbery Pi.
Rauf
doza_and
Увы извилин не хватило на Ваш код. Мне необходима помощь в корректировки кода над одной кнопкой.
Для облегчения опишу сокращения которые я использовал в коде.

but1 до but9 - название создаваемых графических кнопок.
buta1 до buta9 - это код выполняемый при нажатии кнопки мыши на графическую кнопку
rele1 до rele8 - переменные для использования их как я пытался в случае с def buta1(event):

Цель программы клик по одной из 8 графическим кнопкам для управления реле. Сравнения при нажатии если реле (если реле включено то отключить и сменить его надпись и цвет) противоположно при отключённом состоянии.


from time import sleep
from tkinter import *
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.IN)
GPIO.setup(18, GPIO.IN)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
GPIO.setup(31, GPIO.OUT)
GPIO.setup(33, GPIO.OUT)
GPIO.setup(35, GPIO.OUT)
GPIO.setup(37, GPIO.OUT)
           
root = Tk()
rele1 = int(0)
rele2 = int(0)
rele3 = int(0)
rele4 = int(0)
rele5 = int(0)
rele6 = int(0)
rele7 = int(0)
rele8 = int(0)
z = int(1)
def buta1(event):
   for rele1 in range (0, 1):
      if rele1 == 0:
       print ("RELE 1 - ON")
       GPIO.output(11, 0)
       but1.configure(text='Rele 1 - ON',bg='green',fg='red',font='arial 16')
       rele1 = rele1 + 1
       break
   else:
       print ("RELE 1 - OFF")
       GPIO.output(11, 1)
       but1.configure(text='Rele 1 - OFF',bg='black',fg='red',font='arial 16')              
       rele1 = rele1 - 1
       
def buta2(event):
       print ("RELE 2 - ON")
       GPIO.output(12, 0)
       but2.configure(text='Rele 2 - ON',bg='green',fg='red',font='arial 16')
       
def buta3(event):
       print ("RELE 3 - ON")
       GPIO.output(13, 0)
       but3.configure(text='Rele 3 - ON',bg='green',fg='red',font='arial 16')
       
def buta4(event):
       print ("RELE 4 - ON")
       GPIO.output(15, 0)
       but4.configure(text='Rele 4 - ON',bg='green',fg='red',font='arial 16')
       
def buta5(event):
       print ("RELE 5 - ON")
       GPIO.output(31, 0)
       but5.configure(text='Rele 5 - ON',bg='green',fg='red',font='arial 16')
       
def buta6(event):
       print ("RELE 6 - ON")
       GPIO.output(33, 0)
       but6.configure(text='Rele 6 - ON',bg='green',fg='red',font='arial 16')
       
def buta7(event):
       print ("RELE 7 - ON")
       GPIO.output(35, 0)
       but7.configure(text='Rele 7 - ON',bg='green',fg='red',font='arial 16')
       
def buta8(event):
       print ("RELE 8 - ON")
       GPIO.output(37, 0)
       but8.configure(text='Rele 8 - ON',bg='green',fg='red',font='arial 16')
           
def buta9(event):
       print ("SYSTEM OFF")
       but9.configure(bg='red')
       GPIO.output(11, GPIO.HIGH)
       sleep(0.1)
       GPIO.output(12, GPIO.HIGH)
       sleep(0.1)
       GPIO.output(13, GPIO.HIGH)
       sleep(0.1)
       GPIO.output(15, GPIO.HIGH)
       sleep(0.1)
       GPIO.output(31, GPIO.HIGH)
       sleep(0.1)
       GPIO.output(33, GPIO.HIGH)
       sleep(0.1)
       GPIO.output(35, GPIO.HIGH)
       sleep(0.1)
       GPIO.output(37, GPIO.HIGH)
       sleep(0.1)
       but1.configure(text='Rele 1 - OFF',bg='black',fg='red',font='arial 16')
       but2.configure(text='Rele 2 - OFF',bg='black',fg='red',font='arial 16')
       but3.configure(text='Rele 3 - OFF',bg='black',fg='red',font='arial 16')
       but4.configure(text='Rele 4 - OFF',bg='black',fg='red',font='arial 16')
       but5.configure(text='Rele 5 - OFF',bg='black',fg='red',font='arial 16')
       but6.configure(text='Rele 6 - OFF',bg='black',fg='red',font='arial 16')
       but7.configure(text='Rele 7 - OFF',bg='black',fg='red',font='arial 16')
       but8.configure(text='Rele 8 - OFF',bg='black',fg='red',font='arial 16')
       but9.configure(text='RESET',bg='black',fg='red',font='arial 16')
but1 = Button(root, text='Rele 1 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but1.bind("<Button-1>",buta1)
but1.grid(row=0,column=1)
but1.pack(side=TOP)
but2 = Button(root, text='Rele 2 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but2.bind("<Button-1>",buta2)
but2.grid(row=1,column=1)
but2.pack(side=TOP)
but3 = Button(root, text='Rele 3 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but3.bind("<Button-1>",buta3)
but3.grid(row=2,column=1)
but3.pack(side=TOP)
but4 = Button(root, text='Rele 4 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but4.bind("<Button-1>",buta4)
but4.grid(row=3,column=1)
but4.pack(side=TOP)
but5 = Button(root, text='Rele 5 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but5.bind("<Button-1>",buta5)
but5.grid(row=4,column=1)
but5.pack(side=TOP)
but6 = Button(root, text='Rele 6 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but6.bind("<Button-1>",buta6)
but6.grid(row=5,column=1)
but6.pack(side=TOP)
but7 = Button(root, text='Rele 7 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but7.bind("<Button-1>",buta7)
but7.grid(row=6,column=1)
but7.pack(side=TOP)
but8 = Button(root, text='Rele 8 - OFF',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but8.bind("<Button-1>",buta8)
but8.grid(row=7,column=1)
but8.pack(side=TOP)
but9 = Button(root, text='RESET',width=25,heigh=2,bg='black',fg='red',font='arial 16')
but9.bind("<Button-1>",buta9)
but9.pack(side=TOP)
root.mainloop()
den4ik
Вот мой тестовый код для RPi.GPIO, только ui сделан на Kivy. Но принцип создания кнопок в цикле думаю понятен.
ps. почему-то режутся переносы( с нормальным форматированием
from kivy.app import App
from kivy.uix.stacklayout import StackLayout
from kivy.uix.togglebutton import ToggleButton
from kivy.logger import Logger
try:
    import RPi.GPIO as GPIO
    Logger.info('GPIO lib installed and initialized')
    GPIO_SETTINGS = {
        '16': GPIO.IN,
        '18': GPIO.IN,
        '11': GPIO.OUT,
        '12': GPIO.OUT,
        '13': GPIO.OUT,
        '15': GPIO.OUT,
        '31': GPIO.OUT,
        '33': GPIO.OUT,
        '35': GPIO.OUT,
        '37': GPIO.OUT,
    }
except (ImportError, RuntimeError):
    # это для теста на десктопе
    Logger.error('GPIO lib not installed')
    GPIO = None
    GPIO_SETTINGS = {
        '16': None,
        '18': None,
        '11': None,
        '12': None,
        '13': None,
        '15': None,
        '31': None,
        '33': None,
        '35': None,
        '37': None,
    }
class TestApp(App):
    def on_start(self):
        if GPIO:
            GPIO.setmode(GPIO.BOARD)
            for k, v in GPIO_SETTINGS.items():
                GPIO.setup(int(k), v)
        else:
            Logger.warning('GPIO lib not initialized')
    def build(self):
        lay = StackLayout()
        for k, v in GPIO_SETTINGS.items():
            tb = ToggleButton(id=k, text=k, size_hint=(None, 0.15))
            tb.bind(state=self.on_button)
            lay.add_widget(tb)
        return lay
    def on_button(self, instanse, value):
        relay_state = 1 if instanse.state == 'down' else 0
        if GPIO:
            Logger.info('GPIO [{0}] set to {1}'.format(instanse.id, relay_state))
            GPIO.output(int(instanse.id), relay_state)
        else:
            Logger.warning('GPIO [{0}] not set to {1}'.format(instanse.id, relay_state))
            Logger.warning('GPIO lib not initialized')
if __name__ == '__main__':
    TestApp().run()
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB