OpenHarmony开源社区
直播中

efans_87896504

3年用户 248经验值
擅长:嵌入式技术,控制/MCU
私信 关注

【小河狸创客格物开发板试用体验】小河狸格物开发板体验之旅3

本帖最后由 efans_87896504 于 2022-11-16 13:07 编辑

      小车可以可以转向了,但还缺点什么,毕竟总不能随时跟着后面操作按键吧,要是能够远程控制就好了。于是,我和小朋友决定尝试远程控制。怎么控制呢,TCP?MQTT?最后还是选择简单点的,使用MQTT来控制。这个对于小朋友来说,就复杂点了,只能跟他讲点原理,我来操作了。      1、首先,需要一个MQTT服务器,这个原先做练习时搭建过一个,直接拿来用就可以了。当然也可以用小河狸创客自己的MQTT服务器。
      2、接着就需要完成小车的控制程序,连接上MQTT服务器,然后订阅下发命令主题,根据不同命令进行具体操作。
  1. # generated by GewuBit
  2. import gewu
  3. from wifi import *
  4. import ujson
  5. from umqtt import MQTTClient

  6. iot_wifi = gewu_wifi()
  7. ssid = str('HUAWEI-GEWU')
  8. pwd =  str('123456')
  9. client_id = 'mygewuiotclient'
  10. mserver = '192.168.2.37'
  11. port=1883
  12. topic_ctl = b'public/gewuiot/cmd'
  13. topic_sta = b'public/gewuiot/sta'
  14. def sub_callback(topic, msg):
  15.   cmd = ujson.loads(msg)
  16.   if cmd['target'] == 'transmission':
  17.     if cmd['option'] == 'forward':
  18.       gewu.servo_p4.set_dir_speed(-1, 30)
  19.       gewu.display.fill(OLED.BLACK)
  20.       gewu.display.text_ch(b'forward', 0, 0, 16)
  21.       gewu.display.show()
  22.     elif cmd['option'] == 'backward':
  23.       gewu.servo_p4.set_dir_speed(1, 30)
  24.       gewu.display.fill(OLED.BLACK)
  25.       gewu.display.text_ch(b'backward', 0, 0, 16)
  26.       gewu.display.show()
  27.     elif cmd['option'] == 'stop':
  28.       gewu.servo_p4.release()
  29.       gewu.display.fill(OLED.BLACK)
  30.       gewu.display.text_ch(b'stop', 0, 0, 16)
  31.       gewu.display.show()
  32.     elif cmd['option'] == 'start':
  33.       gewu.servo_p4.set_speed(30)
  34.       gewu.display.fill(OLED.BLACK)
  35.       gewu.display.text_ch(b'start', 0, 0, 16)
  36.       gewu.display.show()
  37.     else:
  38.       print('bad command')
  39.   elif cmd['target'] == 'steering':
  40.     if cmd['option'] == 'left':
  41.       gewu.servo_p3.set_angle(65)
  42.       gewu.display.fill(OLED.BLACK)
  43.       gewu.display.text_ch(b'turn left', 0, 50, 16)
  44.       gewu.display.show()
  45.     elif cmd['option'] == 'right':
  46.       gewu.servo_p3.set_angle(115)
  47.       gewu.display.fill(OLED.BLACK)
  48.       gewu.display.text_ch(b'turn right', 0, 50, 16)
  49.       gewu.display.show()
  50.     elif cmd['option'] == 'straighten':
  51.       gewu.servo_p3.set_angle(90)
  52.       gewu.display.fill(OLED.BLACK)
  53.       gewu.display.text_ch(b'straighten', 0, 50, 16)
  54.       gewu.display.show()
  55.     else:
  56.       gewu.display.fill(OLED.BLACK)
  57.       gewu.display.text_ch(b'bad command', 0, 0, 16)
  58.       gewu.display.show()
  59. def on_start():
  60.   gewu.display.fill(OLED.BLACK)
  61.   gewu.display.text(str('Gewu:bit'), 0, 0, 6)
  62.   gewu.display.show()
  63.   iot_wifi.connectWiFi(ssid, pwd)
  64.   while not iot_wifi.isconnected():
  65.     pass
  66.   gewu.display.fill(OLED.BLACK)
  67.   gewu.display.text(str('Wifi connected!'), 0, 0, 6)
  68.   gewu.display.show()
  69.   print(client_id)
  70.   client = MQTTClient(client_id,mserver,port)
  71.   client.set_callback(sub_callback)
  72.   client.connect()
  73.   client.subscribe(topic_ctl)
  74.   client.publish(topic_sta, ujson.dumps({"sta": "Device online"}), retain=False)
  75.   print("Connected to %s, subscribed to %s topic" % (mserver, topic_ctl))
  76.   
  77.   while True:
  78.     client.check_msg()
  79.     time.sleep(1)
  80.     yield

  81. func_start = on_start()


  82. def repeat():
  83.   next(func_start)


  84. while True:
  85.   repeat()
  86.   gewu.sleep_ms(1)

     3、小车程序写完了,就可以使用MQTT客户端工具来向控制命令主题发布控制命令了。不过小朋友不同意了,你这个太不友好了,还要每次敲命令,不能搞个应用,直接点点按钮么?好吧,那就用微信小程序实现个操作界面吧。








     界面效果如下:


      好了,到此,就完成MQTT控制格物小车了,看看效果:






微信小程序控制格物小车

更多回帖

发帖
×
20
完善资料,
赚取积分