🤖Have you ever tried Chat.M5Stack.com before asking??😎
    M5Stack Community
    • Categories
    • Recent
    • Tags
    • Popular
    • Users
    • Groups
    • Search
    • Register
    • Login

    ESP-NOW and two M5Stick C

    General
    2
    3
    6.1k
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • M
      mario
      last edited by

      I am experimenting with ESP-NOW and two M5Stick Cs.

      The application is designed for two people living in the same house. The two people are often in their own rooms studying. And they scare each other to death when they enter the room to discuss something.

      The application is designed so that when one of the two people goes to visit the other, clicks on button A, a 5-second timer starts. If the other person does not want the visit because they are in a moment of concentration, they press the A button on their device and a message appears on the device of the person who sent the request that it is not a good time with a red circle. If he/she does nothing, a green circle shows that the invitation to the meeting is agreed by both.

      I have been able to get it, except for the part where the other person clicks the A button, it does nothing. It continues the counter and does not show the red circle.

      I don't know if it's the nature of the ESP-NOW communication or if it's because something is wrong with my programming.

      0_1612696956071_a.png
      0_1612696967603_b.png

      from m5ui import *
      from uiflow import *
      import espnow
      import wifiCfg
      import time
      
      setScreenColor(0x111111)
      
      
      status_str = None
      my_mac_addr = None
      a = None
      d = None
      f = None
      status = None
      mynameis = None
      i = None
      
      wifiCfg.wlan_ap.active(True)
      wifiCfg.wlan_sta.active(True)
      espnow.init()
      circle0 = M5Circle(40, 115, 32, 0xe60909, 0xFFFFFF)
      status_label = M5TextBox(74, 6, "status_label", lcd.FONT_Default, 0xFFFFFF, rotate=90)
      count_label = M5TextBox(17, 83, "5", lcd.FONT_DejaVu72, 0xFFFFFF, rotate=0)
      console_log = M5TextBox(12, 11, "console_log", lcd.FONT_DefaultSmall, 0xa9a4e6, rotate=90)
      mynameis_label = M5TextBox(52, 11, "My name is:", lcd.FONT_DefaultSmall, 0xFFFFFF, rotate=90)
      
      
      def longblink():
        global status_str, my_mac_addr, f, a, d, status, mynameis, i
        M5Led.on()
        wait_ms(500)
        M5Led.off()
      
      def hello_from_the_other():
        global status_str, my_mac_addr, f, a, d, status, mynameis, i
        count_label.hide()
        shortblink()
        circle0.show()
        for i in range(6):
          circle0.setBgColor(0xffffff)
          circle0.setSize((i * 6 + 8))
          wait(1)
          if status != 'hello':
            circle0.setBgColor(0xff0000)
            longblink()
            break
          if i == 5:
            circle0.show()
            circle0.setBgColor(0x33cc00)
            shortblink()
        restart()
      
      def inicialize():
        global status_str, my_mac_addr, f, a, d, status, mynameis, i
        mynameis_label.setText(str(mynameis))
        count_label.hide()
        circle0.hide()
        status = 'waiting'
        status_label.setText(str(status))
      
      def hello():
        global status_str, my_mac_addr, f, a, d, status, mynameis, i
        count_label.show()
        shortblink()
        for i in range(5, -1, -1):
          count_label.setText(str(i))
          wait(1)
          if status != 'hello':
            circle0.show()
            circle0.setBgColor(0xff0000)
            longblink()
            break
          if i == 0:
            circle0.show()
            circle0.setBgColor(0x33cc00)
        restart()
      
      def shortblink():
        global status_str, my_mac_addr, f, a, d, status, mynameis, i
        M5Led.on()
        wait_ms(50)
        M5Led.off()
      
      def restart():
        global status_str, my_mac_addr, f, a, d, status, mynameis, i
        wait(6)
        inicialize()
      
      def change_status(status_str):
        global my_mac_addr, f, a, d, status, mynameis, i
        status = status_str
        status_label.setText(str(status))
        espnow.send(id=1, data=str(status))
      
      
      
      my_mac_addr = str((espnow.get_mac_addr()))
      if my_mac_addr==:
        mynameis = 'Alice'
        espnow.add_peer('24:a1:60:45:6a:3d', id=1)
      elif my_mac_addr==my_mac_addr:
        mynameis = 'Bob'
        espnow.add_peer('d8:a0:1d:56:b9:59', id=1)
      else:
        mynameis = "I don't know"
      inicialize()
      
      def buttonA_wasPressed():
        global my_mac_addr, f, a, d, status, mynameis, status_str, i
        if status=='waiting':
          change_status('hello')
          hello()
        elif status=='hello':
          change_status('right_now_no_thanks')
        else:
          pass
        pass
      btnA.wasPressed(buttonA_wasPressed)
      
      
      def send_cb(flag):
        global my_mac_addr,f,a,d,status,mynameis,status_str,i
        f = flag
        if f:
          shortblink()
        else:
          status = 'not connected'
          status_label.setText(str(status))
          longblink()
          shortblink()
          longblink()
          shortblink()
      
        pass
      espnow.send_cb(send_cb)
      
      
      
      def recv_cb(_):
        global my_mac_addr,f,a,d,status,mynameis,status_str,i
        a, _, d = espnow.recv_data(encoder='str')
        shortblink()
        console_log.setText(str(d))
        if d=='hello':
          status = 'hello'
          status_label.setText(str(status))
          hello_from_the_other()
        elif d=='right_now_no_thanks':
          status = 'right_now_no_thanks'
          status_label.setText(str(status))
        else:
          pass
      
        pass
      espnow.recv_cb(recv_cb)
      

      esp_now_busy.m5f file in MEGA

      world101W 1 Reply Last reply Reply Quote 0
      • world101W
        world101 @mario
        last edited by

        @mario
        I tried your flow and I see what you are saying. I think your issue is that your program has loops containing waits, which is causing blocking in the code. So when the button A is pressed to respond to the request, it is not received by the button callback. My suggestion is to use some timers to minimize the blocking.

        1 Reply Last reply Reply Quote 1
        • M
          mario
          last edited by mario

          Well, I hadn't thought of that! It reminded me of my MSX programming days. :D

          I'll try your proposal and I'll let you know.

          Thank you very much @world101 for your reply.

          1 Reply Last reply Reply Quote 0
          • First post
            Last post