Изменение переменных на основе полезной нагрузки MQTT для Raspberry Pi 3B + - PullRequest
0 голосов
/ 04 марта 2020

Итак, я пытаюсь изменить сигнал ШИМ на основе полезной нагрузки сообщений, отправленных брокером MQTT. Мой клиентский код выглядит так:

import paho.mqtt.client as mqtt #import the client1
import RPi.GPIO as g
############

g.setmode(g.BCM)  
g.setup(24, g.OUT)
p= g.PWM(24, 1)
p.start(10)

#Recibimos esta confirmacion cuando recibimos respuesta de conexion con el servidor
freq=1
duty=10

def on_connect(client, userdata, flags, rc):  ##Creamos la funcion 'on_connect'
    print("Connected with result code " +str(rc))
#Una vez conectados, nos suscribimos a los topicos
    client.subscribe("CoreElectronics/test")  #suscripcion a test
#Cada uno de estos topics debe mandarnos un mensaje, en este caso
    #'test' nos devuelve 'Hello'
    #'topic' nos devuelve 'World!'

##Recibimos esta confirmacion cuando nos llega un mensaje del servidor

def on_message(client, userdata, msg):     #Creamos la funcion 'on_message'
    msg.payload=msg.payload.decode("utf-8")
    print(msg.topic+ " " +str(msg.payload))

    if msg.payload == "f":  #Respuesta del primer topic
        freq= freq+2
        p.ChangeFrequency(freq)
        print("Recieved Frequency increment, LED frequency is now: ", freq)


    if msg.payload == "d": #Respuesta del segundo topic
        if freq==1:
            freq=freq
            print('The frequency is minimal!')
        else:
            freq= freq-2
            print("Recieved Frequency decrement, LED frequency is now: ", freq)
            p.ChangeFrequency(freq)

    if msg.payload == "l": #Respuesta del segundo topic
        if duty==100:
            duty=duty
            print('The Duty Cycle is maximum!')
        else:
            duty= duty+10
            p.ChangeDutyCycle(duty)
            print("Recieved Duty Cycle increment, LED duty is now: ", duty)


    if msg.payload == "k": #Respuesta del segundo topic
        if duty==1:
            duty=duty
            duty()
            print('The Duty Cycle is minimal!')
        else:
            duty=duty-10
            duty()
            p.ChangeDutyCycle(duty)
            print("Recieved Duty Cycle decrement, LED duty is now: ", duty)

#Creamos un cliente MQTT y le adjuntamos rutinas

client = mqtt.Client()  #Aqui creamos un cliente de mqtt, llamado 'client'
freq=freq
duty=duty
client.on_connect = on_connect
client.on_message = on_message
client.connect("mqtt.eclipse.org", 1883,60) # Nos conectamos a esta direccion
client.loop_forever()  #El cliente se ejecutara indefinidamente

А мой издатель выглядит так:

import paho.mqtt.publish as publish
while 1: publish.single("CoreElectronics/test", input(), hostname= "mqtt.eclipse.org")

Суть этих программ в том, чтобы я отправлял символьные входы от Брокера к Клиенту чтобы изменить значения 'freq' и 'duty' для управления ШИМ, который питает светодиод. К сожалению, безрезультатно. Клиентская программа печатает только:

CoreElectronics/test f #this last character changing depending on the broker input. Be it: f, d, l or k
...