сравнить полученный символ от подчиненного устройства записи к главному читателю с помощью I2C

i2c

Я пытаюсь отправить данные от подчиненного устройства (записывающего устройства) к ведущему (считывающему устройству), а затем сравнить их с объявленным «char p[]», чтобы включить свет, но почему-то не могу заставить это работать.

////главный читатель


    #include <Wire.h>

int LED = 13;
char p[] = "YES..."; 

void setup() {
  pinMode(LED, OUTPUT);
  Wire.begin();        // подключаемся к шине i2c (адрес для ведущего необязателен)
  Serial.begin(9600);  // запускаем последовательный порт для вывода

}

void loop() {
  Wire.requestFrom(8, 6);    // запрос 6 байт от ведомого устройства №8



  while (Wire.available()) { // подчиненное устройство может отправить меньше, чем запрошено
    char c= Wire.read(); // получаем байт как символ



  Serial.print(c);         // печатаем символ


  if(c == p){

  digitalWrite(LED, HIGH);   // включаем светодиод (HIGH - уровень напряжения)

    }else{ 

  digitalWrite(LED, LOW);   // включаем светодиод (HIGH - уровень напряжения)

          }

  }

  delay(1500);

Раб

////////////// Подчиненный ///////////////////////

    #include <Wire.h>


const int pingPin = 8; // Триггерный контакт ультразвукового датчика
const int echoPin = 9; // Эхо-контакт ультразвукового датчика



void setup() {
  Serial.begin(9600); // Запуск последовательного терминала
  Wire.begin(8);                // подключаемся к шине i2c по адресу №8

}

void loop() {
   long duration, inches, cm;
   pinMode(pingPin, OUTPUT);
   digitalWrite(pingPin, LOW);
   delayMicroseconds(2);
   digitalWrite(pingPin, HIGH);
   delayMicroseconds(10);
   digitalWrite(pingPin, LOW);
   pinMode(echoPin, INPUT);
   duration = pulseIn(echoPin, HIGH);
   inches = microsecondsToInches(duration);
   cm = microsecondsToCentimeters(duration);
   Serial.print(inches);
   Serial.print("in, ");
   Serial.print(cm);
   Serial.print("cm");
   Serial.println();
   delay(1500);

if( inches <= 4){

  Wire.onRequest(requestEvent); // регистрируем событие
   Serial.print("Obstacle detected");
   Serial.println();
  }
  else
  {

  Wire.onRequest(requestEvent1); // регистрируем событие
   Serial.print("Nothing Detected");
   Serial.println();

    }


}

// функция, которая выполняется всякий раз, когда мастер запрашивает данные
// эта функция регистрируется как событие, см. setup()
void requestEvent() {

  Wire.write("YES..."); // отвечаем сообщением размером 6 байт
  // как и ожидал мастер
}
void requestEvent1() {

  Wire.write("NO...."); // отвечаем сообщением размером 6 байт
  // как и ожидал мастер
}

long microsecondsToInches(long microseconds) {
   return microseconds / 74 / 2;
}

long microsecondsToCentimeters(long microseconds) {
   return microseconds / 29 / 2;
}

, 👍0


1 ответ


1
  1. Улучшите отступы.
  2. Если вы хотите сравнить две строки, используйте для этого функцию strcmp.
  3. В вашей основной части в функции voidloop() остались скобки, исправьте их.
  4. В I2C вы получаете один байт за раз. Вы должны получать данные до последнего полученного байта.
  5. В вашем сообщении должна быть какая-то идентификация, то есть вы отправляете его от подчиненного устройства к ведущему, указывая, что это последний символ. Это поможет вам выйти из цикла приема данных на стороне Master.
,