I2C wire.h отправляет 2 переменные

Я пытаюсь отправить 2 переменные с помощью wire.h. Я пробовал с этим кодом:

ГЛАВНЫЙ ПРИЕМНИК:

#include <Wire.h> // включаем библиотеку
#include <LiquidCrystal_I2C.h>
#include "RTClib.h"

LiquidCrystal_I2C lcd(0x3E, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
RTC_DS1307 RTC; // орология

static int anno;
static int giorno;
static int mese;
static int ora;
static int secondo;
static int oldSecondo;
static int minuto;
static int oldMinuto;
static int annoGrezzo;
char t[10] = {};
char v[10] = {};

void setup() {
  Wire.begin(); // присоединяемся к шине i2c с адресом #4
  lcd.begin(16, 2);
  Serial.begin(9600); // запускаем сериал для вывода
  //-----------орологио-----------
  RTC.begin();
  // Проверяем, отсчитывает ли RTC время. Если это так, загрузите время с вашего компьютера.
  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // Это будет отражать время компиляции вашего скетча
    RTC.adjust(DateTime(__DATE__, __TIME__));
  }
  //-----------тонкая орология-----------
}

void loop() {
  //------------------------------------------------ ------------
  // си штампано и данные рисовути и рикомпости
  //------------------------------------------------ ------------
  Wire.requestFrom(8, 6);
  int i = 0;
  while (Wire.available()) {
    Serial.println(i);
    t[i] = Wire.read();
    // каждый пришедший символ упорядочивает в пустом массиве "t"
    i = i + 1;
  }
  Serial.println(t);
  DateTime now = RTC.now();
  annoGrezzo = now.year();
  anno = (annoGrezzo % 100);
  mese = now.month();
  giorno = now.day();
  ora = now.hour();
  minuto = now.minute();
  lcd.setCursor(0, 0);
  lcd.print(t);
  lcd.setCursor(5,0);
  lcd.print(v);
  lcd.setCursor(0, 1);
  lcd.print(giorno);
  lcd.print(" ");
  lcd.print(mese);
  lcd.print(" ");
  lcd.print(anno);
  lcd.print("  ");
  lcd.print(ora);
  lcd.print(":");
  lcd.print(minuto);
  delay (1000);
  lcd.clear();
}

ВЕДОМЫЙ ОТПРАВИТЕЛЬ

#include <Wire.h> // si include la libreria
//------------------------------------------------ ---------
char t[10];
char v[10];

void setup() {
  Wire.begin(8);
  // подключение к шине i2c (адрес необязателен для мастера)
  Wire.onRequest(requestEvent);
}

void loop() {
  int mioInt = random(30000);
  int mioInt2 = 1234;
  dtostrf(mioInt, 3, 2, t);
  // преобразует число с плавающей запятой или целое число в строку. (floatVar, minStringWidthIncDecimalPoint, numVarsAfterDecimal, пустой массив);
  dtostrf(mioInt2, 3, 2, v);
  //------------------------------------------------ ------
  delay (500);
}

void requestEvent() {
  Wire.write(t);
  Wire.write(v);
}

Мне не удается получить v на главный приемник. Спасибо за помощь.

, 👍1

Обсуждение

У меня нет под рукой библиотеки, но я думаю, что чтение требует, чтобы вы запросили определенное количество байтов с адреса I2C. Вы, кажется, не делаете этого. Предложите вам более внимательно изучить работающую библиотеку I2C и посмотреть, как они это делают., @Code Gorilla

Вы запрашиваете 6 байт вместо 20, если я правильно понимаю, и в Мастере нет кода для записи в v., @Mark Smith


1 ответ


1

I2C — это 8-битная шина данных, где адрес может быть 7-битным или 10-битным, вы не можете отправлять более 8 бит за раз, если вы хотите отправить данные более 8 бит, вы будете отправлять их как это, например, позволяет вам отправлять 16-битные данные, затем вы отправляете сначала 8-битный младший бит, а затем 8-битный старший бит или наоборот в соответствии с вашей конфигурацией.

Во-вторых, я заметил ваш код и заметил много ошибок, главная из которых заключается в том, что вы не следовали правилам протокола I2C в своем коде. Здесь я прикрепил ссылку на образец программы arduino i2c slave и master. Пройди его и получишь ответ.

,