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

У меня возникли проблемы с попыткой заставить мои два Arduino Unos общаться друг с другом по i2c. Я пытаюсь получить главный запрос для аналоговых значений от подчиненного устройства, отправив запрос ведомому устройству на одно из шести значений ADC.

Мастер-код

#include <Wire.h>

void setup() 
{
  Wire.begin();
  Serial.begin(115200);
}


void loop() 
{
  Wire.beginTransmission(0x22); // Start communication with Arduino slave at address 0x22

  for(byte i=0;i<4;i++)
  {
    Wire.write(i);              // Request data from analog pin 'i'
    delay(5);                   // Give the slave a moment to sample ADC and respond
    while(Wire.available())
    {
      byte c = Wire.read();
      Serial.println(c);        // Print returned value to serial window
    }
  }

  Wire.endTransmission();       // End communication with Arduino slave
  delay(500); 
}

Ведомый код

#include <Wire.h>

void setup() {
  Wire.begin(0x22);
  Wire.onReceive(receivedHandler);
}

void loop() {
}

void receivedHandler() {
  byte data = Wire.read();
  byte analogValue;

  if(data == 0) analogValue = analogRead(A0)>>2;
  else if(data == 1) analogValue = analogRead(A1)>>2;
  else if(data == 2) analogValue = analogRead(A2)>>2;
  else if(data == 3) analogValue = analogRead(A3)>>2;
  else analogValue = 0;

  Wire.write(analogValue);
}

Я вижу, что данные принимаются ведомым, но ведомый не отправляет никаких данных, поэтому я немного смущен, как отправить данные обратно хозяину. Для мастера есть «Wire.requestFrom (адрес, количество байтов)» для запроса определенного количества байтов и для ведомого «Wire.onRequest ()», который вызовет функцию обработчика, чтобы отправить обратно количество запрошенных байтов мастер, но для моего приложения я не смогу вернуть более 1 байт за раз.

i2c
3 голоса | спросил awwende 21 MaramTue, 21 Mar 2017 00:03:01 +03002017-03-21T00:03:01+03:0012 2017, 00:03:01

1 ответ


0

Двунаправленная связь в I2C - это двухэтапная вещь.

Сначала вы должны сообщить подчиненному устройству, которое вы хотите прочитать (или зарегистрировать). Затем вы должны прочитать его.

Типичная основная последовательность:

Wire.beginTransmission(0x22);
Wire.write(1);
Wire.endTransmission();
Wire.requestFrom(0x22, 2);
byte b1 = Wire.read();
byte b2 = Wire.read();

И, конечно, ваш подчиненный должен ответить на write() и помнить, какой вывод выбран, затем отдельно реагировать на ---- +: = 2 =: + ---- и вернуть данные, соответствующие выходу, который был выбран ранее.

ответил Majenko 21 MaramTue, 21 Mar 2017 00:19:05 +03002017-03-21T00:19:05+03:0012 2017, 00:19:05

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132