Ведомый для отправки данных после получения команды с использованием I2C

Я хочу, чтобы мой ведомый Arduino отправлял сигнал ведущему устройству после выполнения команды. Но ведомый Arduino не приступает к отправке сигнала после выполнения команды. Что не так с моим кодом?

Подчиненный

void receiveEvent(int bytes) {
  dir = Wire.read();    // направление
  dis = Wire.read();    // расстояние
  spe = Wire.read();    // скорость
  eStop = Wire.read();    // 1 или 0
  Serial.println(dir);
  Serial.println(dis);
  Serial.println(spe);
  mov = true;
}
void loop() {
    Wire.onReceive(receiveEvent);
  if (dir == 1 && mov == true && eStop == false){
      motor.Distance(dis);
      motor.Speed(spe);
      motor.Forward();
       Wire.onRequest(requestEvent); 
      mov = false;
      fin = true;
    }
  if (dir == 2 && mov == true && eStop == false){
    motor.Distance(dis);
    motor.Speed(spe);
    motor.Reverse();
      Wire.onRequest(requestEvent);
    mov = false;
    fin = true; 
  }

  else{
    motor.Stop();
  }
}
void requestEvent(){
    Wire.write(1);
    fin = false;
    Serial.println("sent"); 
}

Мастер


#include <Wire.h>

const byte interruptPin = 2;
byte dir = 0;
byte dis;
byte spe;
bool upd;

bool state= false;

void setup() {

  Wire.begin(); 
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), emergencyStop, CHANGE);
  Serial.begin(9600);

}
void loop() {
       if( state == false ){
       dir = 1;
       dis = 30;
       spe = 2;
       Wire.beginTransmission(9); // передать на устройство №9
       Wire.write(dir);
       Wire.write(dis);
       Wire.write(spe);
       Wire.write(0);       
       Wire.endTransmission();    // прекращаем передачу
       state = true;
       }
       if (state == true){
        if(Wire.available() > 0){
       Wire.requestFrom(9,2);   //6 байт от ведомого 9
          bool upd = Wire.read();
          Serial.println(upd);
        }
      }             
}      
void emergencyStop(){ // не работает
  Wire.beginTransmission(9); // передать на устройство №9
       Wire.write(0);
       Wire.write(0);
       Wire.write(0);
       Wire.write(1);       
       Wire.endTransmission();    // прекращаем передачу

}

, 👍1

Обсуждение

Пожалуйста, отредактируйте свой вопрос, чтобы включить полный скетч, @chrisl

Обычно Wire.onReceive(callbackFunction) вызывается один раз в setup()., @Mikael Patel

Последовательная печать в функции обратного вызова может вызвать проблемы., @Mikael Patel


1 ответ


1

нашел свое решение для этого. хотя еще не проверено, но я удалил серийную печать и переместил Wire.onRequest за пределы цикла if. и использует ledPin для проверок

void loop() {

        Wire.onReceive(receiveEvent);
        Wire.onRequest(requestEvent);
  if (dir == 1 && mov == true && eStop == false){
      motor.Distance(dis);
      motor.Speed(spe);
      motor.Forward();
      mov = false;
      fin = true;
    }
  if (dir == 2 && mov == true && eStop == false){
    motor.Distance(dis);
    motor.Speed(spe);
    motor.Reverse();
    mov = false;
    fin = true; 
  }

  else{
    motor.Stop();
  }
}

void requestEvent(){
    if ( fin == true){
      Wire.write(1);
     fin = false;
    digitalWrite(ledPin, HIGH);
    }

}
,

Да, вы не должны выполнять серийную печать внутри процедуры обслуживания прерывания., @Nick Gammon