Notifications
Clear all

Re: Electro Steel Guitar

20 Posts
3 Users
0 Reactions
303 Views
(@jdebruyn)
Member
Joined: 2 months ago
Posts: 11
 

@tfmccarthy I modified the code to the above as you suggested, but nothing happened, motors do not run. Below what I change it to. 

void OnDataRecv(const esp_now_recv_info_t *info, const uint8_t *incomingData, int len) {
    const uint8_t *mac = info->src_addr; // Extract sender's MAC address
        if (new_message) {
       return;
        
  if (memcmp(mac, sender2_MAC, 6) == 0) {

        memcpy(&myData1, incomingData, sizeof(myData1));
        Serial.println("Data received from Sender 2 (myData1)");
        Serial.print("StringDOWN: "); Serial.println(myData1.Value_StringDOWN);
        Serial.print("StringUP: "); Serial.println(myData1.Value_StringUP);
        Serial.print("String1: "); Serial.println(myData1.Value_String1);

    }
      
        new_message = true;
}
}

void loop() {
      // MotorA runs forward first message
          if (!new_message) {
        return;
          }
    if (myData1.Value_String1 == 1 && myData1.Value_StringUP == 1) {
    Serial.println("MotorA Running Forward");
  for (int pwm = 0; pwm <= 255; pwm++) { // ramp up forward.
    motorA.motorGo(pwm);
            motorRunningForward = true; 
            motorRunningBackward = false;
                new_message = false;    // allow new message
}
    delay(10);
      }

   
ReplyQuote
TFMcCarthy
(@tfmccarthy)
Member
Joined: 9 months ago
Posts: 331
Topic starter  

@jdebruyn 

This doesn't match the changes I gave. I don't see the declaration of the variable new message, which is important. Let's start with OnDataRecv. This is what you started with,

void OnDataRecv(const esp_now_recv_info_t* info, const uint8_t* incomingData, int len) {
    const uint8_t* mac = info->src_addr; // Extract sender's MAC address
    if (memcmp(mac, sender2_MAC, 6) == 0) {
        memcpy(&myData1, incomingData, sizeof(myData1));
        Serial.println("Data received from Sender 2 (myData1)");
        Serial.print("StringDOWN: "); Serial.println(myData1.Value_StringDOWN);
        Serial.print("StringUP: "); Serial.println(myData1.Value_StringUP);
        Serial.print("String1: "); Serial.println(myData1.Value_String1);
    }
}

I said to make this change:

bool new_message{false};

void OnDataRecv( ... ) {
    // ignore new messages until current message
    // is processed
    if (new_message) {
        return;
    }

    //... get new message ...

    new_message = true;
}

So you should have produced

bool new_message{false};

void OnDataRecv(const esp_now_recv_info_t* info, const uint8_t* incomingData, int len) {
    // ignore new messages until current message
    // is processed
    if (new_message) {
        return;
    }

    const uint8_t* mac = info->src_addr; // Extract sender's MAC address
    if (memcmp(mac, sender2_MAC, 6) == 0) {
        memcpy(&myData1, incomingData, sizeof(myData1));
        Serial.println("Data received from Sender 2 (myData1)");
        Serial.print("StringDOWN: "); Serial.println(myData1.Value_StringDOWN);
        Serial.print("StringUP: "); Serial.println(myData1.Value_StringUP);
        Serial.print("String1: "); Serial.println(myData1.Value_String1);
    }

    new_message = true;
}

Similarly, the loop function starts with

void loop() {
    // MotorA runs forward first message
    if (myData1.Value_String1 == 1 && myData1.Value_StringUP == 1) {
        Serial.println("MotorA Running Forward");
        for (int pwm = 0; pwm <= 255; pwm++) { // ramp up forward.
            motorA.motorGo(pwm);
            motorRunningForward = true;
            motorRunningBackward = false;
        }
    }

    delay(10);
}

I gave this change

void loop()
{
    // if no new message, do nothing
    if (!new_message) {
        return;
    }

    // ... process message ...

    new_message = false;    // allow new message
}

This should produce

void loop() {
    // if no new message, do nothing
    if (!new_message) {
        return;
    }

    // MotorA runs forward first message
    if (myData1.Value_String1 == 1 && myData1.Value_StringUP == 1) {
        Serial.println("MotorA Running Forward");
        for (int pwm = 0; pwm <= 255; pwm++) { // ramp up forward.
            motorA.motorGo(pwm);
            motorRunningForward = true;
            motorRunningBackward = false;
        }
    }

    delay(10);

    new_message = false;    // allow new message
}

The one who has the most fun, wins!


   
ReplyQuote
Will
 Will
(@will)
Member
Joined: 4 years ago
Posts: 2601
 

Posted by: @jdebruyn

@tfmccarthy I modified the code to the above as you suggested, but nothing happened, motors do not run. Below what I change it to. 

Take a closer look at what you're telling it to do in OnDataRecv ... you start off with

 if (new_message) {
    return;

So if new_message is true then you return immediately without extracting the newly received message and return with new_message still being true.

However, if new_message is false, then the body of the if statement is not executed, so you STILL don't exact the message sent and don't reset the value of new_message.

So your code cycles endlessly without ever extracting the message data or changing new_message's value.

Try removing the outer if statement as in

void OnDataRecv(const esp_now_recv_info_t *info, const uint8_t *incomingData, int len) {
  const uint8_t *mac = info->src_addr;  // Extract sender's MAC address

  if (memcmp(mac, sender2_MAC, 6) == 0) {

    memcpy(&myData1, incomingData, sizeof(myData1));
    Serial.println("Data received from Sender 2 (myData1)");
    Serial.print("StringDOWN: ");
    Serial.println(myData1.Value_StringDOWN);
    Serial.print("StringUP: ");
    Serial.println(myData1.Value_StringUP);
    Serial.print("String1: ");
    Serial.println(myData1.Value_String1);

    new_message = true;
  }
}

 

 

Anything seems possible when you don't know what you're talking about.


   
ReplyQuote
TFMcCarthy
(@tfmccarthy)
Member
Joined: 9 months ago
Posts: 331
Topic starter  

Posted by: @will

Try removing the outer if statement as in

For Wi-Fi, is onDataRecv called asynchronously, i.e., during the loop function?

The one who has the most fun, wins!


   
ReplyQuote
(@jdebruyn)
Member
Joined: 2 months ago
Posts: 11
 

Thanks for your assistance, I'm learning as I go.


   
ReplyQuote
Page 2 / 2